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

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

commit e27f85821eac9ab83b39a289d6466794844119e9
Author: Ville Brofeldt <33317356+ville...@users.noreply.github.com>
AuthorDate: Fri Jul 2 17:04:05 2021 +0300

    feat(cross-filters): add option to clear set cross filters (#15500)
    
    * feat(cross-filters): add option to clear set cross filters
    
    * lint
    
    * fix indicator size, remove bolded text and rephrase text
    
    (cherry picked from commit ee2ee486619d9f3fb5584d0c0a6cf583185a1809)
---
 .../FiltersBadge/FilterIndicator/index.tsx         | 26 +++++++++++++---------
 .../dashboard/components/FiltersBadge/Styles.tsx   | 10 +++++++++
 .../src/dashboard/components/SliceHeader/index.tsx | 13 +++++++++--
 .../nativeFilters/FilterBar/Header/index.tsx       | 14 ++----------
 superset-frontend/src/dataMask/actions.ts          | 16 +++++++++++--
 superset-frontend/src/dataMask/reducer.ts          |  7 ++++--
 6 files changed, 58 insertions(+), 28 deletions(-)

diff --git 
a/superset-frontend/src/dashboard/components/FiltersBadge/FilterIndicator/index.tsx
 
b/superset-frontend/src/dashboard/components/FiltersBadge/FilterIndicator/index.tsx
index f962a72..e94bca3 100644
--- 
a/superset-frontend/src/dashboard/components/FiltersBadge/FilterIndicator/index.tsx
+++ 
b/superset-frontend/src/dashboard/components/FiltersBadge/FilterIndicator/index.tsx
@@ -21,6 +21,7 @@ import { SearchOutlined } from '@ant-design/icons';
 import React, { FC } from 'react';
 import { getFilterValueForDisplay } from 
'src/dashboard/components/nativeFilters/FilterBar/FilterSets/utils';
 import {
+  FilterIndicatorText,
   FilterValue,
   Item,
   ItemIcon,
@@ -31,24 +32,29 @@ import { Indicator } from 
'src/dashboard/components/FiltersBadge/selectors';
 export interface IndicatorProps {
   indicator: Indicator;
   onClick?: (path: string[]) => void;
+  text?: string;
 }
 
 const FilterIndicator: FC<IndicatorProps> = ({
   indicator: { column, name, value, path = [] },
   onClick = () => {},
+  text,
 }) => {
   const resultValue = getFilterValueForDisplay(value);
   return (
-    <Item onClick={() => onClick([...path, `LABEL-${column}`])}>
-      <Title bold>
-        <ItemIcon>
-          <SearchOutlined />
-        </ItemIcon>
-        {name}
-        {resultValue ? ': ' : ''}
-      </Title>
-      <FilterValue>{resultValue}</FilterValue>
-    </Item>
+    <>
+      <Item onClick={() => onClick([...path, `LABEL-${column}`])}>
+        <Title bold>
+          <ItemIcon>
+            <SearchOutlined />
+          </ItemIcon>
+          {name}
+          {resultValue ? ': ' : ''}
+        </Title>
+        <FilterValue>{resultValue}</FilterValue>
+      </Item>
+      {text && <FilterIndicatorText>{text}</FilterIndicatorText>}
+    </>
   );
 };
 
diff --git a/superset-frontend/src/dashboard/components/FiltersBadge/Styles.tsx 
b/superset-frontend/src/dashboard/components/FiltersBadge/Styles.tsx
index 74ffd19..928996d 100644
--- a/superset-frontend/src/dashboard/components/FiltersBadge/Styles.tsx
+++ b/superset-frontend/src/dashboard/components/FiltersBadge/Styles.tsx
@@ -153,3 +153,13 @@ export const FilterValue = styled.div`
   overflow: auto;
   color: ${({ theme }) => theme.colors.grayscale.light5};
 `;
+
+export const FilterIndicatorText = styled.div`
+  ${({ theme }) => `
+  padding-top: ${theme.gridUnit * 3}px;
+  max-width: 100%;
+  flex-grow: 1;
+  overflow: auto;
+  color: ${theme.colors.grayscale.light5};
+  `}
+`;
diff --git a/superset-frontend/src/dashboard/components/SliceHeader/index.tsx 
b/superset-frontend/src/dashboard/components/SliceHeader/index.tsx
index 2e0e234..87425ec 100644
--- a/superset-frontend/src/dashboard/components/SliceHeader/index.tsx
+++ b/superset-frontend/src/dashboard/components/SliceHeader/index.tsx
@@ -19,13 +19,14 @@
 import React, { FC } from 'react';
 import { styled, t } from '@superset-ui/core';
 import { Tooltip } from 'src/components/Tooltip';
-import { useSelector } from 'react-redux';
+import { useDispatch, useSelector } from 'react-redux';
 import EditableTitle from 'src/components/EditableTitle';
 import SliceHeaderControls from 'src/dashboard/components/SliceHeaderControls';
 import FiltersBadge from 'src/dashboard/components/FiltersBadge';
 import Icon from 'src/components/Icon';
 import { RootState } from 'src/dashboard/types';
 import FilterIndicator from 
'src/dashboard/components/FiltersBadge/FilterIndicator';
+import { clearDataMask } from 'src/dataMask/actions';
 
 type SliceHeaderProps = {
   innerRef?: string;
@@ -70,9 +71,12 @@ const annotationsError = t('One ore more annotation layers 
failed loading.');
 
 const CrossFilterIcon = styled(Icon)`
   fill: ${({ theme }) => theme.colors.grayscale.light5};
+  cursor: pointer;
   & circle {
     fill: ${({ theme }) => theme.colors.primary.base};
   }
+  height: 22px;
+  width: 22px;
 `;
 
 const SliceHeader: FC<SliceHeaderProps> = ({
@@ -105,6 +109,7 @@ const SliceHeader: FC<SliceHeaderProps> = ({
   chartStatus,
   formData,
 }) => {
+  const dispatch = useDispatch();
   // TODO: change to indicator field after it will be implemented
   const crossFilterValue = useSelector<RootState, any>(
     state => state.dataMask[slice?.slice_id]?.filterState?.value,
@@ -164,10 +169,14 @@ const SliceHeader: FC<SliceHeaderProps> = ({
                       value: crossFilterValue,
                       name: t('Emitted values'),
                     }}
+                    text={t('Click to clear emitted filters')}
                   />
                 }
               >
-                <CrossFilterIcon name="cross-filter-badge" />
+                <CrossFilterIcon
+                  name="cross-filter-badge"
+                  onClick={() => dispatch(clearDataMask(slice?.slice_id))}
+                />
               </Tooltip>
             )}
             <FiltersBadge chartId={slice.slice_id} />
diff --git 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx
 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx
index cc10572..e1d273e 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Header/index.tsx
@@ -21,9 +21,8 @@ import { styled, t, useTheme } from '@superset-ui/core';
 import React, { FC } from 'react';
 import Icons from 'src/components/Icons';
 import Button from 'src/components/Button';
-import { updateDataMask } from 'src/dataMask/actions';
+import { clearDataMask } from 'src/dataMask/actions';
 import { useDispatch, useSelector } from 'react-redux';
-import { getInitialDataMask } from 'src/dataMask/reducer';
 import { DataMaskState, DataMaskStateWithId } from 'src/dataMask/types';
 import FilterConfigurationLink from 
'src/dashboard/components/nativeFilters/FilterBar/FilterConfigurationLink';
 import { useFilters } from 
'src/dashboard/components/nativeFilters/FilterBar/state';
@@ -93,16 +92,7 @@ const Header: FC<HeaderProps> = ({
     const filterIds = Object.keys(dataMaskSelected);
     filterIds.forEach(filterId => {
       if (dataMaskSelected[filterId]) {
-        dispatch(
-          updateDataMask(
-            filterId,
-            getInitialDataMask(filterId, {
-              filterState: {
-                value: null,
-              },
-            }),
-          ),
-        );
+        dispatch(clearDataMask(filterId));
       }
     });
   };
diff --git a/superset-frontend/src/dataMask/actions.ts 
b/superset-frontend/src/dataMask/actions.ts
index 76a286c..1b7428f 100644
--- a/superset-frontend/src/dataMask/actions.ts
+++ b/superset-frontend/src/dataMask/actions.ts
@@ -20,11 +20,12 @@ import { DataMask } from '@superset-ui/core';
 import { FilterConfiguration } from 
'../dashboard/components/nativeFilters/types';
 import { FeatureFlag, isFeatureEnabled } from '../featureFlags';
 import { Filters } from '../dashboard/reducers/types';
+import { getInitialDataMask } from './reducer';
 
 export const UPDATE_DATA_MASK = 'UPDATE_DATA_MASK';
 export interface UpdateDataMask {
   type: typeof UPDATE_DATA_MASK;
-  filterId: string;
+  filterId: string | number;
   dataMask: DataMask;
 }
 
@@ -55,7 +56,7 @@ export function setDataMaskForFilterConfigComplete(
   };
 }
 export function updateDataMask(
-  filterId: string,
+  filterId: string | number,
   dataMask: DataMask,
 ): UpdateDataMask {
   // Only apply data mask if one of the relevant features is enabled
@@ -69,6 +70,17 @@ export function updateDataMask(
   };
 }
 
+export function clearDataMask(filterId: string | number) {
+  return updateDataMask(
+    filterId,
+    getInitialDataMask(filterId, {
+      filterState: {
+        value: null,
+      },
+    }),
+  );
+}
+
 export type AnyDataMaskAction =
   | UpdateDataMask
   | SetDataMaskForFilterConfigFail
diff --git a/superset-frontend/src/dataMask/reducer.ts 
b/superset-frontend/src/dataMask/reducer.ts
index 81c55a3..4a4e240 100644
--- a/superset-frontend/src/dataMask/reducer.ts
+++ b/superset-frontend/src/dataMask/reducer.ts
@@ -37,9 +37,12 @@ import {
 import { areObjectsEqual } from '../reduxUtils';
 import { Filters } from '../dashboard/reducers/types';
 
-export function getInitialDataMask(id?: string, moreProps?: DataMask): 
DataMask;
 export function getInitialDataMask(
-  id: string,
+  id?: string | number,
+  moreProps?: DataMask,
+): DataMask;
+export function getInitialDataMask(
+  id: string | number,
   moreProps: DataMask = {},
 ): DataMaskWithId {
   let otherProps = {};

Reply via email to