You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by am...@apache.org on 2021/05/04 07:49:25 UTC

[superset] branch 1.2 updated (1a41c58 -> 0fd1da8)

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

amitmiran pushed a change to branch 1.2
in repository https://gitbox.apache.org/repos/asf/superset.git.


    from 1a41c58  fix(native-filters): fix filter scope error (#14426)
     new 3226160  test(maximize-chart): Add tests to maximize chart action (#14371)
     new 9d8eb3b  refactor(native-filters): allow cascading only for filter_select (#14441)
     new ec0bac1  perf(native-filters): avoid unnecessary reloading of charts (#14408)
     new 79c66fc  add migration (#14446)
     new 0fd1da8  fix(viz): bump superset-ui to fix bugs in table and graph chart (#14438)

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 superset-frontend/package-lock.json                | 636 ++++++++++-----------
 superset-frontend/package.json                     |  57 +-
 .../spec/fixtures/mockChartQueries.js              |   2 +-
 .../spec/fixtures/mockNativeFilters.ts             |  20 +-
 .../dashboard/components/Dashboard_spec.jsx        |   2 +-
 .../dashboard/fixtures/mockNativeFilters.ts        |   7 +-
 .../util/getFormDataWithExtraFilters_spec.ts       |   1 -
 .../spec/javascripts/filters/utils_spec.ts         |  12 +-
 superset-frontend/src/chart/Chart.jsx              |   7 -
 superset-frontend/src/chart/ChartContainer.jsx     |   7 +-
 .../src/dashboard/actions/nativeFilters.ts         |  17 +-
 .../src/dashboard/components/Dashboard.jsx         |  32 +-
 .../components/SliceHeaderControls/index.jsx       |   9 +
 .../components/gridComponents/ChartHolder.jsx      |   4 +-
 .../components/gridComponents/ChartHolder.test.tsx |  88 +++
 .../CascadeFilters/CascadePopover/index.tsx        |   3 +-
 .../FilterBar/CascadeFilters/types.ts              |   5 +-
 .../nativeFilters/FilterBar/FilterBar.test.tsx     |  25 +-
 .../FilterBar/FilterControls/state.ts              |   4 +-
 .../FilterBar/FilterControls/types.ts              |   4 +-
 .../FilterBar/FilterSets/EditSection.tsx           |   4 +-
 .../nativeFilters/FilterBar/FilterSets/index.tsx   |  26 +-
 .../components/nativeFilters/FilterBar/index.tsx   |  61 +-
 .../components/nativeFilters/FilterBar/state.ts    |  70 +--
 .../components/nativeFilters/FilterBar/utils.ts    |   7 +
 .../FiltersConfigForm/ControlItems.tsx             |   2 +-
 .../FiltersConfigForm/FiltersConfigForm.tsx        |  57 +-
 .../FiltersConfigModal/FiltersConfigModal.tsx      |   4 +
 .../nativeFilters/FiltersConfigModal/types.ts      |   3 +-
 .../nativeFilters/FiltersConfigModal/utils.ts      |   3 +-
 .../dashboard/components/nativeFilters/types.ts    |   3 +-
 .../dashboard/components/nativeFilters/utils.ts    |   4 +-
 .../src/dashboard/containers/Dashboard.ts          |   7 +-
 .../src/dashboard/reducers/nativeFilters.ts        |  12 +-
 superset-frontend/src/dashboard/reducers/types.ts  |   1 -
 superset-frontend/src/dashboard/types.ts           |   4 +-
 .../dashboard/util/activeAllDashboardFilters.ts    |  12 +-
 superset-frontend/src/dataMask/actions.ts          |   9 +-
 superset-frontend/src/dataMask/reducer.ts          |  80 ++-
 superset-frontend/src/dataMask/types.ts            |   2 +-
 superset-frontend/src/filters/utils.ts             |  27 +-
 superset-frontend/webpack.config.js                |  10 +-
 ...ed7ec95_migrate_native_filters_to_new_schema.py | 163 ++++++
 tests/migrations/f1410ed7ec95_tests.py             |  89 +++
 44 files changed, 992 insertions(+), 610 deletions(-)
 create mode 100644 superset-frontend/src/dashboard/components/gridComponents/ChartHolder.test.tsx
 create mode 100644 superset/migrations/versions/f1410ed7ec95_migrate_native_filters_to_new_schema.py
 create mode 100644 tests/migrations/f1410ed7ec95_tests.py

[superset] 04/05: add migration (#14446)

Posted by am...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

amitmiran pushed a commit to branch 1.2
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 79c66fc3070ce9b1575bdffbce2a815f84a129bb
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Mon May 3 15:32:48 2021 +0300

    add migration (#14446)
    
    (cherry picked from commit 2f9efb2e23cefb8f087e473a10ccb93a90a6311c)
---
 ...ed7ec95_migrate_native_filters_to_new_schema.py | 163 +++++++++++++++++++++
 tests/migrations/f1410ed7ec95_tests.py             |  89 +++++++++++
 2 files changed, 252 insertions(+)

diff --git a/superset/migrations/versions/f1410ed7ec95_migrate_native_filters_to_new_schema.py b/superset/migrations/versions/f1410ed7ec95_migrate_native_filters_to_new_schema.py
new file mode 100644
index 0000000..630a7b1
--- /dev/null
+++ b/superset/migrations/versions/f1410ed7ec95_migrate_native_filters_to_new_schema.py
@@ -0,0 +1,163 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+"""migrate native filters to new schema
+
+Revision ID: f1410ed7ec95
+Revises: d416d0d715cc
+Create Date: 2021-04-29 15:32:21.939018
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = "f1410ed7ec95"
+down_revision = "d416d0d715cc"
+
+import json
+from typing import Any, Dict, Iterable, Tuple
+
+from alembic import op
+from sqlalchemy import Column, Integer, Text
+from sqlalchemy.ext.declarative import declarative_base
+
+from superset import db
+
+Base = declarative_base()
+
+
+class Dashboard(Base):
+    """Declarative class to do query in upgrade"""
+
+    __tablename__ = "dashboards"
+    id = Column(Integer, primary_key=True)
+    json_metadata = Column(Text)
+
+
+def upgrade_filters(native_filters: Iterable[Dict[str, Any]]) -> int:
+    """
+    Move `defaultValue` into `defaultDataMask.filterState`
+    """
+    changed_filters = 0
+    for native_filter in native_filters:
+        default_value = native_filter.pop("defaultValue", None)
+        if default_value is not None:
+            changed_filters += 1
+            default_data_mask = {}
+            default_data_mask["filterState"] = {"value": default_value}
+            native_filter["defaultDataMask"] = default_data_mask
+    return changed_filters
+
+
+def downgrade_filters(native_filters: Iterable[Dict[str, Any]]) -> int:
+    """
+    Move `defaultDataMask.filterState` into `defaultValue`
+    """
+    changed_filters = 0
+    for native_filter in native_filters:
+        default_data_mask = native_filter.pop("defaultDataMask", {})
+        filter_state = default_data_mask.get("filterState")
+        if filter_state is not None:
+            changed_filters += 1
+            value = filter_state["value"]
+            native_filter["defaultValue"] = value
+    return changed_filters
+
+
+def upgrade_dashboard(dashboard: Dict[str, Any]) -> Tuple[int, int]:
+    changed_filters, changed_filter_sets = 0, 0
+    # upgrade native select filter metadata
+    # upgrade native select filter metadata
+    native_filters = dashboard.get("native_filter_configuration")
+    if native_filters:
+        changed_filters += upgrade_filters(native_filters)
+
+    # upgrade filter sets
+    filter_sets = dashboard.get("filter_sets_configuration", [])
+    for filter_set in filter_sets:
+        if upgrade_filters(filter_set.get("nativeFilters", {}).values()):
+            changed_filter_sets += 1
+    return changed_filters, changed_filter_sets
+
+
+def upgrade():
+    bind = op.get_bind()
+    session = db.Session(bind=bind)
+
+    dashboards = (
+        session.query(Dashboard)
+        .filter(Dashboard.json_metadata.like('%"native_filter_configuration"%'))
+        .all()
+    )
+    changed_filters, changed_filter_sets = 0, 0
+    for dashboard in dashboards:
+        try:
+            json_metadata = json.loads(dashboard.json_metadata)
+            dashboard.json_metadata = json.dumps(json_metadata, sort_keys=True)
+
+            upgrades = upgrade_dashboard(json_metadata)
+            changed_filters += upgrades[0]
+            changed_filter_sets += upgrades[1]
+            dashboard.json_metadata = json.dumps(json_metadata, sort_keys=True)
+        except Exception as e:
+            print(f"Parsing json_metadata for dashboard {dashboard.id} failed.")
+            raise e
+
+    session.commit()
+    session.close()
+    print(f"Upgraded {changed_filters} filters and {changed_filter_sets} filter sets.")
+
+
+def downgrade_dashboard(dashboard: Dict[str, Any]) -> Tuple[int, int]:
+    changed_filters, changed_filter_sets = 0, 0
+    # upgrade native select filter metadata
+    native_filters = dashboard.get("native_filter_configuration")
+    if native_filters:
+        changed_filters += downgrade_filters(native_filters)
+
+    # upgrade filter sets
+    filter_sets = dashboard.get("filter_sets_configuration", [])
+    for filter_set in filter_sets:
+        if downgrade_filters(filter_set.get("nativeFilters", {}).values()):
+            changed_filter_sets += 1
+    return changed_filters, changed_filter_sets
+
+
+def downgrade():
+    bind = op.get_bind()
+    session = db.Session(bind=bind)
+
+    dashboards = (
+        session.query(Dashboard)
+        .filter(Dashboard.json_metadata.like('%"native_filter_configuration"%'))
+        .all()
+    )
+    changed_filters, changed_filter_sets = 0, 0
+    for dashboard in dashboards:
+        try:
+            json_metadata = json.loads(dashboard.json_metadata)
+            downgrades = downgrade_dashboard(json_metadata)
+            changed_filters += downgrades[0]
+            changed_filter_sets += downgrades[1]
+            dashboard.json_metadata = json.dumps(json_metadata, sort_keys=True)
+        except Exception as e:
+            print(f"Parsing json_metadata for dashboard {dashboard.id} failed.")
+            raise e
+
+    session.commit()
+    session.close()
+    print(
+        f"Downgraded {changed_filters} filters and {changed_filter_sets} filter sets."
+    )
diff --git a/tests/migrations/f1410ed7ec95_tests.py b/tests/migrations/f1410ed7ec95_tests.py
new file mode 100644
index 0000000..2b48b56
--- /dev/null
+++ b/tests/migrations/f1410ed7ec95_tests.py
@@ -0,0 +1,89 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from copy import deepcopy
+
+from superset.migrations.versions.f1410ed7ec95_migrate_native_filters_to_new_schema import (
+    downgrade_dashboard,
+    upgrade_dashboard,
+)
+
+dashboard_v1 = {
+    "native_filter_configuration": [
+        {
+            "filterType": "filter_select",
+            "cascadingFilters": True,
+            "defaultValue": ["Albania", "Algeria"],
+        },
+    ],
+    "filter_sets_configuration": [
+        {
+            "nativeFilters": {
+                "FILTER": {
+                    "filterType": "filter_select",
+                    "cascadingFilters": True,
+                    "defaultValue": ["Albania", "Algeria"],
+                },
+            },
+        },
+    ],
+}
+
+
+dashboard_v2 = {
+    "native_filter_configuration": [
+        {
+            "filterType": "filter_select",
+            "cascadingFilters": True,
+            "defaultDataMask": {"filterState": {"value": ["Albania", "Algeria"],},},
+        }
+    ],
+    "filter_sets_configuration": [
+        {
+            "nativeFilters": {
+                "FILTER": {
+                    "filterType": "filter_select",
+                    "cascadingFilters": True,
+                    "defaultDataMask": {
+                        "filterState": {"value": ["Albania", "Algeria"],},
+                    },
+                },
+            },
+        },
+    ],
+}
+
+
+def test_upgrade_dashboard():
+    """
+    ensure that dashboard upgrade operation produces a correct dashboard object
+    """
+    converted_dashboard = deepcopy(dashboard_v1)
+    filters, filter_sets = upgrade_dashboard(converted_dashboard)
+    assert filters == 1
+    assert filter_sets == 1
+    assert dashboard_v2 == converted_dashboard
+
+
+def test_downgrade_dashboard():
+    """
+    ensure that dashboard downgrade operation produces a correct dashboard object
+    """
+    converted_dashboard = deepcopy(dashboard_v2)
+    filters, filter_sets = downgrade_dashboard(converted_dashboard)
+    assert filters == 1
+    assert filter_sets == 1
+    assert dashboard_v1 == converted_dashboard

[superset] 03/05: perf(native-filters): avoid unnecessary reloading of charts (#14408)

Posted by am...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

amitmiran pushed a commit to branch 1.2
in repository https://gitbox.apache.org/repos/asf/superset.git

commit ec0bac1b324856b2c52340fba3532d76bf3b5d52
Author: simcha90 <56...@users.noreply.github.com>
AuthorDate: Mon May 3 14:56:41 2021 +0300

    perf(native-filters): avoid unnecessary reloading of charts (#14408)
    
    * fix:fix get permission function
    
    * refactor: filter default value
    
    * refactor: update default value loading
    
    * refactor: apply defaultValues
    
    * lint: fix lint
    
    * lint: fix lint
    
    * test: fix test
    
    * refactor: use extraFormData for reload charts
    
    * test: fix tests
    
    * test: fix tests
    
    * test: fix tests
    
    (cherry picked from commit bbb1f2d75705957a6239bd6084feadbdacc9d410)
---
 .../spec/fixtures/mockNativeFilters.ts             | 20 ++++--
 .../dashboard/components/Dashboard_spec.jsx        |  2 +-
 .../dashboard/fixtures/mockNativeFilters.ts        |  7 +-
 .../util/getFormDataWithExtraFilters_spec.ts       |  1 -
 .../spec/javascripts/filters/utils_spec.ts         | 12 +---
 superset-frontend/src/chart/Chart.jsx              |  7 --
 superset-frontend/src/chart/ChartContainer.jsx     |  7 +-
 .../src/dashboard/actions/nativeFilters.ts         | 17 +----
 .../src/dashboard/components/Dashboard.jsx         | 32 +++++++--
 .../CascadeFilters/CascadePopover/index.tsx        |  3 +-
 .../FilterBar/CascadeFilters/types.ts              |  5 +-
 .../nativeFilters/FilterBar/FilterBar.test.tsx     | 25 +++----
 .../FilterBar/FilterControls/state.ts              |  4 +-
 .../FilterBar/FilterControls/types.ts              |  4 +-
 .../FilterBar/FilterSets/EditSection.tsx           |  4 +-
 .../nativeFilters/FilterBar/FilterSets/index.tsx   | 26 ++++---
 .../components/nativeFilters/FilterBar/index.tsx   | 61 ++++++++---------
 .../components/nativeFilters/FilterBar/state.ts    | 70 ++++++-------------
 .../components/nativeFilters/FilterBar/utils.ts    |  7 ++
 .../FiltersConfigForm/ControlItems.tsx             |  2 +-
 .../FiltersConfigForm/FiltersConfigForm.tsx        | 20 +++---
 .../nativeFilters/FiltersConfigModal/types.ts      |  3 +-
 .../nativeFilters/FiltersConfigModal/utils.ts      |  3 +-
 .../dashboard/components/nativeFilters/types.ts    |  3 +-
 .../dashboard/components/nativeFilters/utils.ts    |  4 +-
 .../src/dashboard/containers/Dashboard.ts          |  7 +-
 .../src/dashboard/reducers/nativeFilters.ts        | 12 +---
 superset-frontend/src/dashboard/reducers/types.ts  |  1 -
 superset-frontend/src/dashboard/types.ts           |  4 +-
 .../dashboard/util/activeAllDashboardFilters.ts    | 12 ++--
 superset-frontend/src/dataMask/actions.ts          |  9 ++-
 superset-frontend/src/dataMask/reducer.ts          | 80 +++++++++++++++++-----
 superset-frontend/src/dataMask/types.ts            |  2 +-
 superset-frontend/src/filters/utils.ts             | 27 ++++----
 34 files changed, 260 insertions(+), 243 deletions(-)

diff --git a/superset-frontend/spec/fixtures/mockNativeFilters.ts b/superset-frontend/spec/fixtures/mockNativeFilters.ts
index 12abae7..afc4959 100644
--- a/superset-frontend/spec/fixtures/mockNativeFilters.ts
+++ b/superset-frontend/spec/fixtures/mockNativeFilters.ts
@@ -21,7 +21,6 @@ import { NativeFiltersState } from 'src/dashboard/reducers/types';
 import { DataMaskStateWithId } from '../../src/dataMask/types';
 
 export const nativeFilters: NativeFiltersState = {
-  isInitialized: true,
   filterSets: {},
   filters: {
     'NATIVE_FILTER-e7Q8zKixx': {
@@ -36,7 +35,11 @@ export const nativeFilters: NativeFiltersState = {
           },
         },
       ],
-      defaultValue: null,
+      defaultDataMask: {
+        filterState: {
+          value: null,
+        },
+      },
       cascadeParentIds: [],
       scope: {
         rootPath: ['ROOT_ID'],
@@ -61,7 +64,11 @@ export const nativeFilters: NativeFiltersState = {
           },
         },
       ],
-      defaultValue: null,
+      defaultDataMask: {
+        filterState: {
+          value: null,
+        },
+      },
       cascadeParentIds: [],
       scope: {
         rootPath: ['ROOT_ID'],
@@ -115,14 +122,17 @@ export const extraFormData: ExtraFormData = {
 export const NATIVE_FILTER_ID = 'NATIVE_FILTER-p4LImrSgA';
 
 export const singleNativeFiltersState = {
-  isInitialized: true,
   filters: {
     [NATIVE_FILTER_ID]: {
       id: [NATIVE_FILTER_ID],
       name: 'eth',
       type: 'text',
       targets: [{ datasetId: 13, column: { name: 'ethnic_minority' } }],
-      defaultValue: null,
+      defaultDataMask: {
+        filterState: {
+          value: null,
+        },
+      },
       cascadeParentIds: [],
       scope: { rootPath: ['ROOT_ID'], excluded: [227, 229] },
       inverseSelection: false,
diff --git a/superset-frontend/spec/javascripts/dashboard/components/Dashboard_spec.jsx b/superset-frontend/spec/javascripts/dashboard/components/Dashboard_spec.jsx
index 61730c5..a881d0c 100644
--- a/superset-frontend/spec/javascripts/dashboard/components/Dashboard_spec.jsx
+++ b/superset-frontend/spec/javascripts/dashboard/components/Dashboard_spec.jsx
@@ -167,7 +167,7 @@ describe('Dashboard', () => {
         ...OVERRIDE_FILTERS,
         [NATIVE_FILTER_ID]: {
           scope: [230],
-          values: [extraFormData],
+          values: extraFormData,
         },
       });
     });
diff --git a/superset-frontend/spec/javascripts/dashboard/fixtures/mockNativeFilters.ts b/superset-frontend/spec/javascripts/dashboard/fixtures/mockNativeFilters.ts
index da7377d..8a106a2 100644
--- a/superset-frontend/spec/javascripts/dashboard/fixtures/mockNativeFilters.ts
+++ b/superset-frontend/spec/javascripts/dashboard/fixtures/mockNativeFilters.ts
@@ -30,7 +30,6 @@ export const mockDataMaskInfo: DataMaskStateWithId = {
 };
 
 export const nativeFiltersInfo: NativeFiltersState = {
-  isInitialized: true,
   filterSets: {
     'set-id': {
       id: 'DefaultsID',
@@ -54,7 +53,11 @@ export const nativeFiltersInfo: NativeFiltersState = {
           },
         },
       ],
-      defaultValue: null,
+      defaultDataMask: {
+        filterState: {
+          value: null,
+        },
+      },
       scope: {
         rootPath: [],
         excluded: [],
diff --git a/superset-frontend/spec/javascripts/dashboard/util/getFormDataWithExtraFilters_spec.ts b/superset-frontend/spec/javascripts/dashboard/util/getFormDataWithExtraFilters_spec.ts
index c183a2e..38c29e0 100644
--- a/superset-frontend/spec/javascripts/dashboard/util/getFormDataWithExtraFilters_spec.ts
+++ b/superset-frontend/spec/javascripts/dashboard/util/getFormDataWithExtraFilters_spec.ts
@@ -52,7 +52,6 @@ describe('getFormDataWithExtraFilters', () => {
     },
     sliceId: chartId,
     nativeFilters: {
-      isInitialized: true,
       filterSets: {},
       filters: {
         [filterId]: ({
diff --git a/superset-frontend/spec/javascripts/filters/utils_spec.ts b/superset-frontend/spec/javascripts/filters/utils_spec.ts
index d997e64..9d225f4 100644
--- a/superset-frontend/spec/javascripts/filters/utils_spec.ts
+++ b/superset-frontend/spec/javascripts/filters/utils_spec.ts
@@ -129,21 +129,15 @@ describe('Filter utils', () => {
       );
     });
     it('getSelectExtraFormData - col: "testCol", value: [], emptyFilter: false, inverseSelection: false', () => {
-      expect(getSelectExtraFormData('testCol', [], false, false)).toEqual({
-        filters: [],
-      });
+      expect(getSelectExtraFormData('testCol', [], false, false)).toEqual({});
     });
     it('getSelectExtraFormData - col: "testCol", value: undefined, emptyFilter: false, inverseSelection: false', () => {
       expect(
         getSelectExtraFormData('testCol', undefined, false, false),
-      ).toEqual({
-        filters: [],
-      });
+      ).toEqual({});
     });
     it('getSelectExtraFormData - col: "testCol", value: null, emptyFilter: false, inverseSelection: false', () => {
-      expect(getSelectExtraFormData('testCol', null, false, false)).toEqual({
-        filters: [],
-      });
+      expect(getSelectExtraFormData('testCol', null, false, false)).toEqual({});
     });
   });
 
diff --git a/superset-frontend/src/chart/Chart.jsx b/superset-frontend/src/chart/Chart.jsx
index 8e32731..0ca590a 100644
--- a/superset-frontend/src/chart/Chart.jsx
+++ b/superset-frontend/src/chart/Chart.jsx
@@ -121,13 +121,6 @@ class Chart extends React.PureComponent {
   }
 
   runQuery() {
-    if (
-      this.props.dashboardId && // we on dashboard screen
-      isFeatureEnabled(FeatureFlag.DASHBOARD_NATIVE_FILTERS) &&
-      !this.props.isFiltersInitialized
-    ) {
-      return;
-    }
     if (this.props.chartId > 0 && isFeatureEnabled(FeatureFlag.CLIENT_CACHE)) {
       // Load saved chart with a GET request
       this.props.actions.getSavedChart(
diff --git a/superset-frontend/src/chart/ChartContainer.jsx b/superset-frontend/src/chart/ChartContainer.jsx
index 7c88667..9925986 100644
--- a/superset-frontend/src/chart/ChartContainer.jsx
+++ b/superset-frontend/src/chart/ChartContainer.jsx
@@ -37,9 +37,4 @@ function mapDispatchToProps(dispatch) {
   };
 }
 
-export default connect(
-  ({ nativeFilters }) => ({
-    isFiltersInitialized: nativeFilters?.isInitialized,
-  }),
-  mapDispatchToProps,
-)(Chart);
+export default connect(null, mapDispatchToProps)(Chart);
diff --git a/superset-frontend/src/dashboard/actions/nativeFilters.ts b/superset-frontend/src/dashboard/actions/nativeFilters.ts
index e7c8266..660f422 100644
--- a/superset-frontend/src/dashboard/actions/nativeFilters.ts
+++ b/superset-frontend/src/dashboard/actions/nativeFilters.ts
@@ -22,8 +22,8 @@ import { Dispatch } from 'redux';
 import { FilterConfiguration } from 'src/dashboard/components/nativeFilters/types';
 import { DataMaskType, DataMaskStateWithId } from 'src/dataMask/types';
 import {
-  SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE,
   SET_DATA_MASK_FOR_FILTER_CONFIG_FAIL,
+  setDataMaskForFilterConfigComplete,
 } from 'src/dataMask/actions';
 import { HYDRATE_DASHBOARD } from './hydrate';
 import { dashboardInfoChanged } from './dashboardInfo';
@@ -65,14 +65,6 @@ export interface SetFilterSetsConfigFail {
   type: typeof SET_FILTER_SETS_CONFIG_FAIL;
   filterSetsConfig: FilterSet[];
 }
-export const SET_FILTERS_INITIALIZED = 'SET_FILTERS_INITIALIZED';
-export interface SetFiltersInitialized {
-  type: typeof SET_FILTERS_INITIALIZED;
-}
-
-export const setFiltersInitialized = (): SetFiltersInitialized => ({
-  type: SET_FILTERS_INITIALIZED,
-});
 
 export const setFilterConfiguration = (
   filterConfig: FilterConfiguration,
@@ -108,11 +100,7 @@ export const setFilterConfiguration = (
       type: SET_FILTER_CONFIG_COMPLETE,
       filterConfig,
     });
-    dispatch({
-      type: SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE,
-      unitName: DataMaskType.NativeFilters,
-      filterConfig,
-    });
+    dispatch(setDataMaskForFilterConfigComplete(filterConfig));
   } catch (err) {
     dispatch({ type: SET_FILTER_CONFIG_FAIL, filterConfig });
     dispatch({ type: SET_DATA_MASK_FOR_FILTER_CONFIG_FAIL, filterConfig });
@@ -200,6 +188,5 @@ export type AnyFilterAction =
   | SetFilterSetsConfigBegin
   | SetFilterSetsConfigComplete
   | SetFilterSetsConfigFail
-  | SetFiltersInitialized
   | SaveFilterSets
   | SetBooststapData;
diff --git a/superset-frontend/src/dashboard/components/Dashboard.jsx b/superset-frontend/src/dashboard/components/Dashboard.jsx
index b504a8d..4a5c883 100644
--- a/superset-frontend/src/dashboard/components/Dashboard.jsx
+++ b/superset-frontend/src/dashboard/components/Dashboard.jsx
@@ -18,7 +18,7 @@
  */
 import React from 'react';
 import PropTypes from 'prop-types';
-import { t } from '@superset-ui/core';
+import { isFeatureEnabled, t, FeatureFlag } from '@superset-ui/core';
 
 import { PluginContext } from 'src/components/DynamicPlugins';
 import Loading from 'src/components/Loading';
@@ -56,6 +56,7 @@ const propTypes = {
   charts: PropTypes.objectOf(chartPropShape).isRequired,
   slices: PropTypes.objectOf(slicePropShape).isRequired,
   activeFilters: PropTypes.object.isRequired,
+  chartConfiguration: PropTypes.object.isRequired,
   datasources: PropTypes.object.isRequired,
   ownDataCharts: PropTypes.object.isRequired,
   layout: PropTypes.object.isRequired,
@@ -120,6 +121,11 @@ class Dashboard extends React.PureComponent {
       };
     }
     window.addEventListener('visibilitychange', this.onVisibilityChange);
+    this.applyCharts();
+  }
+
+  componentDidUpdate() {
+    this.applyCharts();
   }
 
   UNSAFE_componentWillReceiveProps(nextProps) {
@@ -147,15 +153,28 @@ class Dashboard extends React.PureComponent {
     }
   }
 
-  componentDidUpdate() {
+  applyCharts() {
     const { hasUnsavedChanges, editMode } = this.props.dashboardState;
 
     const { appliedFilters, appliedOwnDataCharts } = this;
-    const { activeFilters, ownDataCharts } = this.props;
+    const { activeFilters, ownDataCharts, chartConfiguration } = this.props;
+    if (
+      isFeatureEnabled(FeatureFlag.DASHBOARD_CROSS_FILTERS) &&
+      !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;
+    }
+
     if (
       !editMode &&
-      (!areObjectsEqual(appliedOwnDataCharts, ownDataCharts) ||
-        !areObjectsEqual(appliedFilters, activeFilters))
+      (!areObjectsEqual(appliedOwnDataCharts, ownDataCharts, {
+        ignoreUndefined: true,
+      }) ||
+        !areObjectsEqual(appliedFilters, activeFilters, {
+          ignoreUndefined: true,
+        }))
     ) {
       this.applyFilters();
     }
@@ -223,6 +242,9 @@ class Dashboard extends React.PureComponent {
           !areObjectsEqual(
             appliedFilters[filterKey].values,
             activeFilters[filterKey].values,
+            {
+              ignoreUndefined: true,
+            },
           )
         ) {
           affectedChartIds.push(...activeFilters[filterKey].scope);
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadePopover/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadePopover/index.tsx
index 60396ca..f256108 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadePopover/index.tsx
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadePopover/index.tsx
@@ -28,6 +28,7 @@ import FilterControl from 'src/dashboard/components/nativeFilters/FilterBar/Filt
 import CascadeFilterControl from 'src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadeFilterControl';
 import { CascadeFilter } from 'src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/types';
 import { Filter } from 'src/dashboard/components/nativeFilters/types';
+import { RootState } from 'src/dashboard/types';
 
 interface CascadePopoverProps {
   filter: CascadeFilter;
@@ -82,7 +83,7 @@ const CascadePopover: React.FC<CascadePopoverProps> = ({
   directPathToChild,
 }) => {
   const [currentPathToChild, setCurrentPathToChild] = useState<string[]>();
-  const dataMask = useSelector<any, DataMaskWithId>(
+  const dataMask = useSelector<RootState, DataMaskWithId>(
     state => state.dataMask[filter.id] ?? getInitialDataMask(filter.id),
   );
 
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/types.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/types.ts
index 4354046..c5a9d13 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/types.ts
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/types.ts
@@ -17,8 +17,9 @@
  * under the License.
  */
 
+import { DataMask } from '@superset-ui/core';
 import { Filter } from '../../types';
 
-export interface CascadeFilter extends Filter {
+export type CascadeFilter = Filter & { dataMask?: DataMask } & {
   cascadeChildren: CascadeFilter[];
-}
+};
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 d6420df..5f2342c 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.test.tsx
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterBar.test.tsx
@@ -84,7 +84,6 @@ const addFilterFlow = () => {
 const addFilterSetFlow = async () => {
   // add filter set
   userEvent.click(screen.getByText('Filter Sets (0)'));
-  expect(screen.getByTestId(getTestId('new-filter-set-button'))).toBeDisabled();
 
   // check description
   expect(screen.getByText('Filters (1)')).toBeInTheDocument();
@@ -92,7 +91,6 @@ const addFilterSetFlow = async () => {
   expect(screen.getAllByText('Last week').length).toBe(2);
 
   // apply filters
-  userEvent.click(screen.getByTestId(getTestId('apply-button')));
   expect(screen.getByTestId(getTestId('new-filter-set-button'))).toBeEnabled();
 
   // create filter set
@@ -139,7 +137,7 @@ describe('FilterBar', () => {
               "name":"${FILTER_NAME}",
               "filterType":"filter_time",
               "targets":[{"datasetId":11,"column":{"name":"color"}}],
-              "defaultValue":null,
+              "defaultDataMask":{"filterState":{"value":null}},
               "controlValues":{},
               "cascadeParentIds":[],
               "scope":{"rootPath":["ROOT_ID"],"excluded":[]},
@@ -154,7 +152,7 @@ describe('FilterBar', () => {
                   "name":"${FILTER_NAME}",
                   "filterType":"filter_time",
                   "targets":[{}],
-                  "defaultValue":"Last week",
+                  "defaultDataMask":{"filterState":{"value":"Last week"},"extraFormData":{"time_range":"Last week"}},
                   "controlValues":{},
                   "cascadeParentIds":[],
                   "scope":{"rootPath":["ROOT_ID"],"excluded":[]},
@@ -163,7 +161,7 @@ describe('FilterBar', () => {
               },
               "dataMask":{
                 "${filterId}":{
-                  "extraFormData":{"override_form_data":{"time_range":"Last week"}},
+                  "extraFormData":{"time_range":"Last week"},
                   "filterState":{"value":"Last week"},
                   "ownState":{},
                   "id":"${filterId}"
@@ -308,10 +306,6 @@ describe('FilterBar', () => {
     addFilterFlow();
 
     await screen.findByText('All Filters (1)');
-
-    // apply filter
-    expect(screen.getByTestId(getTestId('apply-button'))).toBeEnabled();
-    userEvent.click(screen.getByTestId(getTestId('apply-button')));
     expect(screen.getByTestId(getTestId('apply-button'))).toBeDisabled();
   });
 
@@ -319,6 +313,7 @@ describe('FilterBar', () => {
   it.skip('add and apply filter set', async () => {
     // @ts-ignore
     global.featureFlags = {
+      [FeatureFlag.DASHBOARD_NATIVE_FILTERS]: true,
       [FeatureFlag.DASHBOARD_NATIVE_FILTERS_SET]: true,
     };
     renderWrapper(openedBarProps, stateWithoutNativeFilters);
@@ -326,21 +321,23 @@ describe('FilterBar', () => {
     addFilterFlow();
 
     await screen.findByText('All Filters (1)');
-    expect(screen.getByTestId(getTestId('apply-button'))).toBeEnabled();
 
     await addFilterSetFlow();
 
     // change filter
-    userEvent.click(screen.getByText('All Filters (1)'));
     expect(screen.getByTestId(getTestId('apply-button'))).toBeDisabled();
 
     await changeFilterValue();
     await waitFor(() => expect(screen.getAllByText('Last day').length).toBe(2));
 
     // apply new filter value
-    expect(screen.getByTestId(getTestId('apply-button'))).toBeEnabled();
+    await waitFor(() =>
+      expect(screen.getByTestId(getTestId('apply-button'))).toBeEnabled(),
+    );
     userEvent.click(screen.getByTestId(getTestId('apply-button')));
-    expect(screen.getByTestId(getTestId('apply-button'))).toBeDisabled();
+    await waitFor(() =>
+      expect(screen.getByTestId(getTestId('apply-button'))).toBeDisabled(),
+    );
 
     // applying filter set
     userEvent.click(screen.getByText('Filter Sets (1)'));
@@ -357,7 +354,6 @@ describe('FilterBar', () => {
     expect(screen.getByTestId(getTestId('apply-button'))).toBeDisabled();
   });
 
-  // TODO: fix flakiness and re-enable
   it.skip('add and edit filter set', async () => {
     // @ts-ignore
     global.featureFlags = {
@@ -369,7 +365,6 @@ describe('FilterBar', () => {
     addFilterFlow();
 
     await screen.findByText('All Filters (1)');
-    expect(screen.getByTestId(getTestId('apply-button'))).toBeEnabled();
 
     await addFilterSetFlow();
 
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/state.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/state.ts
index 802a12d..7be5835 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/state.ts
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/state.ts
@@ -19,7 +19,7 @@
 import { useSelector } from 'react-redux';
 import { NativeFiltersState } from 'src/dashboard/reducers/types';
 import { mergeExtraFormData } from '../../utils';
-import { useDataMask } from '../state';
+import { useNativeFiltersDataMask } from '../state';
 
 // eslint-disable-next-line import/prefer-default-export
 export function useCascadingFilters(id: string) {
@@ -29,7 +29,7 @@ export function useCascadingFilters(id: string) {
   const filter = filters[id];
   const cascadeParentIds: string[] = filter?.cascadeParentIds ?? [];
   let cascadedFilters = {};
-  const nativeFiltersDataMask = useDataMask();
+  const nativeFiltersDataMask = useNativeFiltersDataMask();
   cascadeParentIds.forEach(parentId => {
     const parentState = nativeFiltersDataMask[parentId] || {};
     const { extraFormData: parentExtra = {} } = parentState;
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts
index 67e50d5..0b39dd2 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts
@@ -21,7 +21,9 @@ import { DataMask } from '@superset-ui/core';
 import { Filter } from '../../types';
 
 export interface FilterProps {
-  filter: Filter;
+  filter: Filter & {
+    dataMask?: DataMask;
+  };
   icon?: React.ReactElement;
   directPathToChild?: string[];
   onFilterSelectionChange: (filter: Filter, dataMask: DataMask) => void;
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx
index 6ab44b4..bd9f724 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/EditSection.tsx
@@ -25,7 +25,7 @@ import { setFilterSetsConfiguration } from 'src/dashboard/actions/nativeFilters'
 import { DataMaskState } from 'src/dataMask/types';
 import { WarningOutlined } from '@ant-design/icons';
 import { ActionButtons } from './Footer';
-import { useDataMask, useFilters, useFilterSets } from '../state';
+import { useNativeFiltersDataMask, useFilters, useFilterSets } from '../state';
 import { APPLY_FILTERS_HINT, findExistingFilterSet } from './utils';
 import { useFilterSetNameDuplicated } from './state';
 import { getFilterBarTestId } from '../index';
@@ -72,7 +72,7 @@ const EditSection: FC<EditSectionProps> = ({
   dataMaskSelected,
   disabled,
 }) => {
-  const dataMaskApplied = useDataMask();
+  const dataMaskApplied = useNativeFiltersDataMask();
   const dispatch = useDispatch();
   const filterSets = useFilterSets();
   const filters = useFilters();
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/index.tsx
index 8947ceb..95676da 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/index.tsx
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterSets/index.tsx
@@ -26,7 +26,7 @@ import { Filters, FilterSet, FilterSets } from 'src/dashboard/reducers/types';
 import { areObjectsEqual } from 'src/reduxUtils';
 import { findExistingFilterSet, generateFiltersSetId } from './utils';
 import { Filter } from '../../types';
-import { useFilters, useDataMask, useFilterSets } from '../state';
+import { useFilters, useNativeFiltersDataMask, useFilterSets } from '../state';
 import Footer from './Footer';
 import FilterSetUnit from './FilterSetUnit';
 import { getFilterBarTestId } from '..';
@@ -85,7 +85,7 @@ const FilterSets: React.FC<FilterSetsProps> = ({
   const dispatch = useDispatch();
   const [filterSetName, setFilterSetName] = useState(DEFAULT_FILTER_SET_NAME);
   const [editMode, setEditMode] = useState(false);
-  const dataMaskApplied = useDataMask();
+  const dataMaskApplied = useNativeFiltersDataMask();
   const filterSets = useFilterSets();
   const filterSetFilterValues = Object.values(filterSets);
   const filters = useFilters();
@@ -111,7 +111,9 @@ const FilterSets: React.FC<FilterSetsProps> = ({
     filterSet?: FilterSet,
   ) =>
     !filterValues.find(filter => filter?.id === id) ||
-    !areObjectsEqual(filters[id], filterSet?.nativeFilters?.[id]);
+    !areObjectsEqual(filters[id], filterSet?.nativeFilters?.[id], {
+      ignoreUndefined: true,
+    });
 
   const takeFilterSet = (id: string, target?: HTMLElement) => {
     const ignoreSelectorHeader = 'ant-collapse-header';
@@ -137,13 +139,15 @@ const FilterSets: React.FC<FilterSetsProps> = ({
 
     const filterSet = filterSets[id];
 
-    Object.values(filterSet?.dataMask ?? []).forEach(dataMask => {
-      const { extraFormData, filterState, id } = dataMask as DataMaskWithId;
-      if (isFilterMissingOrContainsInvalidMetadata(id, filterSet)) {
-        return;
-      }
-      onFilterSelectionChange({ id }, { extraFormData, filterState });
-    });
+    (Object.values(filterSet?.dataMask) ?? []).forEach(
+      (dataMask: DataMaskWithId) => {
+        const { extraFormData, filterState, id } = dataMask;
+        if (isFilterMissingOrContainsInvalidMetadata(id, filterSet)) {
+          return;
+        }
+        onFilterSelectionChange({ id }, { extraFormData, filterState });
+      },
+    );
   };
 
   const handleRebuild = (id: string) => {
@@ -168,7 +172,7 @@ const FilterSets: React.FC<FilterSetsProps> = ({
       dataMask: Object.keys(newFilters).reduce(
         (prev, nextFilterId) => ({
           ...prev,
-          [nextFilterId]: filterSet.dataMask?.nativeFilters?.[nextFilterId],
+          [nextFilterId]: filterSet.dataMask?.[nextFilterId],
         }),
         {},
       ),
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx
index 3829cf4..77f47d1 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx
@@ -19,31 +19,38 @@
 
 /* eslint-disable no-param-reassign */
 import { HandlerFunction, styled, t } from '@superset-ui/core';
-import React, { useEffect, useMemo, useState } from 'react';
+import React, { useMemo, useState } from 'react';
 import { useDispatch } from 'react-redux';
 import cx from 'classnames';
 import Icon from 'src/components/Icon';
 import { Tabs } from 'src/common/components';
 import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
 import { updateDataMask } from 'src/dataMask/actions';
-import { DataMaskState } from 'src/dataMask/types';
+import {
+  DataMaskState,
+  DataMaskStateWithId,
+  DataMaskWithId,
+} from 'src/dataMask/types';
 import { useImmer } from 'use-immer';
 import { areObjectsEqual } from 'src/reduxUtils';
 import { testWithId } from 'src/utils/testUtils';
 import { Filter } from 'src/dashboard/components/nativeFilters/types';
-import { setFiltersInitialized } from 'src/dashboard/actions/nativeFilters';
-import { mapParentFiltersToChildren, TabIds } from './utils';
+import {
+  getOnlyExtraFormData,
+  mapParentFiltersToChildren,
+  TabIds,
+} from './utils';
 import FilterSets from './FilterSets';
 import {
-  useDataMask,
+  useNativeFiltersDataMask,
   useFilters,
   useFilterSets,
-  useFiltersInitialisation,
   useFilterUpdates,
 } from './state';
 import EditSection from './FilterSets/EditSection';
 import Header from './Header';
 import FilterControls from './FilterControls/FilterControls';
+import { getInitialDataMask } from '../../../../dataMask/reducer';
 
 const BAR_WIDTH = `250px`;
 
@@ -155,18 +162,16 @@ const FilterBar: React.FC<FiltersBarProps> = ({
   directPathToChild,
 }) => {
   const [editFilterSetId, setEditFilterSetId] = useState<string | null>(null);
-  const [dataMaskSelected, setDataMaskSelected] = useImmer<DataMaskState>({});
-  const [
-    lastAppliedFilterData,
-    setLastAppliedFilterData,
-  ] = useImmer<DataMaskState>({});
+  const [dataMaskSelected, setDataMaskSelected] = useImmer<DataMaskStateWithId>(
+    {},
+  );
   const dispatch = useDispatch();
   const filterSets = useFilterSets();
   const filterSetFilterValues = Object.values(filterSets);
   const [tab, setTab] = useState(TabIds.AllFilters);
   const filters = useFilters();
   const filterValues = Object.values<Filter>(filters);
-  const dataMaskApplied = useDataMask();
+  const dataMaskApplied: DataMaskStateWithId = useNativeFiltersDataMask();
   const [isFilterSetChanged, setIsFilterSetChanged] = useState(false);
   const cascadeChildren = useMemo(
     () => mapParentFiltersToChildren(filterValues),
@@ -185,7 +190,10 @@ const FilterBar: React.FC<FiltersBarProps> = ({
         dispatch(updateDataMask(filter.id, dataMask));
       }
 
-      draft[filter.id] = dataMask;
+      draft[filter.id] = {
+        ...(getInitialDataMask(filter.id) as DataMaskWithId),
+        ...dataMask,
+      };
     });
   };
 
@@ -196,29 +204,18 @@ const FilterBar: React.FC<FiltersBarProps> = ({
         dispatch(updateDataMask(filterId, dataMaskSelected[filterId]));
       }
     });
-    setLastAppliedFilterData(() => dataMaskSelected);
   };
 
-  const { isInitialized } = useFiltersInitialisation(
-    dataMaskSelected,
-    handleApply,
-  );
-
-  useEffect(() => {
-    if (isInitialized) {
-      dispatch(setFiltersInitialized());
-    }
-  }, [dispatch, isInitialized]);
-
-  useFilterUpdates(
-    dataMaskSelected,
-    setDataMaskSelected,
-    setLastAppliedFilterData,
-  );
+  useFilterUpdates(dataMaskSelected, setDataMaskSelected);
 
+  const dataSelectedValues = Object.values(dataMaskSelected);
+  const dataAppliedValues = Object.values(dataMaskApplied);
   const isApplyDisabled =
-    !isInitialized || areObjectsEqual(dataMaskSelected, lastAppliedFilterData);
-
+    areObjectsEqual(
+      getOnlyExtraFormData(dataMaskSelected),
+      getOnlyExtraFormData(dataMaskApplied),
+      { ignoreUndefined: true },
+    ) || dataSelectedValues.length !== dataAppliedValues.length;
   return (
     <BarWrapper {...getFilterBarTestId()} className={cx({ open: filtersOpen })}>
       <CollapsedBar
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/state.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/state.ts
index c25b5b8..a37789a 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/state.ts
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/state.ts
@@ -22,10 +22,14 @@ import {
   Filters,
   FilterSets as FilterSetsType,
 } from 'src/dashboard/reducers/types';
-import { DataMaskState, DataMaskStateWithId } from 'src/dataMask/types';
-import { useEffect, useState } from 'react';
-import { areObjectsEqual } from 'src/reduxUtils';
-import { Filter } from '../types';
+import {
+  DataMaskState,
+  DataMaskStateWithId,
+  DataMaskWithId,
+} from 'src/dataMask/types';
+import { useEffect } from 'react';
+import { RootState } from 'src/dashboard/types';
+import { NATIVE_FILTER_PREFIX } from '../FiltersConfigModal/utils';
 
 export const useFilterSets = () =>
   useSelector<any, FilterSetsType>(
@@ -35,44 +39,27 @@ export const useFilterSets = () =>
 export const useFilters = () =>
   useSelector<any, Filters>(state => state.nativeFilters.filters);
 
-export const useDataMask = () =>
-  useSelector<any, DataMaskStateWithId>(state => state.dataMask);
-
-export const useFiltersInitialisation = (
-  dataMaskSelected: DataMaskState,
-  handleApply: () => void,
-) => {
-  const [isInitialized, setIsInitialized] = useState<boolean>(false);
-  const filters = useFilters();
-  const filterValues = Object.values<Filter>(filters);
-  useEffect(() => {
-    if (isInitialized) {
-      return;
-    }
-    const areFiltersInitialized = filterValues.every(filterValue =>
-      areObjectsEqual(
-        filterValue?.defaultValue,
-        dataMaskSelected[filterValue?.id]?.filterState?.value,
-      ),
-    );
-    if (areFiltersInitialized) {
-      handleApply();
-      setIsInitialized(true);
-    }
-  }, [filterValues, dataMaskSelected, isInitialized]);
+export const useNativeFiltersDataMask = () => {
+  const dataMask = useSelector<RootState, DataMaskStateWithId>(
+    state => state.dataMask,
+  );
 
-  return {
-    isInitialized,
-  };
+  return Object.values(dataMask)
+    .filter((item: DataMaskWithId) =>
+      String(item.id).startsWith(NATIVE_FILTER_PREFIX),
+    )
+    .reduce(
+      (prev, next: DataMaskWithId) => ({ ...prev, [next.id]: next }),
+      {},
+    ) as DataMaskStateWithId;
 };
 
 export const useFilterUpdates = (
   dataMaskSelected: DataMaskState,
   setDataMaskSelected: (arg0: (arg0: DataMaskState) => void) => void,
-  setLastAppliedFilterData: (arg0: (arg0: DataMaskState) => void) => void,
 ) => {
   const filters = useFilters();
-  const dataMaskApplied = useDataMask();
+  const dataMaskApplied = useNativeFiltersDataMask();
 
   useEffect(() => {
     // Remove deleted filters from local state
@@ -83,18 +70,5 @@ export const useFilterUpdates = (
         });
       }
     });
-    Object.keys(dataMaskApplied).forEach(appliedId => {
-      if (!filters[appliedId]) {
-        setLastAppliedFilterData(draft => {
-          delete draft[appliedId];
-        });
-      }
-    });
-  }, [
-    dataMaskApplied,
-    dataMaskSelected,
-    filters,
-    setDataMaskSelected,
-    setLastAppliedFilterData,
-  ]);
+  }, [dataMaskApplied, dataMaskSelected, filters, setDataMaskSelected]);
 };
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/utils.ts b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/utils.ts
index dc7097a..75cda73 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/utils.ts
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/utils.ts
@@ -17,6 +17,7 @@
  * under the License.
  */
 
+import { DataMaskStateWithId } from 'src/dataMask/types';
 import { Filter } from '../types';
 
 export enum TabIds {
@@ -39,3 +40,9 @@ export function mapParentFiltersToChildren(
   });
   return cascadeChildren;
 }
+
+export const getOnlyExtraFormData = (data: DataMaskStateWithId) =>
+  Object.values(data).reduce(
+    (prev, next) => ({ ...prev, [next.id]: next.extraFormData }),
+    {},
+  );
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ControlItems.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ControlItems.tsx
index 4310a5b..82a46bf 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ControlItems.tsx
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/ControlItems.tsx
@@ -76,7 +76,7 @@ const ControlItems: FC<ControlItemsProps> = ({
                   return;
                 }
                 setNativeFilterFieldValues(form, filterId, {
-                  defaultValue: null,
+                  defaultDataMask: null,
                 });
                 forceUpdate();
               }}
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 2eca4e8..182e1e0 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx
@@ -126,9 +126,7 @@ export const FiltersConfigForm: React.FC<FiltersConfigFormProps> = ({
   const [metrics, setMetrics] = useState<Metric[]>([]);
   const forceUpdate = useForceUpdate();
   const [datasetDetails, setDatasetDetails] = useState<Record<string, any>>();
-
   const formFilter = form.getFieldValue('filters')?.[filterId] || {};
-
   const nativeFilterItems = getChartMetadataRegistry().items;
   const nativeFilterVizTypes = Object.entries(nativeFilterItems)
     // @ts-ignore
@@ -191,7 +189,6 @@ export const FiltersConfigForm: React.FC<FiltersConfigFormProps> = ({
     const formData = getFormData({
       datasetId: formFilter?.dataset?.value,
       groupby: formFilter?.column,
-      defaultValue: formFilter?.defaultValue,
       ...formFilter,
     });
     setNativeFilterFieldValues(form, filterId, {
@@ -242,7 +239,6 @@ export const FiltersConfigForm: React.FC<FiltersConfigFormProps> = ({
   const newFormData = getFormData({
     datasetId,
     groupby: hasColumn ? formFilter?.column : undefined,
-    defaultValue: formFilter?.defaultValue,
     ...formFilter,
   });
 
@@ -294,7 +290,7 @@ export const FiltersConfigForm: React.FC<FiltersConfigFormProps> = ({
             onChange={({ value }: { value: string }) => {
               setNativeFilterFieldValues(form, filterId, {
                 filterType: value,
-                defaultValue: null,
+                defaultDataMask: null,
               });
               forceUpdate();
             }}
@@ -324,7 +320,7 @@ export const FiltersConfigForm: React.FC<FiltersConfigFormProps> = ({
                 // We need reset column when dataset changed
                 if (datasetId && e?.value !== datasetId) {
                   setNativeFilterFieldValues(form, filterId, {
-                    defaultValue: null,
+                    defaultDataMask: null,
                     column: null,
                   });
                 }
@@ -346,10 +342,10 @@ export const FiltersConfigForm: React.FC<FiltersConfigFormProps> = ({
                 form={form}
                 filterId={filterId}
                 datasetId={datasetId}
-                onChange={e => {
+                onChange={() => {
                   // We need reset default value when when column changed
                   setNativeFilterFieldValues(form, filterId, {
-                    defaultValue: null,
+                    defaultDataMask: null,
                   });
                   forceUpdate();
                 }}
@@ -435,16 +431,16 @@ export const FiltersConfigForm: React.FC<FiltersConfigFormProps> = ({
           )}
         </StyledFormItem>
         <StyledFormItem
-          name={['filters', filterId, 'defaultValue']}
-          initialValue={filterToEdit?.defaultValue}
+          name={['filters', filterId, 'defaultDataMask']}
+          initialValue={filterToEdit?.defaultDataMask}
           data-test="default-input"
           label={<StyledLabel>{t('Default Value')}</StyledLabel>}
         >
           {(!hasDataset || (!isDataDirty && hasFilledDataset)) && (
             <DefaultValue
-              setDataMask={({ filterState }) => {
+              setDataMask={dataMask => {
                 setNativeFilterFieldValues(form, filterId, {
-                  defaultValue: filterState?.value,
+                  defaultDataMask: dataMask,
                 });
                 forceUpdate();
               }}
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/types.ts b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/types.ts
index 14c67e4..60051e7 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/types.ts
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/types.ts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { AdhocFilter } from '@superset-ui/core';
+import { AdhocFilter, DataMask } from '@superset-ui/core';
 import { Scope } from '../types';
 
 export interface NativeFiltersFormItem {
@@ -32,6 +32,7 @@ export interface NativeFiltersFormItem {
     [key: string]: any;
   };
   defaultValue: any;
+  defaultDataMask: DataMask;
   parentFilter: {
     value: string;
     label: string;
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts
index 3b0cf2b..d9ae39d 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/utils.ts
@@ -18,6 +18,7 @@
  */
 import { FormInstance } from 'antd/lib/form';
 import shortid from 'shortid';
+import { getInitialDataMask } from 'src/dataMask/reducer';
 import { FilterRemoval, NativeFiltersForm } from './types';
 import { Filter, FilterConfiguration, Target } from '../types';
 
@@ -148,7 +149,7 @@ export const createHandleSave = (
         filterType: formInputs.filterType,
         // for now there will only ever be one target
         targets: [target],
-        defaultValue: formInputs.defaultValue || null,
+        defaultDataMask: formInputs.defaultDataMask ?? getInitialDataMask(),
         cascadeParentIds: formInputs.parentFilter
           ? [formInputs.parentFilter.value]
           : [],
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/types.ts b/superset-frontend/src/dashboard/components/nativeFilters/types.ts
index a758935..07e347c 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/types.ts
+++ b/superset-frontend/src/dashboard/components/nativeFilters/types.ts
@@ -41,8 +41,7 @@ export interface Target {
 
 export interface Filter {
   cascadeParentIds: string[];
-  defaultValue: any;
-  dataMask?: DataMask;
+  defaultDataMask: DataMask;
   isInstant: boolean;
   id: string; // randomly generated at filter creation
   name: string;
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/utils.ts b/superset-frontend/src/dashboard/components/nativeFilters/utils.ts
index 5264e70..a42540a 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/utils.ts
+++ b/superset-frontend/src/dashboard/components/nativeFilters/utils.ts
@@ -35,7 +35,7 @@ export const getFormData = ({
   cascadingFilters = {},
   groupby,
   inputRef,
-  defaultValue,
+  defaultDataMask,
   controlValues,
   filterType,
   sortMetric,
@@ -73,7 +73,7 @@ export const getFormData = ({
     metrics: ['count'],
     row_limit: 10000,
     showSearch: true,
-    defaultValue,
+    defaultValue: defaultDataMask?.filterState?.value,
     time_range,
     time_range_endpoints: ['inclusive', 'exclusive'],
     url_params: {},
diff --git a/superset-frontend/src/dashboard/containers/Dashboard.ts b/superset-frontend/src/dashboard/containers/Dashboard.ts
index 526223d..398dff7 100644
--- a/superset-frontend/src/dashboard/containers/Dashboard.ts
+++ b/superset-frontend/src/dashboard/containers/Dashboard.ts
@@ -18,9 +18,7 @@
  */
 import { bindActionCreators, Dispatch } from 'redux';
 import { connect } from 'react-redux';
-
 import Dashboard from '../components/Dashboard';
-
 import {
   addSliceToDashboard,
   removeSliceFromDashboard,
@@ -66,11 +64,12 @@ function mapStateToProps(state: RootState) {
         // eslint-disable-next-line camelcase
         chartConfiguration: dashboardInfo.metadata?.chart_configuration,
         nativeFilters: nativeFilters.filters,
-        dataMask: getRelevantDataMask(dataMask, 'isApplied'),
+        dataMask,
         layout: dashboardLayout.present,
       }),
     },
-    ownDataCharts: getRelevantDataMask(dataMask, 'ownState', 'ownState'),
+    chartConfiguration: dashboardInfo.metadata?.chart_configuration,
+    ownDataCharts: getRelevantDataMask(dataMask, 'ownState'),
     slices: sliceEntities.slices,
     layout: dashboardLayout.present,
     impressionId,
diff --git a/superset-frontend/src/dashboard/reducers/nativeFilters.ts b/superset-frontend/src/dashboard/reducers/nativeFilters.ts
index e22af28..f434d69 100644
--- a/superset-frontend/src/dashboard/reducers/nativeFilters.ts
+++ b/superset-frontend/src/dashboard/reducers/nativeFilters.ts
@@ -21,7 +21,6 @@ import {
   SAVE_FILTER_SETS,
   SET_FILTER_CONFIG_COMPLETE,
   SET_FILTER_SETS_CONFIG_COMPLETE,
-  SET_FILTERS_INITIALIZED,
 } from 'src/dashboard/actions/nativeFilters';
 import { FilterSet, NativeFiltersState } from './types';
 import { FilterConfiguration } from '../components/nativeFilters/types';
@@ -36,9 +35,7 @@ export function getInitialState({
   filterConfig?: FilterConfiguration;
   state?: NativeFiltersState;
 }): NativeFiltersState {
-  const state: Partial<NativeFiltersState> = {
-    isInitialized: prevState?.isInitialized,
-  };
+  const state: Partial<NativeFiltersState> = {};
 
   const filters = {};
   if (filterConfig) {
@@ -66,7 +63,6 @@ export function getInitialState({
 
 export default function nativeFilterReducer(
   state: NativeFiltersState = {
-    isInitialized: false,
     filters: {},
     filterSets: {},
   },
@@ -95,12 +91,6 @@ export default function nativeFilterReducer(
     case SET_FILTER_CONFIG_COMPLETE:
       return getInitialState({ filterConfig: action.filterConfig, state });
 
-    case SET_FILTERS_INITIALIZED:
-      return {
-        ...state,
-        isInitialized: true,
-      };
-
     case SET_FILTER_SETS_CONFIG_COMPLETE:
       return getInitialState({
         filterSetsConfig: action.filterSetsConfig,
diff --git a/superset-frontend/src/dashboard/reducers/types.ts b/superset-frontend/src/dashboard/reducers/types.ts
index 9ded035..770d561 100644
--- a/superset-frontend/src/dashboard/reducers/types.ts
+++ b/superset-frontend/src/dashboard/reducers/types.ts
@@ -97,7 +97,6 @@ export type Filters = {
 };
 
 export type NativeFiltersState = {
-  isInitialized: boolean;
   filters: Filters;
   filterSets: FilterSets;
 };
diff --git a/superset-frontend/src/dashboard/types.ts b/superset-frontend/src/dashboard/types.ts
index 3ed1c18..f01c2ac 100644
--- a/superset-frontend/src/dashboard/types.ts
+++ b/superset-frontend/src/dashboard/types.ts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { ChartProps, JsonObject } from '@superset-ui/core';
+import { ChartProps, ExtraFormData, JsonObject } from '@superset-ui/core';
 import { chart } from 'src/chart/chartReducer';
 import componentTypes from 'src/dashboard/util/componentTypes';
 import { DataMaskStateWithId } from '../dataMask/types';
@@ -95,7 +95,7 @@ export type LayoutItem = {
 
 type ActiveFilter = {
   scope: number[];
-  values: any[];
+  values: ExtraFormData;
 };
 
 export type ActiveFilters = {
diff --git a/superset-frontend/src/dashboard/util/activeAllDashboardFilters.ts b/superset-frontend/src/dashboard/util/activeAllDashboardFilters.ts
index c3210aa..2243c25 100644
--- a/superset-frontend/src/dashboard/util/activeAllDashboardFilters.ts
+++ b/superset-frontend/src/dashboard/util/activeAllDashboardFilters.ts
@@ -20,7 +20,7 @@ import { DataMaskStateWithId } from 'src/dataMask/types';
 import { JsonObject } from '@superset-ui/core';
 import { CHART_TYPE } from './componentTypes';
 import { Scope } from '../components/nativeFilters/types';
-import { ActiveFilters, LayoutItem } from '../types';
+import { ActiveFilters, Layout, LayoutItem } from '../types';
 import { ChartConfiguration, Filters } from '../reducers/types';
 import { DASHBOARD_ROOT_ID } from './constants';
 
@@ -51,12 +51,11 @@ export const findAffectedCharts = ({
       // eslint-disable-next-line no-param-reassign
       activeFilters[filterId] = {
         scope: [],
-        values: [],
+        values: extraFormData,
       };
     }
     // Add not excluded chart scopes(to know what charts refresh) and values(refresh only if its value changed)
     activeFilters[filterId].scope.push(chartId);
-    activeFilters[filterId].values.push(extraFormData);
     return;
   }
   // If child is not chart, recursive iterate over its children
@@ -74,11 +73,10 @@ export const findAffectedCharts = ({
 
 export const getRelevantDataMask = (
   dataMask: DataMaskStateWithId,
-  filterBy: string,
-  prop?: string,
+  prop: string,
 ): JsonObject | DataMaskStateWithId =>
   Object.values(dataMask)
-    .filter(item => item[filterBy])
+    .filter(item => item[prop])
     .reduce(
       (prev, next) => ({ ...prev, [next.id]: prop ? next[prop] : next }),
       {},
@@ -93,7 +91,7 @@ export const getAllActiveFilters = ({
   chartConfiguration: ChartConfiguration;
   dataMask: DataMaskStateWithId;
   nativeFilters: Filters;
-  layout: { [key: string]: LayoutItem };
+  layout: Layout;
 }): ActiveFilters => {
   const activeFilters = {};
 
diff --git a/superset-frontend/src/dataMask/actions.ts b/superset-frontend/src/dataMask/actions.ts
index 9d557da..7a9bb3f 100644
--- a/superset-frontend/src/dataMask/actions.ts
+++ b/superset-frontend/src/dataMask/actions.ts
@@ -42,7 +42,14 @@ export interface SetDataMaskForFilterConfigFail {
   type: typeof SET_DATA_MASK_FOR_FILTER_CONFIG_FAIL;
   filterConfig: FilterConfiguration;
 }
-
+export function setDataMaskForFilterConfigComplete(
+  filterConfig: FilterConfiguration,
+): SetDataMaskForFilterConfigComplete {
+  return {
+    type: SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE,
+    filterConfig,
+  };
+}
 export function updateDataMask(
   filterId: string,
   dataMask: DataMask,
diff --git a/superset-frontend/src/dataMask/reducer.ts b/superset-frontend/src/dataMask/reducer.ts
index 22c3e66..c4ee71f 100644
--- a/superset-frontend/src/dataMask/reducer.ts
+++ b/superset-frontend/src/dataMask/reducer.ts
@@ -20,23 +20,57 @@
 /* eslint-disable no-param-reassign */
 // <- When we work with Immer, we need reassign, so disabling lint
 import produce from 'immer';
+import { DataMask, FeatureFlag } from '@superset-ui/core';
+import { NATIVE_FILTER_PREFIX } from 'src/dashboard/components/nativeFilters/FiltersConfigModal/utils';
+import { HYDRATE_DASHBOARD } from 'src/dashboard/actions/hydrate';
+import { isFeatureEnabled } from 'src/featureFlags';
 import { DataMaskStateWithId, DataMaskWithId } from './types';
 import {
   AnyDataMaskAction,
   SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE,
   UPDATE_DATA_MASK,
 } from './actions';
-import { NATIVE_FILTER_PREFIX } from '../dashboard/components/nativeFilters/FiltersConfigModal/utils';
-import { Filter } from '../dashboard/components/nativeFilters/types';
+import {
+  Filter,
+  FilterConfiguration,
+} from '../dashboard/components/nativeFilters/types';
 
+export function getInitialDataMask(id?: string): DataMask;
 export function getInitialDataMask(id: string): DataMaskWithId {
+  let otherProps = {};
+  if (id) {
+    otherProps = {
+      id,
+    };
+  }
   return {
-    id,
+    ...otherProps,
     extraFormData: {},
-    filterState: {},
+    filterState: {
+      value: null,
+    },
     ownState: {},
-    isApplied: false,
-  };
+  } as DataMaskWithId;
+}
+
+function fillNativeFilters(
+  data: FilterConfiguration,
+  cleanState: DataMaskStateWithId,
+  draft: DataMaskStateWithId,
+) {
+  data.forEach((filter: Filter) => {
+    cleanState[filter.id] = {
+      ...getInitialDataMask(filter.id), // take initial data
+      ...filter.defaultDataMask, // if something new came from BE - take it
+      ...draft[filter.id], // keep local filter data
+    };
+  });
+  // Get back all other non-native filters
+  Object.values(draft).forEach(filter => {
+    if (!String(filter?.id).startsWith(NATIVE_FILTER_PREFIX)) {
+      cleanState[filter?.id] = filter;
+    }
+  });
 }
 
 const dataMaskReducer = produce(
@@ -48,21 +82,31 @@ const dataMaskReducer = produce(
           ...getInitialDataMask(action.filterId),
           ...draft[action.filterId],
           ...action.dataMask,
-          isApplied: true,
         };
         return draft;
-
+      // TODO: update hydrate to .ts
+      // @ts-ignore
+      case HYDRATE_DASHBOARD:
+        if (isFeatureEnabled(FeatureFlag.DASHBOARD_CROSS_FILTERS)) {
+          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 ??
+            [],
+          cleanState,
+          draft,
+        );
+        return cleanState;
       case SET_DATA_MASK_FOR_FILTER_CONFIG_COMPLETE:
-        (action.filterConfig ?? []).forEach((filter: Filter) => {
-          cleanState[filter.id] =
-            draft[filter.id] ?? getInitialDataMask(filter.id);
-        });
-        // Get back all other non-native filters
-        Object.values(draft).forEach(filter => {
-          if (!String(filter?.id).startsWith(NATIVE_FILTER_PREFIX)) {
-            cleanState[filter?.id] = filter;
-          }
-        });
+        fillNativeFilters(action.filterConfig ?? [], cleanState, draft);
         return cleanState;
 
       default:
diff --git a/superset-frontend/src/dataMask/types.ts b/superset-frontend/src/dataMask/types.ts
index 2e335b2..95d2073 100644
--- a/superset-frontend/src/dataMask/types.ts
+++ b/superset-frontend/src/dataMask/types.ts
@@ -25,5 +25,5 @@ export enum DataMaskType {
 
 export type DataMaskState = { [id: string]: DataMask };
 
-export type DataMaskWithId = { id: string; isApplied?: boolean } & DataMask;
+export type DataMaskWithId = { id: string } & DataMask;
 export type DataMaskStateWithId = { [filterId: string]: DataMaskWithId };
diff --git a/superset-frontend/src/filters/utils.ts b/superset-frontend/src/filters/utils.ts
index 6ca88dd..ecd7268 100644
--- a/superset-frontend/src/filters/utils.ts
+++ b/superset-frontend/src/filters/utils.ts
@@ -41,17 +41,14 @@ export const getSelectExtraFormData = (
         sqlExpression: '1 = 0',
       },
     ];
-  } else {
-    extra.filters =
-      value === undefined || value === null || value.length === 0
-        ? []
-        : [
-            {
-              col,
-              op: inverseSelection ? ('NOT IN' as const) : ('IN' as const),
-              val: value,
-            },
-          ];
+  } else if (value !== undefined && value !== null && value.length !== 0) {
+    extra.filters = [
+      {
+        col,
+        op: inverseSelection ? ('NOT IN' as const) : ('IN' as const),
+        val: value,
+      },
+    ];
   }
   return extra;
 };
@@ -69,9 +66,11 @@ export const getRangeExtraFormData = (
     filters.push({ col, op: '<=', val: upper });
   }
 
-  return {
-    filters,
-  };
+  return filters.length
+    ? {
+        filters,
+      }
+    : {};
 };
 
 export interface DataRecordValueFormatter {

[superset] 02/05: refactor(native-filters): allow cascading only for filter_select (#14441)

Posted by am...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

amitmiran pushed a commit to branch 1.2
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 9d8eb3b7e7642f083bc263dccea8b43e8323a361
Author: simcha90 <56...@users.noreply.github.com>
AuthorDate: Sun May 2 13:16:10 2021 +0300

    refactor(native-filters): allow cascading only for filter_select (#14441)
    
    * fix:fix get permission function
    
    * refactor: allow cascading only for filter_select
    
    (cherry picked from commit abbf4bf05a4e579df55a25d771aad074e71c9bd5)
---
 .../FiltersConfigForm/FiltersConfigForm.tsx        | 37 +++++++++++++---------
 .../FiltersConfigModal/FiltersConfigModal.tsx      |  4 +++
 2 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx
index 511890b..2eca4e8 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/FiltersConfigForm.tsx
@@ -62,7 +62,10 @@ import ControlItems from './ControlItems';
 import FilterScope from './FilterScope/FilterScope';
 import RemovedFilter from './RemovedFilter';
 import DefaultValue from './DefaultValue';
-import { getFiltersConfigModalTestId } from '../FiltersConfigModal';
+import {
+  CASCADING_FILTERS,
+  getFiltersConfigModalTestId,
+} from '../FiltersConfigModal';
 // TODO: move styles from AdhocFilterControl to emotion and delete this ./main.less
 import './main.less';
 
@@ -174,6 +177,8 @@ export const FiltersConfigForm: React.FC<FiltersConfigFormProps> = ({
     formFilter?.filterType,
   );
 
+  const isCascadingFilter = CASCADING_FILTERS.includes(formFilter?.filterType);
+
   const isDataDirty = formFilter?.isDataDirty ?? true;
 
   useBackendFormUpdate(form, filterId);
@@ -405,20 +410,22 @@ export const FiltersConfigForm: React.FC<FiltersConfigFormProps> = ({
         hidden
         initialValue={null}
       />
-      <StyledFormItem
-        name={['filters', filterId, 'parentFilter']}
-        label={<StyledLabel>{t('Parent filter')}</StyledLabel>}
-        initialValue={parentFilterOptions.find(
-          ({ value }) => value === filterToEdit?.cascadeParentIds[0],
-        )}
-        data-test="parent-filter-input"
-      >
-        <Select
-          placeholder={t('None')}
-          options={parentFilterOptions}
-          isClearable
-        />
-      </StyledFormItem>
+      {isCascadingFilter && (
+        <StyledFormItem
+          name={['filters', filterId, 'parentFilter']}
+          label={<StyledLabel>{t('Parent filter')}</StyledLabel>}
+          initialValue={parentFilterOptions.find(
+            ({ value }) => value === filterToEdit?.cascadeParentIds[0],
+          )}
+          data-test="parent-filter-input"
+        >
+          <Select
+            placeholder={t('None')}
+            options={parentFilterOptions}
+            isClearable
+          />
+        </StyledFormItem>
+      )}
       <StyledContainer>
         <StyledFormItem className="bottom" label={<StyledLabel />}>
           {hasDataset && hasFilledDataset && (
diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx
index 2100ef6..d19538c 100644
--- a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx
+++ b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigModal.tsx
@@ -62,6 +62,7 @@ export interface FiltersConfigModalProps {
   onSave: (filterConfig: FilterConfiguration) => Promise<void>;
   onCancel: () => void;
 }
+export const CASCADING_FILTERS = ['filter_select'];
 
 /**
  * This is the modal to configure all the dashboard-native filters.
@@ -170,6 +171,9 @@ export function FiltersConfigModal({
   const getParentFilters = (id: string) =>
     filterIds
       .filter(filterId => filterId !== id && !removedFilters[filterId])
+      .filter(filterId =>
+        CASCADING_FILTERS.includes(formValues.filters[filterId]?.filterType),
+      )
       .map(id => ({
         id,
         title: getFilterTitle(id),

[superset] 01/05: test(maximize-chart): Add tests to maximize chart action (#14371)

Posted by am...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

amitmiran pushed a commit to branch 1.2
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 32261601bd22efc54fe99fbddff1381f26a689ea
Author: simcha90 <56...@users.noreply.github.com>
AuthorDate: Sun May 2 09:27:38 2021 +0300

    test(maximize-chart): Add tests to maximize chart action (#14371)
    
    * fixed FullSize charts broken #13600
    
    * Update ChartHolder.jsx
    
    * fix:fix get permission function
    
    * test: adding tests to full screen
    
    * lint: fix lint
    
    * fix: fix CR notes
    
    * fix: fix CR notes
    
    * fix: fix CR notes
    
    Co-authored-by: toop <my...@163.com>
    (cherry picked from commit 1f8de1d06c9de1bc659fa5729e322709051e4440)
---
 .../spec/fixtures/mockChartQueries.js              |  2 +-
 .../components/SliceHeaderControls/index.jsx       |  9 +++
 .../components/gridComponents/ChartHolder.jsx      |  4 +-
 .../components/gridComponents/ChartHolder.test.tsx | 88 ++++++++++++++++++++++
 4 files changed, 100 insertions(+), 3 deletions(-)

diff --git a/superset-frontend/spec/fixtures/mockChartQueries.js b/superset-frontend/spec/fixtures/mockChartQueries.js
index a16354c..e4fa224 100644
--- a/superset-frontend/spec/fixtures/mockChartQueries.js
+++ b/superset-frontend/spec/fixtures/mockChartQueries.js
@@ -29,7 +29,7 @@ export default {
     chartUpdateStartTime: 1525852454838,
     latestQueryFormData: {},
     queryRequest: {},
-    queryResponse: {},
+    queriesResponse: [{}],
     triggerQuery: false,
     lastRendered: 0,
     form_data: {
diff --git a/superset-frontend/src/dashboard/components/SliceHeaderControls/index.jsx b/superset-frontend/src/dashboard/components/SliceHeaderControls/index.jsx
index 2c66bca..422e915 100644
--- a/superset-frontend/src/dashboard/components/SliceHeaderControls/index.jsx
+++ b/superset-frontend/src/dashboard/components/SliceHeaderControls/index.jsx
@@ -32,6 +32,7 @@ import getDashboardUrl from 'src/dashboard/util/getDashboardUrl';
 import { getActiveFilters } from 'src/dashboard/util/activeDashboardFilters';
 import { FeatureFlag, isFeatureEnabled } from 'src/featureFlags';
 import CrossFilterScopingModal from 'src/dashboard/components/CrossFilterScopingModal/CrossFilterScopingModal';
+import Icons from 'src/components/Icons';
 
 const propTypes = {
   slice: PropTypes.object.isRequired,
@@ -295,6 +296,14 @@ class SliceHeaderControls extends React.PureComponent {
           isOpen={this.state.showCrossFilterScopingModal}
           onClose={() => this.setState({ showCrossFilterScopingModal: false })}
         />
+        {isFullSize && (
+          <Icons.FullscreenExitOutlined
+            style={{ fontSize: 22 }}
+            onClick={() => {
+              this.props.handleToggleFullSize();
+            }}
+          />
+        )}
         <NoAnimationDropdown
           overlay={menu}
           trigger={['click']}
diff --git a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx
index 61a0cf2..f83c8a0 100644
--- a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx
+++ b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.jsx
@@ -245,8 +245,8 @@ class ChartHolder extends React.Component {
     let chartHeight = 0;
 
     if (this.state.isFullSize) {
-      chartWidth = document.body.clientWidth - CHART_MARGIN;
-      chartHeight = document.body.clientHeight - CHART_MARGIN;
+      chartWidth = window.innerWidth - CHART_MARGIN;
+      chartHeight = window.innerHeight - CHART_MARGIN;
     } else {
       chartWidth = Math.floor(
         widthMultiple * columnWidth +
diff --git a/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.test.tsx b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.test.tsx
new file mode 100644
index 0000000..cd9f35c
--- /dev/null
+++ b/superset-frontend/src/dashboard/components/gridComponents/ChartHolder.test.tsx
@@ -0,0 +1,88 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from 'react';
+import { render, screen } from 'spec/helpers/testing-library';
+import mockState from 'spec/fixtures/mockState';
+import { sliceId as chartId } from 'spec/fixtures/mockChartQueries';
+import newComponentFactory from 'src/dashboard/util/newComponentFactory';
+import userEvent from '@testing-library/user-event';
+import { waitFor } from '@testing-library/react';
+import { ChartHolder } from './index';
+import { CHART_TYPE, ROW_TYPE } from '../../util/componentTypes';
+
+describe('ChartHolder', () => {
+  const defaultProps = {
+    component: {
+      ...newComponentFactory(CHART_TYPE),
+      id: 'CHART_ID',
+      parents: ['ROOT_ID', 'TABS_ID', 'TAB_ID', 'ROW_ID'],
+      meta: {
+        chartId,
+        width: 3,
+        height: 10,
+        chartName: 'Mock chart name',
+      },
+    },
+    parentComponent: {
+      ...newComponentFactory(ROW_TYPE),
+      id: 'ROW_ID',
+      children: ['COLUMN_ID'],
+    },
+    index: 0,
+    depth: 0,
+    id: 'CHART_ID',
+    parentId: 'ROW_ID',
+    availableColumnCount: 12,
+    columnWidth: 300,
+    onResizeStart: () => {},
+    onResize: () => {},
+    onResizeStop: () => {},
+    handleComponentDrop: () => {},
+    deleteComponent: () => {},
+    updateComponents: () => {},
+    editMode: false,
+    isComponentVisible: true,
+    dashboardId: 123,
+  };
+
+  const renderWrapper = (props = defaultProps, state = mockState) =>
+    render(<ChartHolder {...props} />, {
+      useRedux: true,
+      initialState: state,
+      useDnd: true,
+    });
+
+  it('toggle full size', async () => {
+    renderWrapper();
+
+    let chart = (screen.getByTestId('slice-container')
+      .firstChild as HTMLElement).style;
+    expect(chart?.width).toBe('900px');
+    expect(chart?.height).toBe('26px');
+
+    userEvent.click(screen.getByRole('button'));
+    userEvent.click(screen.getByText('Maximize chart'));
+
+    chart = (screen.getByTestId('slice-container').firstChild as HTMLElement)
+      .style;
+    await waitFor(() => expect(chart?.width).toBe('992px'));
+    expect(chart?.height).toBe('714px');
+  });
+});

[superset] 05/05: fix(viz): bump superset-ui to fix bugs in table and graph chart (#14438)

Posted by am...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

amitmiran pushed a commit to branch 1.2
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 0fd1da8007f8de622bd483f2dbb7ead4b0e2e04f
Author: Jesse Yang <je...@airbnb.com>
AuthorDate: Mon May 3 16:23:42 2021 -0700

    fix(viz): bump superset-ui to fix bugs in table and graph chart (#14438)
    
    (cherry picked from commit a75e4af99bfae1315be60a05ca95e077b74b4de7)
---
 superset-frontend/package-lock.json | 636 ++++++++++++++++++------------------
 superset-frontend/package.json      |  57 ++--
 superset-frontend/webpack.config.js |  10 +-
 3 files changed, 354 insertions(+), 349 deletions(-)

diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json
index 2cfd98e..9a7f23c 100644
--- a/superset-frontend/package-lock.json
+++ b/superset-frontend/package-lock.json
@@ -13,35 +13,36 @@
         "@babel/runtime-corejs3": "^7.12.5",
         "@data-ui/sparkline": "^0.0.84",
         "@emotion/core": "^10.0.35",
-        "@superset-ui/chart-controls": "^0.17.36",
-        "@superset-ui/core": "^0.17.32",
-        "@superset-ui/legacy-plugin-chart-calendar": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-chord": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-country-map": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-histogram": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-horizon": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-map-box": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-partition": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-rose": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-sankey": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-treemap": "^0.17.36",
-        "@superset-ui/legacy-plugin-chart-world-map": "^0.17.36",
-        "@superset-ui/legacy-preset-chart-big-number": "^0.17.36",
+        "@emotion/react": "^11.1.5",
+        "@superset-ui/chart-controls": "^0.17.41",
+        "@superset-ui/core": "^0.17.40",
+        "@superset-ui/legacy-plugin-chart-calendar": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-chord": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-country-map": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-histogram": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-horizon": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-map-box": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-partition": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-rose": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-sankey": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-treemap": "^0.17.41",
+        "@superset-ui/legacy-plugin-chart-world-map": "^0.17.41",
+        "@superset-ui/legacy-preset-chart-big-number": "^0.17.41",
         "@superset-ui/legacy-preset-chart-deckgl": "^0.4.6",
-        "@superset-ui/legacy-preset-chart-nvd3": "^0.17.36",
-        "@superset-ui/plugin-chart-echarts": "^0.17.38",
-        "@superset-ui/plugin-chart-pivot-table": "^0.17.36",
-        "@superset-ui/plugin-chart-table": "^0.17.37",
-        "@superset-ui/plugin-chart-word-cloud": "^0.17.36",
-        "@superset-ui/preset-chart-xy": "^0.17.36",
+        "@superset-ui/legacy-preset-chart-nvd3": "^0.17.41",
+        "@superset-ui/plugin-chart-echarts": "^0.17.41",
+        "@superset-ui/plugin-chart-pivot-table": "^0.17.41",
+        "@superset-ui/plugin-chart-table": "^0.17.41",
+        "@superset-ui/plugin-chart-word-cloud": "^0.17.41",
+        "@superset-ui/preset-chart-xy": "^0.17.41",
         "@vx/responsive": "^0.0.195",
         "abortcontroller-polyfill": "^1.1.9",
         "antd": "^4.9.4",
@@ -15914,12 +15915,11 @@
       }
     },
     "node_modules/@superset-ui/chart-controls": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.36.tgz",
-      "integrity": "sha512-Mn+Lzol8EqVXJzpfaGeB3UJetZCN7EDS7vOpj+Zczh+oQ9CIpSuyK1RnQyAykyKmPOuMgsq28At332povGQs5A==",
-      "license": "Apache-2.0",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.41.tgz",
+      "integrity": "sha512-kj1H6LFzN6SWUDKU0hHlpDEYwmGjNg4/okfxsOCewU60y1uoKhl+i+Z1vqKad0iUPZrAlavZCtjebZq1EfTF1w==",
       "dependencies": {
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/core": "0.17.40",
         "lodash": "^4.17.15",
         "prop-types": "^15.7.2"
       },
@@ -15933,11 +15933,12 @@
       }
     },
     "node_modules/@superset-ui/core": {
-      "version": "0.17.32",
-      "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.32.tgz",
-      "integrity": "sha512-uaSzlZmolqV3XVDVYYy7sVOB76gMkUrKnc+Wng8BDejzK7Cbr5VicbnNNDNvQuh9llfIop2ptNYAtBcdeqPnig==",
+      "version": "0.17.40",
+      "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.40.tgz",
+      "integrity": "sha512-ocYwqhTzIlX9LA4L5aOMIHIDN/WcZcVwjKzWR8UVIU22lBqmt5wuDZJbTwcT+RczCABE9eW4PjsJFJuuTLUpzQ==",
       "dependencies": {
         "@babel/runtime": "^7.1.2",
+        "@emotion/cache": "^11.1.3",
         "@emotion/core": "^10.0.28",
         "@emotion/react": "^11.1.5",
         "@emotion/styled": "^10.0.27",
@@ -15967,6 +15968,14 @@
         "rison": "^0.1.1",
         "seedrandom": "^3.0.5",
         "whatwg-fetch": "^3.0.0"
+      },
+      "peerDependencies": {
+        "@types/react": "*",
+        "@types/react-bootstrap": "*",
+        "@types/react-loadable": "*",
+        "react": "^16.13.1",
+        "react-bootstrap": "^0.33.1",
+        "react-loadable": "^5.5.0"
       }
     },
     "node_modules/@superset-ui/core/node_modules/@vx/responsive": {
@@ -16002,13 +16011,12 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-calendar": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.36.tgz",
-      "integrity": "sha512-nRrtgAjy28Jz89quX6i5tZSzKQqlrFGziJuhs9+yohWb8k7LpBxmL+8m3Y7Qk+P2vlRoSuTlLVYHk8hQuLTulw==",
-      "license": "Apache-2.0",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.41.tgz",
+      "integrity": "sha512-WOfZ5fuF6Pf109Xo40qw7yzJ/TxF9TQjsHmPpdz0TVQCHujndUjx/9NJQLAbYjLx9TrFjWpM4f9QzsJ9NO2jfw==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3-array": "^2.0.3",
         "d3-selection": "^1.4.0",
         "d3-tip": "^0.9.1",
@@ -16027,24 +16035,24 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-chord": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.36.tgz",
-      "integrity": "sha512-IsuXMiVyJEHQO22M13nmf4GQNQK/IPUaQIdALrrnJB2y5692BWlQr5oFqekaQyUpdl46bWa1m0PTZQDFr/Nxrw==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.41.tgz",
+      "integrity": "sha512-3nlqRySwLf+0DYmC92Dy2ia2O+lMWPfxMv57pm0C1WjECPDAjGEdmB/QT9ZtXsF8paA9GtAN1dKzJ1zF1WCaag==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "prop-types": "^15.6.2",
         "react": "^16.13.1"
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-country-map": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.36.tgz",
-      "integrity": "sha512-rkxcJxdEaxR5drQDRrU7NhYF46OIuara4UN3WW2ZfVF92JcRNQUhXVfLEOssTik6wSbGJ2ZZ5RGdVyHmNH6b4w==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.41.tgz",
+      "integrity": "sha512-UN8TkC673ntcFv2r7FAT7DL516RKdOaNibDWiQwuBgDfpW9FdnVyyKifEUU6SP9l2YQAoaUKW/zxMpbsWTrjKw==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "d3-array": "^2.0.3",
         "prop-types": "^15.6.2"
@@ -16059,13 +16067,13 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-event-flow": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.36.tgz",
-      "integrity": "sha512-9qECvJcjnsvuEOrNxVGYTc5XSFnz/nRI2D25mJt1TfptYRgAmZ8nbyN3Cu6rq0GFtSjTB/yNtlYQysX025h+rw==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.41.tgz",
+      "integrity": "sha512-1r7IazPDQhZ3gN7aSesc5RrJbHZGY6e9/ImN7WpPBGHNHZE4+OfapeYPzg/gaYXt9R/NKb6rQPxXlM+gPZ0i2Q==",
       "dependencies": {
         "@data-ui/event-flow": "^0.0.84",
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "prop-types": "^15.6.2"
       },
       "peerDependencies": {
@@ -16073,12 +16081,12 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-force-directed": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.36.tgz",
-      "integrity": "sha512-uEhtf/RJ0U62t8naq4uaAcCO96GxBJRjbjn9PApfX6VrwgJ7ZojPR0Bi4C4norczckvTVl5ZqMzEQ5RXlLD/RA==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.41.tgz",
+      "integrity": "sha512-NQ7YbHP6HtcPRoLhTt9RaimZweBxFd4+U2/yQ82bpecFNgBWhDrakWFPG80CAvnV0rQn613xC+lIWE4SvTQoSg==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "prop-types": "^15.7.2"
       },
@@ -16087,12 +16095,12 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-heatmap": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.36.tgz",
-      "integrity": "sha512-1K8SYdiGFaoM0xEqlQxWR6mTpRPS+1f6jCAWTRcddceEIodJedTQ7gK8wgG5683Gp3VnQ8WGprwfhowl/66ZjQ==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.41.tgz",
+      "integrity": "sha512-0XzcN6FhMCFXxikQ9eIpSnMpe4hBLlnCh5j3SoSLTcRDYw/2Y92E9MzGdk1fDwQDRJQCt7XCAwOmPx8K5/pjXA==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "d3-svg-legend": "^1.x",
         "d3-tip": "^0.9.1",
@@ -16100,14 +16108,14 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-histogram": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.36.tgz",
-      "integrity": "sha512-9AA1UbhdPII3LrvXXQw/gXULBUoCPilTky/VVeCjzTPfd6gfY2qO440p5dshEmBxFOGZI2VPjKYdunZRZEIE7g==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.41.tgz",
+      "integrity": "sha512-MMN6HOk9iGmdbCRsl8cyyEPsrCLaNHGO7BnH/H7yotqEYY9krNT70tkaCGfTZZks1Eci5Uj9yd1ntRyyuUSxaQ==",
       "dependencies": {
         "@data-ui/histogram": "^0.0.84",
         "@data-ui/theme": "^0.0.84",
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@vx/legend": "^0.0.198",
         "@vx/responsive": "^0.0.199",
         "@vx/scale": "^0.0.197",
@@ -16176,13 +16184,12 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-horizon": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.36.tgz",
-      "integrity": "sha512-04vht34JBBXKxAbKNhpCe3XVlNV4ciexIF+/uyFtG+sObZGoVpBdjotupa6HzZghGSRG39ITkPSSAZlv205WoQ==",
-      "license": "Apache-2.0",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.41.tgz",
+      "integrity": "sha512-43ZWTEqCFO+0hwwFHOgjz45PAEwsz/RVPP+92EI66/vYdPprbG+Z3ZR59FFw1fRkmR6E8QbI3Ml06uIpV7nDMw==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3-array": "^2.0.3",
         "d3-scale": "^3.0.1",
         "prop-types": "^15.6.2"
@@ -16212,12 +16219,12 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-map-box": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.36.tgz",
-      "integrity": "sha512-MfdUkDxXh7gsoRMC1iu6BKyF8wi9KSfiTwkYLXdWjzpaK7HMHT3Jlbkpu39+SwTDW8NHz51t+BdWf739DoGeuQ==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.41.tgz",
+      "integrity": "sha512-S2H1wLy0entwWtrZttUJ/4CAzlOjyOXnQ0Zl+Ho1R+OlWOBl8257mRd0ozUgXuvdSMWf5JLKC7ZRp+rfgCx5XA==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "immutable": "^3.8.2",
         "mapbox-gl": "^0.53.0",
         "prop-types": "^15.6.2",
@@ -16238,13 +16245,12 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-paired-t-test": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.36.tgz",
-      "integrity": "sha512-N0/OFmfVyL+hbzeIlKilbuFuiP2dM4FJ9gzJ+zdvX6t38ZKLRQ7Kewu7rTKvGCLElCVa0eXAY1JDgCtahSXWQA==",
-      "license": "Apache-2.0",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.41.tgz",
+      "integrity": "sha512-LboljeNgBDxrh3C199uJn3gGfiPUZv1J5GeFObsf26zuIEwD2rkRYOiQcuN2vHc0LzEhjouvdINUnwkYbh0ILQ==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "distributions": "^1.0.0",
         "prop-types": "^15.6.2",
         "reactable": "^1.1.0"
@@ -16254,12 +16260,12 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-parallel-coordinates": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.36.tgz",
-      "integrity": "sha512-f7qQ9zed/TFVyr5Md8hIfF8IpAdZup3QWEAed1bmdwDe9So+jz7B8lwmUMqM/tDy1FD3K0h2EVMuP0Xjojt89g==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.41.tgz",
+      "integrity": "sha512-P99o1VfAHcEy8oIZdG+dZ6IGFjNu+P/+A31z+Kubl8+LBlokpRJ96cq1VRWqxS/0qNaqMmc5P0rg+a2gcyOkXQ==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "prop-types": "^15.7.2"
       },
@@ -16268,13 +16274,12 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-partition": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.36.tgz",
-      "integrity": "sha512-8OkD82IN9UhRnoOoRCVhnfHqfvPXW22zXbSR9sKfkXJizne3JoTjX70+lWOGHW/DWjPHiuRZEhDYrJOMBNyjTg==",
-      "license": "Apache-2.0",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.41.tgz",
+      "integrity": "sha512-Z/awYeDJCpWTbPIj0Qyt+L6y7OnpGITZ9k4vDBSFecjPRHs9er1/hiFLz6BuXGw4UUK3ABJ+/LP0jzEfXyntTA==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "d3-hierarchy": "^1.1.8",
         "prop-types": "^15.6.2"
@@ -16284,24 +16289,24 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-pivot-table": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.36.tgz",
-      "integrity": "sha512-1vhGlxuJMbNAjyIHnGsmfsqMjBFqJqJ57n8heMR1FGkyNPq2RMIgp+PpiuEe0oPznpyyA5KBlMnUuJeRHfjTzg==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.41.tgz",
+      "integrity": "sha512-AX6ghgbQEZbK1CRMnv4AU5XM4mFx4b2rco98Tr3kDb1D7f9+R6tIZPCn3dLA/wqjIr23Fw2M1O156rVtoUDgpA==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "datatables.net-bs": "^1.10.15",
         "prop-types": "^15.6.2"
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-rose": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.36.tgz",
-      "integrity": "sha512-7ipsm5YY+euPMo6jNt21sJs4HUQBetOKeM/qPztUxB8061gs9gxhnmivHepiLA0LRPNhLSSdvXVYPX92N4Vy2w==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.41.tgz",
+      "integrity": "sha512-Lva5Z6W9talvSQrgrUtZNSh3WMJz3/P3HzHh7lpURKG5/cGMS1uz89edfdhWvvfYRX+FczuXX4AvAhrnAsou3g==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "nvd3": "1.8.6",
         "prop-types": "^15.6.2"
@@ -16311,13 +16316,12 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-sankey": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.36.tgz",
-      "integrity": "sha512-d0FFLrmCmkZ7DPRXZBJLIJSC9a0MyiOcBr3uaefieASbt9KBFltAiFvni0QAWeTTp/dNXJv+YeKgPXzOwBQWZQ==",
-      "license": "Apache-2.0",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.41.tgz",
+      "integrity": "sha512-ra3uu2VYH9piFLK7J7Llb4M40+xqY4RcqfGRQzP8pXf1vWvWiWlvM1n7MpKVfFTBHBwZo2WwCsJuJLd/mW7szQ==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "d3-sankey": "^0.4.2",
         "prop-types": "^15.6.2"
@@ -16327,48 +16331,47 @@
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-sankey-loop": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.36.tgz",
-      "integrity": "sha512-vM4xM94nz23Cjw42OMG7Igj07nBPzV+E/Tt+tl4nNlNGVetgUF/+aJnEosxx5YkVWvnnF71hst/VMFK5PZQztA==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.41.tgz",
+      "integrity": "sha512-o5sVvdi9ZE4mpUac3OUYKa0zazaUeuIMkmEzKjHhhJbG2YQdcFuxI3MDkqydBrzs/Y6o5p7J/vXxqLGKD0dNVQ==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3-sankey-diagram": "^0.7.3",
         "d3-selection": "^1.4.0",
         "prop-types": "^15.6.2"
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-sunburst": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.36.tgz",
-      "integrity": "sha512-/1qM2HMxzyeUTg1CQgsky+Vp9dP84kG5NCaCiD+/JijIt/WEfY5JbqGnKFvcTQFt1qhmqElIQt2lk1UULn0RyQ==",
-      "license": "Apache-2.0",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.41.tgz",
+      "integrity": "sha512-oEbh+nQsZ1IzZFcVhQXhKjA/jxKitR+xyrlgKumowtK46sger68wEhLQSYm22JnPIBLTWytBh3WSXGMJ3Hl83A==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "prop-types": "^15.6.2"
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-treemap": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.36.tgz",
-      "integrity": "sha512-DBru6j4tj2OO/gAPuDAs/FYL7Q/UXLs1J/MP5k0dhK8ZfZmSVnq5xluu0P8VYK64bRv4GNLv5P+iidAQShXp8Q==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.41.tgz",
+      "integrity": "sha512-d5ONdoBWP2JqWMEdSGine16Q0pR5qEFuG2X70ytDbn8+BwrV+YIp+bhd3/Zy4TkML3IRCKjVpionn7Uvj4+PTQ==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3-hierarchy": "^1.1.8",
         "d3-selection": "^1.4.0",
         "prop-types": "^15.6.2"
       }
     },
     "node_modules/@superset-ui/legacy-plugin-chart-world-map": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.36.tgz",
-      "integrity": "sha512-W15gGl4AWRR3A99Vz7Ap/bQXTTS12c3FWA7cei35Q+fDHN3EqB1LmFMVD6pAtNHsT7duxBAzsC25VUtRHVfTOg==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.41.tgz",
+      "integrity": "sha512-qhbiSNPy6zs8MH+2MB27iOAKj4Ag/qlgYDwQaI7pe3BGydcCGuZ1LsuuNY/rWe8epCHZdcq/M62qxjX3zsfeRw==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "d3-array": "^2.4.0",
         "d3-color": "^1.4.1",
@@ -16393,13 +16396,13 @@
       "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q=="
     },
     "node_modules/@superset-ui/legacy-preset-chart-big-number": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.36.tgz",
-      "integrity": "sha512-AuHydIb3zZttWQkKg6/54uQZPhl3c9tI4ZgbSmeZavEz4oiFPOWQXuO88kkaQjR9ZP577BQJuDJ3XJr3XzPcAw==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.41.tgz",
+      "integrity": "sha512-dbfXODNGXHPBnptW/pMARL1BuCD1R9TSprVfH62qN6CoJ99Wrc5E2XQtBBun3n0TL6831Ebbbljn6sby1d2/1g==",
       "dependencies": {
         "@data-ui/xy-chart": "^0.0.84",
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@types/d3-color": "^1.2.2",
         "@types/shortid": "^0.0.29",
         "d3-color": "^1.2.3",
@@ -16435,13 +16438,13 @@
       }
     },
     "node_modules/@superset-ui/legacy-preset-chart-nvd3": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.36.tgz",
-      "integrity": "sha512-DVvDAG2tg0zy/flPStTewpgp2AsxGyzsqD0Nz7FB7zUTPhte3nEK0Om2VnEwKnPB5C6uouIkjqDqsP18QYTkMA==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.41.tgz",
+      "integrity": "sha512-C7Gb+Dc4nnra6Pid0v8MJ1o5lXzL+mc3TpLZHU9AriECxgseu8k0ln11/f5rmdsv8imu99PiRW+hdTPVkHlCcg==",
       "dependencies": {
         "@data-ui/xy-chart": "^0.0.84",
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "d3-tip": "^0.9.1",
         "dompurify": "^2.0.6",
@@ -16458,12 +16461,12 @@
       }
     },
     "node_modules/@superset-ui/plugin-chart-echarts": {
-      "version": "0.17.38",
-      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.38.tgz",
-      "integrity": "sha512-RCmB2UnuLUxjAWMuvID72IxMOz9Zom0xcdudgDyZcVylAXxKExgO0AMo2V5nbEQ46dEXt0lbt/L1yIx7lB5GSQ==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.41.tgz",
+      "integrity": "sha512-BIao2MrtGXahpohBANGxkYTM/mDGRRwgTp77YTT94v6nNsLP1vQ2uGvKl55Taw8nI0KViCFkpekPe8LdxiTuXA==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@types/mathjs": "^6.0.7",
         "d3-array": "^1.2.0",
         "echarts": "^5.1.1",
@@ -16474,12 +16477,12 @@
       }
     },
     "node_modules/@superset-ui/plugin-chart-pivot-table": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.36.tgz",
-      "integrity": "sha512-l3qhDB8UBnHCK0jCx7YL1IbWyhOPzrJNSRKfuXHI5rbsQqaZuTh3TT0JRmFCUUPK7p7izPQQtoA4VFVG9N0YTw==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.41.tgz",
+      "integrity": "sha512-CbiCde7dkh2aZwdjHmXizZivPjlWdu3jOr4CH1xajdpbC717g+sbxQFvrWFww3Y3I02DLnnJ6WJZH82dNdyXYw==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@superset-ui/react-pivottable": "^0.12.5"
       },
       "peerDependencies": {
@@ -16487,13 +16490,13 @@
       }
     },
     "node_modules/@superset-ui/plugin-chart-table": {
-      "version": "0.17.37",
-      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.37.tgz",
-      "integrity": "sha512-Nw/FcVGiEDvzgyEeXZm7t6QzmEOPOBgmScFN2lnK+DtL9tQq5OrTamPTT6suCwTTDn4mqwNY93OXTY5r/XtXAA==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.41.tgz",
+      "integrity": "sha512-YZ3I8mObMEauHBE+TXA5UQfja80rIZQ8mwn3uN5uuOpES7lxq7DriOoEAQKqPeD23oOWvbY5YengAvvfoCtn4g==",
       "dependencies": {
         "@emotion/core": "^10.0.28",
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@types/d3-array": "^2.9.0",
         "@types/react-table": "^7.0.29",
         "d3-array": "^2.4.0",
@@ -16519,12 +16522,12 @@
       }
     },
     "node_modules/@superset-ui/plugin-chart-word-cloud": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.36.tgz",
-      "integrity": "sha512-WNEWp2fvlI7Qi8yYJUtg8Yz7sPNDPsyCIAwlzWUmHa3lI7pmf+HvfgS5H+MxHUEfFQu4Dp5c9aVNl/nfzbbJ9A==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.41.tgz",
+      "integrity": "sha512-5+3M5drskLtT74A6l2KBTE8jCmomUdtoMyc5RySaHmjSHO89T59IBeWTWndohIeq8XlLZQYNRMkA++djic2Pow==",
       "dependencies": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@types/d3-cloud": "^1.2.1",
         "@types/d3-scale": "^2.0.2",
         "d3-cloud": "^1.2.5",
@@ -16558,14 +16561,14 @@
       }
     },
     "node_modules/@superset-ui/preset-chart-xy": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.36.tgz",
-      "integrity": "sha512-J/7r+O0dtFmN7ipOEIp6/Ra3IKuuSnqEOcQsanoxMfn9OsYw2j5siS7f1CO3upFkrDl2ObFfm/7vecvE9zNTRQ==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.41.tgz",
+      "integrity": "sha512-oboEQfWPBZLWgbZB4UXGdgL94/KR5fPfo7LtOa0BHpWGhObk4tasPiLuRaqOdDDmYOKhL44nkJi0YLZsh3MuZw==",
       "dependencies": {
         "@data-ui/theme": "^0.0.84",
         "@data-ui/xy-chart": "^0.0.84",
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@vx/axis": "^0.0.198",
         "@vx/legend": "^0.0.198",
         "@vx/scale": "^0.0.197",
@@ -18797,7 +18800,6 @@
       "version": "5.5.4",
       "resolved": "https://registry.npmjs.org/@types/react-loadable/-/react-loadable-5.5.4.tgz",
       "integrity": "sha512-otKcjNCfVUzdBMdwOqFITTmBruIXw6GeoZitTBvJ6BMrif8Utu2JLy42GWukNnYI7ewJdncUCooz5Y/1dBz4+w==",
-      "dev": true,
       "dependencies": {
         "@types/react": "*",
         "@types/webpack": "*"
@@ -19034,8 +19036,7 @@
     "node_modules/@types/tapable": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz",
-      "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==",
-      "dev": true
+      "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ=="
     },
     "node_modules/@types/testing-library__jest-dom": {
       "version": "5.9.5",
@@ -19071,7 +19072,6 @@
       "version": "4.39.1",
       "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.39.1.tgz",
       "integrity": "sha512-rgO9ihNu/l72Sjx3shqwc9r6gi+tOMsqxhMEZhOEVIZt82GFOeUyEdpTk1BO2HqEHLS/XJW8ldUTIIfIMMyYFQ==",
-      "dev": true,
       "dependencies": {
         "@types/anymatch": "*",
         "@types/node": "*",
@@ -19109,7 +19109,6 @@
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -71920,21 +71919,22 @@
       }
     },
     "@superset-ui/chart-controls": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.36.tgz",
-      "integrity": "sha512-Mn+Lzol8EqVXJzpfaGeB3UJetZCN7EDS7vOpj+Zczh+oQ9CIpSuyK1RnQyAykyKmPOuMgsq28At332povGQs5A==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.17.41.tgz",
+      "integrity": "sha512-kj1H6LFzN6SWUDKU0hHlpDEYwmGjNg4/okfxsOCewU60y1uoKhl+i+Z1vqKad0iUPZrAlavZCtjebZq1EfTF1w==",
       "requires": {
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/core": "0.17.40",
         "lodash": "^4.17.15",
         "prop-types": "^15.7.2"
       }
     },
     "@superset-ui/core": {
-      "version": "0.17.32",
-      "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.32.tgz",
-      "integrity": "sha512-uaSzlZmolqV3XVDVYYy7sVOB76gMkUrKnc+Wng8BDejzK7Cbr5VicbnNNDNvQuh9llfIop2ptNYAtBcdeqPnig==",
+      "version": "0.17.40",
+      "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.17.40.tgz",
+      "integrity": "sha512-ocYwqhTzIlX9LA4L5aOMIHIDN/WcZcVwjKzWR8UVIU22lBqmt5wuDZJbTwcT+RczCABE9eW4PjsJFJuuTLUpzQ==",
       "requires": {
         "@babel/runtime": "^7.1.2",
+        "@emotion/cache": "^11.1.3",
         "@emotion/core": "^10.0.28",
         "@emotion/react": "^11.1.5",
         "@emotion/styled": "^10.0.27",
@@ -72001,12 +72001,12 @@
       }
     },
     "@superset-ui/legacy-plugin-chart-calendar": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.36.tgz",
-      "integrity": "sha512-nRrtgAjy28Jz89quX6i5tZSzKQqlrFGziJuhs9+yohWb8k7LpBxmL+8m3Y7Qk+P2vlRoSuTlLVYHk8hQuLTulw==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.17.41.tgz",
+      "integrity": "sha512-WOfZ5fuF6Pf109Xo40qw7yzJ/TxF9TQjsHmPpdz0TVQCHujndUjx/9NJQLAbYjLx9TrFjWpM4f9QzsJ9NO2jfw==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3-array": "^2.0.3",
         "d3-selection": "^1.4.0",
         "d3-tip": "^0.9.1",
@@ -72024,24 +72024,24 @@
       }
     },
     "@superset-ui/legacy-plugin-chart-chord": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.36.tgz",
-      "integrity": "sha512-IsuXMiVyJEHQO22M13nmf4GQNQK/IPUaQIdALrrnJB2y5692BWlQr5oFqekaQyUpdl46bWa1m0PTZQDFr/Nxrw==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.17.41.tgz",
+      "integrity": "sha512-3nlqRySwLf+0DYmC92Dy2ia2O+lMWPfxMv57pm0C1WjECPDAjGEdmB/QT9ZtXsF8paA9GtAN1dKzJ1zF1WCaag==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "prop-types": "^15.6.2",
         "react": "^16.13.1"
       }
     },
     "@superset-ui/legacy-plugin-chart-country-map": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.36.tgz",
-      "integrity": "sha512-rkxcJxdEaxR5drQDRrU7NhYF46OIuara4UN3WW2ZfVF92JcRNQUhXVfLEOssTik6wSbGJ2ZZ5RGdVyHmNH6b4w==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.17.41.tgz",
+      "integrity": "sha512-UN8TkC673ntcFv2r7FAT7DL516RKdOaNibDWiQwuBgDfpW9FdnVyyKifEUU6SP9l2YQAoaUKW/zxMpbsWTrjKw==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "d3-array": "^2.0.3",
         "prop-types": "^15.6.2"
@@ -72058,34 +72058,34 @@
       }
     },
     "@superset-ui/legacy-plugin-chart-event-flow": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.36.tgz",
-      "integrity": "sha512-9qECvJcjnsvuEOrNxVGYTc5XSFnz/nRI2D25mJt1TfptYRgAmZ8nbyN3Cu6rq0GFtSjTB/yNtlYQysX025h+rw==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.17.41.tgz",
+      "integrity": "sha512-1r7IazPDQhZ3gN7aSesc5RrJbHZGY6e9/ImN7WpPBGHNHZE4+OfapeYPzg/gaYXt9R/NKb6rQPxXlM+gPZ0i2Q==",
       "requires": {
         "@data-ui/event-flow": "^0.0.84",
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "prop-types": "^15.6.2"
       }
     },
     "@superset-ui/legacy-plugin-chart-force-directed": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.36.tgz",
-      "integrity": "sha512-uEhtf/RJ0U62t8naq4uaAcCO96GxBJRjbjn9PApfX6VrwgJ7ZojPR0Bi4C4norczckvTVl5ZqMzEQ5RXlLD/RA==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.17.41.tgz",
+      "integrity": "sha512-NQ7YbHP6HtcPRoLhTt9RaimZweBxFd4+U2/yQ82bpecFNgBWhDrakWFPG80CAvnV0rQn613xC+lIWE4SvTQoSg==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "prop-types": "^15.7.2"
       }
     },
     "@superset-ui/legacy-plugin-chart-heatmap": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.36.tgz",
-      "integrity": "sha512-1K8SYdiGFaoM0xEqlQxWR6mTpRPS+1f6jCAWTRcddceEIodJedTQ7gK8wgG5683Gp3VnQ8WGprwfhowl/66ZjQ==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.17.41.tgz",
+      "integrity": "sha512-0XzcN6FhMCFXxikQ9eIpSnMpe4hBLlnCh5j3SoSLTcRDYw/2Y92E9MzGdk1fDwQDRJQCt7XCAwOmPx8K5/pjXA==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "d3-svg-legend": "^1.x",
         "d3-tip": "^0.9.1",
@@ -72093,14 +72093,14 @@
       }
     },
     "@superset-ui/legacy-plugin-chart-histogram": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.36.tgz",
-      "integrity": "sha512-9AA1UbhdPII3LrvXXQw/gXULBUoCPilTky/VVeCjzTPfd6gfY2qO440p5dshEmBxFOGZI2VPjKYdunZRZEIE7g==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.17.41.tgz",
+      "integrity": "sha512-MMN6HOk9iGmdbCRsl8cyyEPsrCLaNHGO7BnH/H7yotqEYY9krNT70tkaCGfTZZks1Eci5Uj9yd1ntRyyuUSxaQ==",
       "requires": {
         "@data-ui/histogram": "^0.0.84",
         "@data-ui/theme": "^0.0.84",
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@vx/legend": "^0.0.198",
         "@vx/responsive": "^0.0.199",
         "@vx/scale": "^0.0.197",
@@ -72168,12 +72168,12 @@
       }
     },
     "@superset-ui/legacy-plugin-chart-horizon": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.36.tgz",
-      "integrity": "sha512-04vht34JBBXKxAbKNhpCe3XVlNV4ciexIF+/uyFtG+sObZGoVpBdjotupa6HzZghGSRG39ITkPSSAZlv205WoQ==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.17.41.tgz",
+      "integrity": "sha512-43ZWTEqCFO+0hwwFHOgjz45PAEwsz/RVPP+92EI66/vYdPprbG+Z3ZR59FFw1fRkmR6E8QbI3Ml06uIpV7nDMw==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3-array": "^2.0.3",
         "d3-scale": "^3.0.1",
         "prop-types": "^15.6.2"
@@ -72202,12 +72202,12 @@
       }
     },
     "@superset-ui/legacy-plugin-chart-map-box": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.36.tgz",
-      "integrity": "sha512-MfdUkDxXh7gsoRMC1iu6BKyF8wi9KSfiTwkYLXdWjzpaK7HMHT3Jlbkpu39+SwTDW8NHz51t+BdWf739DoGeuQ==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.17.41.tgz",
+      "integrity": "sha512-S2H1wLy0entwWtrZttUJ/4CAzlOjyOXnQ0Zl+Ho1R+OlWOBl8257mRd0ozUgXuvdSMWf5JLKC7ZRp+rfgCx5XA==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "immutable": "^3.8.2",
         "mapbox-gl": "^0.53.0",
         "prop-types": "^15.6.2",
@@ -72224,118 +72224,118 @@
       }
     },
     "@superset-ui/legacy-plugin-chart-paired-t-test": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.36.tgz",
-      "integrity": "sha512-N0/OFmfVyL+hbzeIlKilbuFuiP2dM4FJ9gzJ+zdvX6t38ZKLRQ7Kewu7rTKvGCLElCVa0eXAY1JDgCtahSXWQA==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.17.41.tgz",
+      "integrity": "sha512-LboljeNgBDxrh3C199uJn3gGfiPUZv1J5GeFObsf26zuIEwD2rkRYOiQcuN2vHc0LzEhjouvdINUnwkYbh0ILQ==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "distributions": "^1.0.0",
         "prop-types": "^15.6.2",
         "reactable": "^1.1.0"
       }
     },
     "@superset-ui/legacy-plugin-chart-parallel-coordinates": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.36.tgz",
-      "integrity": "sha512-f7qQ9zed/TFVyr5Md8hIfF8IpAdZup3QWEAed1bmdwDe9So+jz7B8lwmUMqM/tDy1FD3K0h2EVMuP0Xjojt89g==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.17.41.tgz",
+      "integrity": "sha512-P99o1VfAHcEy8oIZdG+dZ6IGFjNu+P/+A31z+Kubl8+LBlokpRJ96cq1VRWqxS/0qNaqMmc5P0rg+a2gcyOkXQ==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "prop-types": "^15.7.2"
       }
     },
     "@superset-ui/legacy-plugin-chart-partition": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.36.tgz",
-      "integrity": "sha512-8OkD82IN9UhRnoOoRCVhnfHqfvPXW22zXbSR9sKfkXJizne3JoTjX70+lWOGHW/DWjPHiuRZEhDYrJOMBNyjTg==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.17.41.tgz",
+      "integrity": "sha512-Z/awYeDJCpWTbPIj0Qyt+L6y7OnpGITZ9k4vDBSFecjPRHs9er1/hiFLz6BuXGw4UUK3ABJ+/LP0jzEfXyntTA==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "d3-hierarchy": "^1.1.8",
         "prop-types": "^15.6.2"
       }
     },
     "@superset-ui/legacy-plugin-chart-pivot-table": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.36.tgz",
-      "integrity": "sha512-1vhGlxuJMbNAjyIHnGsmfsqMjBFqJqJ57n8heMR1FGkyNPq2RMIgp+PpiuEe0oPznpyyA5KBlMnUuJeRHfjTzg==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.17.41.tgz",
+      "integrity": "sha512-AX6ghgbQEZbK1CRMnv4AU5XM4mFx4b2rco98Tr3kDb1D7f9+R6tIZPCn3dLA/wqjIr23Fw2M1O156rVtoUDgpA==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "datatables.net-bs": "^1.10.15",
         "prop-types": "^15.6.2"
       }
     },
     "@superset-ui/legacy-plugin-chart-rose": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.36.tgz",
-      "integrity": "sha512-7ipsm5YY+euPMo6jNt21sJs4HUQBetOKeM/qPztUxB8061gs9gxhnmivHepiLA0LRPNhLSSdvXVYPX92N4Vy2w==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.17.41.tgz",
+      "integrity": "sha512-Lva5Z6W9talvSQrgrUtZNSh3WMJz3/P3HzHh7lpURKG5/cGMS1uz89edfdhWvvfYRX+FczuXX4AvAhrnAsou3g==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "nvd3": "1.8.6",
         "prop-types": "^15.6.2"
       }
     },
     "@superset-ui/legacy-plugin-chart-sankey": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.36.tgz",
-      "integrity": "sha512-d0FFLrmCmkZ7DPRXZBJLIJSC9a0MyiOcBr3uaefieASbt9KBFltAiFvni0QAWeTTp/dNXJv+YeKgPXzOwBQWZQ==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.17.41.tgz",
+      "integrity": "sha512-ra3uu2VYH9piFLK7J7Llb4M40+xqY4RcqfGRQzP8pXf1vWvWiWlvM1n7MpKVfFTBHBwZo2WwCsJuJLd/mW7szQ==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "d3-sankey": "^0.4.2",
         "prop-types": "^15.6.2"
       }
     },
     "@superset-ui/legacy-plugin-chart-sankey-loop": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.36.tgz",
-      "integrity": "sha512-vM4xM94nz23Cjw42OMG7Igj07nBPzV+E/Tt+tl4nNlNGVetgUF/+aJnEosxx5YkVWvnnF71hst/VMFK5PZQztA==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.17.41.tgz",
+      "integrity": "sha512-o5sVvdi9ZE4mpUac3OUYKa0zazaUeuIMkmEzKjHhhJbG2YQdcFuxI3MDkqydBrzs/Y6o5p7J/vXxqLGKD0dNVQ==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3-sankey-diagram": "^0.7.3",
         "d3-selection": "^1.4.0",
         "prop-types": "^15.6.2"
       }
     },
     "@superset-ui/legacy-plugin-chart-sunburst": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.36.tgz",
-      "integrity": "sha512-/1qM2HMxzyeUTg1CQgsky+Vp9dP84kG5NCaCiD+/JijIt/WEfY5JbqGnKFvcTQFt1qhmqElIQt2lk1UULn0RyQ==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.17.41.tgz",
+      "integrity": "sha512-oEbh+nQsZ1IzZFcVhQXhKjA/jxKitR+xyrlgKumowtK46sger68wEhLQSYm22JnPIBLTWytBh3WSXGMJ3Hl83A==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "prop-types": "^15.6.2"
       }
     },
     "@superset-ui/legacy-plugin-chart-treemap": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.36.tgz",
-      "integrity": "sha512-DBru6j4tj2OO/gAPuDAs/FYL7Q/UXLs1J/MP5k0dhK8ZfZmSVnq5xluu0P8VYK64bRv4GNLv5P+iidAQShXp8Q==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.17.41.tgz",
+      "integrity": "sha512-d5ONdoBWP2JqWMEdSGine16Q0pR5qEFuG2X70ytDbn8+BwrV+YIp+bhd3/Zy4TkML3IRCKjVpionn7Uvj4+PTQ==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3-hierarchy": "^1.1.8",
         "d3-selection": "^1.4.0",
         "prop-types": "^15.6.2"
       }
     },
     "@superset-ui/legacy-plugin-chart-world-map": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.36.tgz",
-      "integrity": "sha512-W15gGl4AWRR3A99Vz7Ap/bQXTTS12c3FWA7cei35Q+fDHN3EqB1LmFMVD6pAtNHsT7duxBAzsC25VUtRHVfTOg==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.17.41.tgz",
+      "integrity": "sha512-qhbiSNPy6zs8MH+2MB27iOAKj4Ag/qlgYDwQaI7pe3BGydcCGuZ1LsuuNY/rWe8epCHZdcq/M62qxjX3zsfeRw==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "d3-array": "^2.4.0",
         "d3-color": "^1.4.1",
@@ -72359,13 +72359,13 @@
       }
     },
     "@superset-ui/legacy-preset-chart-big-number": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.36.tgz",
-      "integrity": "sha512-AuHydIb3zZttWQkKg6/54uQZPhl3c9tI4ZgbSmeZavEz4oiFPOWQXuO88kkaQjR9ZP577BQJuDJ3XJr3XzPcAw==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.17.41.tgz",
+      "integrity": "sha512-dbfXODNGXHPBnptW/pMARL1BuCD1R9TSprVfH62qN6CoJ99Wrc5E2XQtBBun3n0TL6831Ebbbljn6sby1d2/1g==",
       "requires": {
         "@data-ui/xy-chart": "^0.0.84",
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@types/d3-color": "^1.2.2",
         "@types/shortid": "^0.0.29",
         "d3-color": "^1.2.3",
@@ -72398,13 +72398,13 @@
       }
     },
     "@superset-ui/legacy-preset-chart-nvd3": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.36.tgz",
-      "integrity": "sha512-DVvDAG2tg0zy/flPStTewpgp2AsxGyzsqD0Nz7FB7zUTPhte3nEK0Om2VnEwKnPB5C6uouIkjqDqsP18QYTkMA==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.17.41.tgz",
+      "integrity": "sha512-C7Gb+Dc4nnra6Pid0v8MJ1o5lXzL+mc3TpLZHU9AriECxgseu8k0ln11/f5rmdsv8imu99PiRW+hdTPVkHlCcg==",
       "requires": {
         "@data-ui/xy-chart": "^0.0.84",
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "d3": "^3.5.17",
         "d3-tip": "^0.9.1",
         "dompurify": "^2.0.6",
@@ -72418,12 +72418,12 @@
       }
     },
     "@superset-ui/plugin-chart-echarts": {
-      "version": "0.17.38",
-      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.38.tgz",
-      "integrity": "sha512-RCmB2UnuLUxjAWMuvID72IxMOz9Zom0xcdudgDyZcVylAXxKExgO0AMo2V5nbEQ46dEXt0lbt/L1yIx7lB5GSQ==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.17.41.tgz",
+      "integrity": "sha512-BIao2MrtGXahpohBANGxkYTM/mDGRRwgTp77YTT94v6nNsLP1vQ2uGvKl55Taw8nI0KViCFkpekPe8LdxiTuXA==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@types/mathjs": "^6.0.7",
         "d3-array": "^1.2.0",
         "echarts": "^5.1.1",
@@ -72431,23 +72431,23 @@
       }
     },
     "@superset-ui/plugin-chart-pivot-table": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.36.tgz",
-      "integrity": "sha512-l3qhDB8UBnHCK0jCx7YL1IbWyhOPzrJNSRKfuXHI5rbsQqaZuTh3TT0JRmFCUUPK7p7izPQQtoA4VFVG9N0YTw==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-pivot-table/-/plugin-chart-pivot-table-0.17.41.tgz",
+      "integrity": "sha512-CbiCde7dkh2aZwdjHmXizZivPjlWdu3jOr4CH1xajdpbC717g+sbxQFvrWFww3Y3I02DLnnJ6WJZH82dNdyXYw==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@superset-ui/react-pivottable": "^0.12.5"
       }
     },
     "@superset-ui/plugin-chart-table": {
-      "version": "0.17.37",
-      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.37.tgz",
-      "integrity": "sha512-Nw/FcVGiEDvzgyEeXZm7t6QzmEOPOBgmScFN2lnK+DtL9tQq5OrTamPTT6suCwTTDn4mqwNY93OXTY5r/XtXAA==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.17.41.tgz",
+      "integrity": "sha512-YZ3I8mObMEauHBE+TXA5UQfja80rIZQ8mwn3uN5uuOpES7lxq7DriOoEAQKqPeD23oOWvbY5YengAvvfoCtn4g==",
       "requires": {
         "@emotion/core": "^10.0.28",
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@types/d3-array": "^2.9.0",
         "@types/react-table": "^7.0.29",
         "d3-array": "^2.4.0",
@@ -72469,12 +72469,12 @@
       }
     },
     "@superset-ui/plugin-chart-word-cloud": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.36.tgz",
-      "integrity": "sha512-WNEWp2fvlI7Qi8yYJUtg8Yz7sPNDPsyCIAwlzWUmHa3lI7pmf+HvfgS5H+MxHUEfFQu4Dp5c9aVNl/nfzbbJ9A==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.17.41.tgz",
+      "integrity": "sha512-5+3M5drskLtT74A6l2KBTE8jCmomUdtoMyc5RySaHmjSHO89T59IBeWTWndohIeq8XlLZQYNRMkA++djic2Pow==",
       "requires": {
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@types/d3-cloud": "^1.2.1",
         "@types/d3-scale": "^2.0.2",
         "d3-cloud": "^1.2.5",
@@ -72506,14 +72506,14 @@
       }
     },
     "@superset-ui/preset-chart-xy": {
-      "version": "0.17.36",
-      "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.36.tgz",
-      "integrity": "sha512-J/7r+O0dtFmN7ipOEIp6/Ra3IKuuSnqEOcQsanoxMfn9OsYw2j5siS7f1CO3upFkrDl2ObFfm/7vecvE9zNTRQ==",
+      "version": "0.17.41",
+      "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.17.41.tgz",
+      "integrity": "sha512-oboEQfWPBZLWgbZB4UXGdgL94/KR5fPfo7LtOa0BHpWGhObk4tasPiLuRaqOdDDmYOKhL44nkJi0YLZsh3MuZw==",
       "requires": {
         "@data-ui/theme": "^0.0.84",
         "@data-ui/xy-chart": "^0.0.84",
-        "@superset-ui/chart-controls": "0.17.36",
-        "@superset-ui/core": "0.17.32",
+        "@superset-ui/chart-controls": "0.17.41",
+        "@superset-ui/core": "0.17.40",
         "@vx/axis": "^0.0.198",
         "@vx/legend": "^0.0.198",
         "@vx/scale": "^0.0.197",
@@ -74576,7 +74576,6 @@
       "version": "5.5.4",
       "resolved": "https://registry.npmjs.org/@types/react-loadable/-/react-loadable-5.5.4.tgz",
       "integrity": "sha512-otKcjNCfVUzdBMdwOqFITTmBruIXw6GeoZitTBvJ6BMrif8Utu2JLy42GWukNnYI7ewJdncUCooz5Y/1dBz4+w==",
-      "dev": true,
       "requires": {
         "@types/react": "*",
         "@types/webpack": "*"
@@ -74819,8 +74818,7 @@
     "@types/tapable": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz",
-      "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==",
-      "dev": true
+      "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ=="
     },
     "@types/testing-library__jest-dom": {
       "version": "5.9.5",
@@ -74855,7 +74853,6 @@
       "version": "4.39.1",
       "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.39.1.tgz",
       "integrity": "sha512-rgO9ihNu/l72Sjx3shqwc9r6gi+tOMsqxhMEZhOEVIZt82GFOeUyEdpTk1BO2HqEHLS/XJW8ldUTIIfIMMyYFQ==",
-      "dev": true,
       "requires": {
         "@types/anymatch": "*",
         "@types/node": "*",
@@ -74868,8 +74865,7 @@
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
         }
       }
     },
diff --git a/superset-frontend/package.json b/superset-frontend/package.json
index 9932945..8476380 100644
--- a/superset-frontend/package.json
+++ b/superset-frontend/package.json
@@ -65,35 +65,36 @@
     "@babel/runtime-corejs3": "^7.12.5",
     "@data-ui/sparkline": "^0.0.84",
     "@emotion/core": "^10.0.35",
-    "@superset-ui/chart-controls": "^0.17.36",
-    "@superset-ui/core": "^0.17.32",
-    "@superset-ui/legacy-plugin-chart-calendar": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-chord": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-country-map": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-histogram": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-horizon": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-map-box": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-partition": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-rose": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-sankey": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-treemap": "^0.17.36",
-    "@superset-ui/legacy-plugin-chart-world-map": "^0.17.36",
-    "@superset-ui/legacy-preset-chart-big-number": "^0.17.36",
+    "@emotion/react": "^11.1.5",
+    "@superset-ui/chart-controls": "^0.17.41",
+    "@superset-ui/core": "^0.17.40",
+    "@superset-ui/legacy-plugin-chart-calendar": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-chord": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-country-map": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-event-flow": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-force-directed": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-heatmap": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-histogram": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-horizon": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-map-box": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-partition": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-rose": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-sankey": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-sunburst": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-treemap": "^0.17.41",
+    "@superset-ui/legacy-plugin-chart-world-map": "^0.17.41",
+    "@superset-ui/legacy-preset-chart-big-number": "^0.17.41",
     "@superset-ui/legacy-preset-chart-deckgl": "^0.4.6",
-    "@superset-ui/legacy-preset-chart-nvd3": "^0.17.36",
-    "@superset-ui/plugin-chart-echarts": "^0.17.38",
-    "@superset-ui/plugin-chart-pivot-table": "^0.17.36",
-    "@superset-ui/plugin-chart-table": "^0.17.37",
-    "@superset-ui/plugin-chart-word-cloud": "^0.17.36",
-    "@superset-ui/preset-chart-xy": "^0.17.36",
+    "@superset-ui/legacy-preset-chart-nvd3": "^0.17.41",
+    "@superset-ui/plugin-chart-echarts": "^0.17.41",
+    "@superset-ui/plugin-chart-pivot-table": "^0.17.41",
+    "@superset-ui/plugin-chart-table": "^0.17.41",
+    "@superset-ui/plugin-chart-word-cloud": "^0.17.41",
+    "@superset-ui/preset-chart-xy": "^0.17.41",
     "@vx/responsive": "^0.0.195",
     "abortcontroller-polyfill": "^1.1.9",
     "antd": "^4.9.4",
diff --git a/superset-frontend/webpack.config.js b/superset-frontend/webpack.config.js
index a43d90a..24bb3d0 100644
--- a/superset-frontend/webpack.config.js
+++ b/superset-frontend/webpack.config.js
@@ -294,7 +294,6 @@ const config = {
       // Both `@emotion/core` and `@superset-ui/core` remember some globals within
       // module after imported, which will not be available everywhere if two
       // different copies of the same module are imported in different places.
-      '@emotion/core': path.resolve(APP_DIR, './node_modules/@emotion/core'),
       '@superset-ui/core': path.resolve(
         APP_DIR,
         './node_modules/@superset-ui/core',
@@ -478,6 +477,15 @@ if (isDevMode) {
     contentBase: path.join(process.cwd(), '../static/assets'),
   };
 
+  // make sure to use @emotion/* modules in the root directory
+  fs.readdirSync(path.resolve(APP_DIR, './node_modules/@emotion'), pkg => {
+    config.resolve.alias[pkg] = path.resolve(
+      APP_DIR,
+      './node_modules/@emotion',
+      pkg,
+    );
+  });
+
   // find all the symlinked plugins and use their source code for imports
   let hasSymlink = false;
   Object.entries(packageConfig.dependencies).forEach(([pkg, version]) => {