Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(native-filters): Update filter bar buttons #13506

Merged
merged 29 commits into from
Mar 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
2731518
refactor(native-filters): move data mask to root reducer
simcha90 Mar 3, 2021
de6a332
Merge branch 'master' of github.com:apache/superset into filtersState…
simcha90 Mar 3, 2021
6652d19
refactor: update rest stuff for dataMask
simcha90 Mar 3, 2021
266a0a3
refactor: add ownCrrentState to explore
simcha90 Mar 3, 2021
5344dd4
fix: fix immer reducer
simcha90 Mar 4, 2021
2b4bd8f
Merge branch 'master' of github.com:apache/superset into filtersState…
simcha90 Mar 4, 2021
dabfd24
fix: merge with master
simcha90 Mar 4, 2021
802823c
refactor: support explore dataMask
simcha90 Mar 4, 2021
8aed240
refactor: support explore dataMask
simcha90 Mar 4, 2021
a0fa114
docs: add comment
simcha90 Mar 4, 2021
eaec7ef
refactor: remove json stringify
simcha90 Mar 4, 2021
cba3467
fix: fix failed cases
simcha90 Mar 4, 2021
04d6398
feat: filter bat buttons start
simcha90 Mar 4, 2021
af9e35a
fix: fix CR notes
simcha90 Mar 4, 2021
64fb87d
fix: fix cascade filters
simcha90 Mar 4, 2021
57c954f
fix: fix CR notes
simcha90 Mar 4, 2021
bd9b767
Merge branch 'filtersState_to_data_mask' of github.com:simchaNielsen/…
simcha90 Mar 4, 2021
bff44d1
refactor: add clear all
simcha90 Mar 7, 2021
09b594a
fix: fix CR notes
simcha90 Mar 7, 2021
c522391
Merge branch 'master' of github.com:apache/superset into filtersState…
simcha90 Mar 7, 2021
1bf1552
Merge branch 'filtersState_to_data_mask' of github.com:simchaNielsen/…
simcha90 Mar 7, 2021
0527067
fix: fix CR notes
simcha90 Mar 7, 2021
9abe26e
Merge branch 'filtersState_to_data_mask' of github.com:simchaNielsen/…
simcha90 Mar 7, 2021
2d12c37
fix: fix CR notes
simcha90 Mar 7, 2021
84d8cbd
Merge branch 'filtersState_to_data_mask' of github.com:simchaNielsen/…
simcha90 Mar 7, 2021
a9202b1
feat: buttons in filter bar
simcha90 Mar 7, 2021
9ae46b9
Merge branch 'master' of github.com:apache/superset into filter_bar_a…
simcha90 Mar 7, 2021
cdcae95
lint: update imports
simcha90 Mar 7, 2021
6151550
test: fix tests
simcha90 Mar 7, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions superset-frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions superset-frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@
"rison": "^0.1.1",
"shortid": "^2.2.6",
"urijs": "^1.19.4",
"use-immer": "^0.4.2",
"use-query-params": "^1.1.9"
},
"devDependencies": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,9 @@ describe('FilterBar', () => {
expect(wrapper.find({ name: 'filter' })).toExist();
expect(wrapper.find({ name: 'collapse' })).toExist();
});
it('has apply and reset all buttons', () => {
it('has apply and clear all buttons', () => {
expect(wrapper.find(Button).length).toBe(2);
expect(wrapper.find(Button).at(0)).toHaveProp('buttonStyle', 'secondary');
expect(wrapper.find(Button).at(0)).toHaveProp('buttonStyle', 'tertiary');
expect(wrapper.find(Button).at(1)).toHaveProp('buttonStyle', 'primary');
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
* specific language governing permissions and limitations
* under the License.
*/

/* eslint-disable no-param-reassign */
import { styled, t, tn } from '@superset-ui/core';
import React, { useState, useEffect, useMemo, ChangeEvent } from 'react';
import { useDispatch, useSelector } from 'react-redux';
Expand All @@ -33,8 +35,11 @@ import {
DataMaskUnit,
DataMaskState,
} from 'src/dataMask/types';
import { useImmer } from 'use-immer';
import { getInitialMask } from 'src/dataMask/reducer';
import { areObjectsEqual } from 'src/reduxUtils';
import FilterConfigurationLink from './FilterConfigurationLink';
import { useFilters, useFilterSets } from './state';
import { useFilterSets } from './state';
import { useFilterConfiguration } from '../state';
import { Filter } from '../types';
import {
Expand All @@ -48,6 +53,7 @@ const barWidth = `250px`;

const BarWrapper = styled.div`
width: ${({ theme }) => theme.gridUnit * 8}px;

&.open {
width: ${barWidth}; // arbitrary...
}
Expand All @@ -70,6 +76,7 @@ const Bar = styled.div`
transition: transform ${({ theme }) => theme.transitionTiming}s;
transition-delay: 0s;
} */

&.open {
display: flex;
/* &.animated {
Expand All @@ -85,6 +92,7 @@ const StyledTitle = styled.h4`
color: ${({ theme }) => theme.colors.grayscale.dark1};
margin: 0;
overflow-wrap: break-word;

& > .ant-select {
width: 100%;
}
Expand All @@ -105,6 +113,7 @@ const CollapsedBar = styled.div`
transition: transform ${({ theme }) => theme.transitionTiming}s;
transition-delay: 0s;
} */

&.open {
display: flex;
flex-direction: column;
Expand All @@ -115,6 +124,7 @@ const CollapsedBar = styled.div`
transition-delay: ${({ theme }) => theme.transitionTiming * 3}s;
} */
}

svg {
width: ${({ theme }) => theme.gridUnit * 4}px;
height: ${({ theme }) => theme.gridUnit * 4}px;
Expand All @@ -141,30 +151,38 @@ const TitleArea = styled.h4`
flex-direction: row;
justify-content: space-between;
margin: 0;
padding: ${({ theme }) => theme.gridUnit * 4}px;
padding: ${({ theme }) => theme.gridUnit * 2}px;

& > span {
flex-grow: 1;
}

& :not(:first-child) {
margin-left: ${({ theme }) => theme.gridUnit}px;

&:hover {
cursor: pointer;
}
}
`;

const ActionButtons = styled.div`
display: flex;
display: grid;
flex-direction: row;
justify-content: space-around;
padding: ${({ theme }) => theme.gridUnit * 4}px;
padding-top: 0;
grid-template-columns: 1fr 1fr;
${({ theme }) =>
`padding: 0 ${theme.gridUnit * 2}px ${theme.gridUnit * 2}px`};
border-bottom: 1px solid ${({ theme }) => theme.colors.grayscale.light2};

.btn {
flex: 1 1 50%;
flex: 1;
}
`;

const Sets = styled(ActionButtons)`
grid-template-columns: 1fr;
`;

const FilterControls = styled.div`
padding: ${({ theme }) => theme.gridUnit * 4}px;
`;
Expand All @@ -180,7 +198,11 @@ const FilterBar: React.FC<FiltersBarProps> = ({
toggleFiltersBar,
directPathToChild,
}) => {
const [filterData, setFilterData] = useState<DataMaskUnit>({});
const [filterData, setFilterData] = useImmer<DataMaskUnit>({});
const [
lastAppliedFilterData,
setLastAppliedFilterData,
] = useImmer<DataMaskUnit>({});
const dispatch = useDispatch();
const dataMaskState = useSelector<any, DataMaskUnitWithId>(
state => state.dataMask.nativeFilters ?? {},
Expand All @@ -190,7 +212,6 @@ const FilterBar: React.FC<FiltersBarProps> = ({
const filterSetsConfigs = useSelector<any, FiltersSet[]>(
state => state.dashboardInfo?.metadata?.filter_sets_configuration || [],
);
const filters = useFilters();
const [filtersSetName, setFiltersSetName] = useState('');
const [selectedFiltersSetId, setSelectedFiltersSetId] = useState<
string | null
Expand Down Expand Up @@ -238,20 +259,16 @@ const FilterBar: React.FC<FiltersBarProps> = ({
filter: Pick<Filter, 'id'> & Partial<Filter>,
dataMask: Partial<DataMaskState>,
) => {
setFilterData(prevFilterData => {
setFilterData(draft => {
const children = cascadeChildren[filter.id] || [];
// force instant updating on initialization or for parent filters
if (filter.isInstant || children.length > 0) {
dispatch(updateDataMask(filter.id, dataMask));
}

if (!dataMask.nativeFilters) {
return { ...prevFilterData };
if (dataMask.nativeFilters) {
draft[filter.id] = dataMask.nativeFilters;
}
return {
...prevFilterData,
[filter.id]: dataMask.nativeFilters,
};
});
};

Expand Down Expand Up @@ -283,6 +300,7 @@ const FilterBar: React.FC<FiltersBarProps> = ({
);
}
});
setLastAppliedFilterData(() => filterData);
};

useEffect(() => {
Expand Down Expand Up @@ -320,21 +338,20 @@ const FilterBar: React.FC<FiltersBarProps> = ({
setSelectedFiltersSetId(null);
};

const handleResetAll = () => {
const handleClearAll = () => {
filterConfigs.forEach(filter => {
dispatch(
updateDataMask(filter.id, {
nativeFilters: {
currentState: {
...filterData[filter.id]?.currentState,
value: filters[filter.id]?.defaultValue,
},
},
}),
);
setFilterData(draft => {
draft[filter.id] = getInitialMask(filter.id);
});
});
};

const isClearAllDisabled = !Object.values(dataMaskState).every(
filter =>
filterData[filter.id]?.currentState?.value === null ||
(!filterData[filter.id] && filter.currentState?.value === null),
);

return (
<BarWrapper data-test="filter-bar" className={cx({ open: filtersOpen })}>
<CollapsedBar
Expand All @@ -360,14 +377,19 @@ const FilterBar: React.FC<FiltersBarProps> = ({
</TitleArea>
<ActionButtons>
<Button
buttonStyle="secondary"
disabled={!isClearAllDisabled}
buttonStyle="tertiary"
buttonSize="small"
onClick={handleResetAll}
onClick={handleClearAll}
data-test="filter-reset-button"
>
{t('Reset all')}
{t('Clear all')}
</Button>
<Button
disabled={
!isInitialized ||
areObjectsEqual(filterData, lastAppliedFilterData)
}
buttonStyle="primary"
htmlType="submit"
buttonSize="small"
Expand All @@ -378,7 +400,7 @@ const FilterBar: React.FC<FiltersBarProps> = ({
</Button>
</ActionButtons>
{isFeatureEnabled(FeatureFlag.DASHBOARD_NATIVE_FILTERS_SET) && (
<ActionButtons>
<Sets>
<FilterSet>
<StyledTitle>
<div>{t('Choose filters set')}</div>
Expand Down Expand Up @@ -429,7 +451,7 @@ const FilterBar: React.FC<FiltersBarProps> = ({
{t('Save Filters Set')}
</Button>
</FilterSet>
</ActionButtons>
</Sets>
)}
<FilterControls>
{cascadeFilters.map(filter => (
Expand Down