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

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


The following commit(s) were added to refs/heads/master by this push:
     new 765e9dd  feat(native-filters): apply cascading without instant 
filtering (#14966)
765e9dd is described below

commit 765e9dd93259fbf2ded9117017704e3fd5cd86d8
Author: Ville Brofeldt <[email protected]>
AuthorDate: Thu Jun 3 17:48:46 2021 +0300

    feat(native-filters): apply cascading without instant filtering (#14966)
---
 .../CascadeFilters/CascadeFilterControl/index.tsx   |  5 +++++
 .../CascadeFilters/CascadePopover/index.tsx         | 16 ++++++++--------
 .../FilterBar/FilterControls/FilterControl.tsx      |  2 ++
 .../FilterBar/FilterControls/FilterControls.tsx     |  5 +++--
 .../FilterBar/FilterControls/FilterValue.tsx        |  3 ++-
 .../nativeFilters/FilterBar/FilterControls/state.ts | 17 +++++++++++------
 .../nativeFilters/FilterBar/FilterControls/types.ts |  2 ++
 .../components/nativeFilters/FilterBar/index.tsx    | 21 ++-------------------
 8 files changed, 35 insertions(+), 36 deletions(-)

diff --git 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadeFilterControl/index.tsx
 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadeFilterControl/index.tsx
index 1ac1fb3..9190882 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadeFilterControl/index.tsx
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/CascadeFilterControl/index.tsx
@@ -22,8 +22,10 @@ import Icon from 'src/components/Icon';
 import FilterControl from 
'src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl';
 import { CascadeFilter } from 
'src/dashboard/components/nativeFilters/FilterBar/CascadeFilters/types';
 import { Filter } from 'src/dashboard/components/nativeFilters/types';
+import { DataMaskStateWithId } from 'src/dataMask/types';
 
 export interface CascadeFilterControlProps {
+  dataMaskSelected?: DataMaskStateWithId;
   filter: CascadeFilter;
   directPathToChild?: string[];
   onFilterSelectionChange: (filter: Filter, dataMask: DataMask) => void;
@@ -45,6 +47,7 @@ const StyledCaretIcon = styled(Icon)`
 `;
 
 const CascadeFilterControl: React.FC<CascadeFilterControlProps> = ({
+  dataMaskSelected,
   filter,
   directPathToChild,
   onFilterSelectionChange,
@@ -53,6 +56,7 @@ const CascadeFilterControl: 
React.FC<CascadeFilterControlProps> = ({
     <StyledFilterControlBox>
       <StyledCaretIcon name="caret-down" />
       <FilterControl
+        dataMaskSelected={dataMaskSelected}
         filter={filter}
         directPathToChild={directPathToChild}
         onFilterSelectionChange={onFilterSelectionChange}
@@ -63,6 +67,7 @@ const CascadeFilterControl: 
React.FC<CascadeFilterControlProps> = ({
       {filter.cascadeChildren?.map(childFilter => (
         <li key={childFilter.id}>
           <CascadeFilterControl
+            dataMaskSelected={dataMaskSelected}
             filter={childFilter}
             directPathToChild={directPathToChild}
             onFilterSelectionChange={onFilterSelectionChange}
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 f256108..2bd5c6f 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
@@ -21,16 +21,14 @@ import { styled, t, DataMask } from '@superset-ui/core';
 import Popover from 'src/components/Popover';
 import Icon from 'src/components/Icon';
 import { Pill } from 'src/dashboard/components/FiltersBadge/Styles';
-import { useSelector } from 'react-redux';
-import { getInitialDataMask } from 'src/dataMask/reducer';
-import { DataMaskWithId } from 'src/dataMask/types';
+import { DataMaskStateWithId } from 'src/dataMask/types';
 import FilterControl from 
'src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl';
 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 {
+  dataMaskSelected: DataMaskStateWithId;
   filter: CascadeFilter;
   visible: boolean;
   directPathToChild?: string[];
@@ -76,6 +74,7 @@ const StyledPill = styled(Pill)`
 `;
 
 const CascadePopover: React.FC<CascadePopoverProps> = ({
+  dataMaskSelected,
   filter,
   visible,
   onVisibleChange,
@@ -83,9 +82,7 @@ const CascadePopover: React.FC<CascadePopoverProps> = ({
   directPathToChild,
 }) => {
   const [currentPathToChild, setCurrentPathToChild] = useState<string[]>();
-  const dataMask = useSelector<RootState, DataMaskWithId>(
-    state => state.dataMask[filter.id] ?? getInitialDataMask(filter.id),
-  );
+  const dataMask = dataMaskSelected[filter.id];
 
   useEffect(() => {
     setCurrentPathToChild(directPathToChild);
@@ -98,7 +95,7 @@ const CascadePopover: React.FC<CascadePopoverProps> = ({
   const getActiveChildren = useCallback(
     (filter: CascadeFilter): CascadeFilter[] | null => {
       const children = filter.cascadeChildren || [];
-      const currentValue = dataMask.filterState?.value;
+      const currentValue = dataMask?.filterState?.value;
 
       const activeChildren = children.flatMap(
         childFilter => getActiveChildren(childFilter) || [],
@@ -147,6 +144,7 @@ const CascadePopover: React.FC<CascadePopoverProps> = ({
   if (!filter.cascadeChildren?.length) {
     return (
       <FilterControl
+        dataMaskSelected={dataMaskSelected}
         filter={filter}
         directPathToChild={directPathToChild}
         onFilterSelectionChange={onFilterSelectionChange}
@@ -166,6 +164,7 @@ const CascadePopover: React.FC<CascadePopoverProps> = ({
 
   const content = (
     <CascadeFilterControl
+      dataMaskSelected={dataMaskSelected}
       data-test="cascade-filters-control"
       key={filter.id}
       filter={filter}
@@ -188,6 +187,7 @@ const CascadePopover: React.FC<CascadePopoverProps> = ({
       <div>
         {activeFilters.map(activeFilter => (
           <FilterControl
+            dataMaskSelected={dataMaskSelected}
             key={activeFilter.id}
             filter={activeFilter}
             onFilterSelectionChange={onFilterSelectionChange}
diff --git 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl.tsx
 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl.tsx
index 157f50e..14dc65b 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl.tsx
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControl.tsx
@@ -42,6 +42,7 @@ const StyledFilterControlContainer = styled.div`
 `;
 
 const FilterControl: React.FC<FilterProps> = ({
+  dataMaskSelected,
   filter,
   icon,
   onFilterSelectionChange,
@@ -57,6 +58,7 @@ const FilterControl: React.FC<FilterProps> = ({
         <div data-test="filter-icon">{icon}</div>
       </StyledFilterControlTitleBox>
       <FilterValue
+        dataMaskSelected={dataMaskSelected}
         filter={filter}
         directPathToChild={directPathToChild}
         onFilterSelectionChange={onFilterSelectionChange}
diff --git 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx
 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx
index ded4b1f..21fe5c2 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterControls.tsx
@@ -21,7 +21,7 @@ import { DataMask, styled, t } from '@superset-ui/core';
 import { css } from '@emotion/react';
 import { useSelector } from 'react-redux';
 import * as portals from 'react-reverse-portal';
-import { DataMaskState } from 'src/dataMask/types';
+import { DataMaskStateWithId } from 'src/dataMask/types';
 import { Collapse } from 'src/common/components';
 import { TAB_TYPE } from 'src/dashboard/util/componentTypes';
 import { RootState } from 'src/dashboard/types';
@@ -41,7 +41,7 @@ const Wrapper = styled.div`
 
 type FilterControlsProps = {
   directPathToChild?: string[];
-  dataMaskSelected: DataMaskState;
+  dataMaskSelected: DataMaskStateWithId;
   onFilterSelectionChange: (filter: Filter, dataMask: DataMask) => void;
 };
 
@@ -101,6 +101,7 @@ const FilterControls: FC<FilterControlsProps> = ({
             <CascadePopover
               data-test="cascade-filters-control"
               key={cascadeFilters[index].id}
+              dataMaskSelected={dataMaskSelected}
               visible={visiblePopoverId === cascadeFilters[index].id}
               onVisibleChange={visible =>
                 setVisiblePopoverId(visible ? cascadeFilters[index].id : null)
diff --git 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx
 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx
index d6e146b..495f50f 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterValue.tsx
@@ -53,13 +53,14 @@ const FilterItem = styled.div`
 `;
 
 const FilterValue: React.FC<FilterProps> = ({
+  dataMaskSelected,
   filter,
   directPathToChild,
   onFilterSelectionChange,
 }) => {
   const { id, targets, filterType, adhoc_filters, time_range } = filter;
   const metadata = getChartMetadataRegistry().get(filterType);
-  const cascadingFilters = useCascadingFilters(id);
+  const cascadingFilters = useCascadingFilters(id, dataMaskSelected);
   const [state, setState] = useState<ChartDataResponseResult[]>([]);
   const [error, setError] = useState<string>('');
   const [formData, setFormData] = useState<Partial<QueryFormData>>({});
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 7be5835..1aaf772 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/state.ts
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/state.ts
@@ -18,22 +18,27 @@
  */
 import { useSelector } from 'react-redux';
 import { NativeFiltersState } from 'src/dashboard/reducers/types';
+import { DataMaskStateWithId } from 'src/dataMask/types';
+import { ExtraFormData } from '@superset-ui/core';
 import { mergeExtraFormData } from '../../utils';
-import { useNativeFiltersDataMask } from '../state';
 
 // eslint-disable-next-line import/prefer-default-export
-export function useCascadingFilters(id: string) {
+export function useCascadingFilters(
+  id: string,
+  dataMaskSelected?: DataMaskStateWithId,
+): ExtraFormData {
   const { filters } = useSelector<any, NativeFiltersState>(
     state => state.nativeFilters,
   );
   const filter = filters[id];
   const cascadeParentIds: string[] = filter?.cascadeParentIds ?? [];
   let cascadedFilters = {};
-  const nativeFiltersDataMask = useNativeFiltersDataMask();
   cascadeParentIds.forEach(parentId => {
-    const parentState = nativeFiltersDataMask[parentId] || {};
-    const { extraFormData: parentExtra = {} } = parentState;
-    cascadedFilters = mergeExtraFormData(cascadedFilters, parentExtra);
+    const parentState = dataMaskSelected?.[parentId];
+    cascadedFilters = mergeExtraFormData(
+      cascadedFilters,
+      parentState?.extraFormData,
+    );
   });
   return cascadedFilters;
 }
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 0b39dd2..93bf76d 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/types.ts
@@ -18,9 +18,11 @@
  */
 import React from 'react';
 import { DataMask } from '@superset-ui/core';
+import { DataMaskStateWithId } from 'src/dataMask/types';
 import { Filter } from '../../types';
 
 export interface FilterProps {
+  dataMaskSelected?: DataMaskStateWithId;
   filter: Filter & {
     dataMask?: DataMask;
   };
diff --git 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx
index 50c16e9..44a4f82 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/index.tsx
@@ -19,7 +19,7 @@
 
 /* eslint-disable no-param-reassign */
 import { HandlerFunction, styled, t } from '@superset-ui/core';
-import React, { useEffect, useMemo, useState } from 'react';
+import React, { useEffect, useState } from 'react';
 import { useDispatch } from 'react-redux';
 import cx from 'classnames';
 import Icon from 'src/components/Icon';
@@ -37,11 +37,7 @@ import { testWithId } from 'src/utils/testUtils';
 import { Filter } from 'src/dashboard/components/nativeFilters/types';
 import Loading from 'src/components/Loading';
 import { getInitialDataMask } from 'src/dataMask/reducer';
-import {
-  getOnlyExtraFormData,
-  mapParentFiltersToChildren,
-  TabIds,
-} from './utils';
+import { getOnlyExtraFormData, TabIds } from './utils';
 import FilterSets from './FilterSets';
 import {
   useNativeFiltersDataMask,
@@ -175,10 +171,6 @@ const FilterBar: React.FC<FiltersBarProps> = ({
   const filterValues = Object.values<Filter>(filters);
   const dataMaskApplied: DataMaskStateWithId = useNativeFiltersDataMask();
   const [isFilterSetChanged, setIsFilterSetChanged] = useState(false);
-  const cascadeChildren = useMemo(
-    () => mapParentFiltersToChildren(filterValues),
-    [filterValues],
-  );
 
   useEffect(() => {
     setDataMaskSelected(() => dataMaskApplied);
@@ -190,15 +182,6 @@ const FilterBar: React.FC<FiltersBarProps> = ({
   ) => {
     setIsFilterSetChanged(tab !== TabIds.AllFilters);
     setDataMaskSelected(draft => {
-      const children = cascadeChildren[filter.id] || [];
-      // force instant updating on initialization or for parent filters when 
dataMaskSelected has filter
-      if (
-        dataMaskSelected[filter.id] &&
-        (filter.isInstant || children.length > 0)
-      ) {
-        dispatch(updateDataMask(filter.id, dataMask));
-      }
-
       draft[filter.id] = {
         ...(getInitialDataMask(filter.id) as DataMaskWithId),
         ...dataMask,

Reply via email to