This is an automated email from the ASF dual-hosted git repository.
amitmiran 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 ee2ee48 feat(cross-filters): add option to clear set cross filters
(#15500)
ee2ee48 is described below
commit ee2ee486619d9f3fb5584d0c0a6cf583185a1809
Author: Ville Brofeldt <[email protected]>
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
---
.../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 = {};