Skip to content

Commit e7f0dc5

Browse files
ntsekourasellatrixjameskosteroandregal
authored
DataViews: Fix focus loss when removing all filters or resetting (#67003)
Co-authored-by: ntsekouras <ntsekouras@git.wordpress.org> Co-authored-by: ellatrix <ellatrix@git.wordpress.org> Co-authored-by: jameskoster <jameskoster@git.wordpress.org> Co-authored-by: oandregal <oandregal@git.wordpress.org>
1 parent 645ce9f commit e7f0dc5

File tree

3 files changed

+80
-42
lines changed

3 files changed

+80
-42
lines changed

packages/dataviews/CHANGELOG.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
### Bug Fixes
6+
7+
- Fix focus loss when removing all filters or resetting ([#67003](https://github.com/WordPress/gutenberg/pull/67003)).
8+
59
## 4.7.0 (2024-10-30)
610

711
## 4.6.0 (2024-10-16)
@@ -23,8 +27,7 @@
2327
## Internal
2428

2529
- The "move left/move right" controls in the table layout (popup displayed on cliking header) are always visible. ([#64646](https://github.com/WordPress/gutenberg/pull/64646)). Before this, its visibility depending on filters, enableSorting, and enableHiding.
26-
- Filters no longer display the elements' description. ([#64674](https://github.com/WordPress/gutenberg/pull/64674))
27-
30+
- Filters no longer display the elements' description. ([#64674](https://github.com/WordPress/gutenberg/pull/64674))
2831

2932
## Enhancements
3033

packages/dataviews/src/components/dataviews-filters/index.tsx

Lines changed: 73 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
useRef,
88
useMemo,
99
useCallback,
10+
useEffect,
1011
} from '@wordpress/element';
1112
import { __experimentalHStack as HStack, Button } from '@wordpress/components';
1213
import { funnel } from '@wordpress/icons';
@@ -70,7 +71,7 @@ export function useFilters( fields: NormalizedField< any >[], view: View ) {
7071
}, [ fields, view ] );
7172
}
7273

73-
export function FilterVisibilityToggle( {
74+
export function FiltersToggle( {
7475
filters,
7576
view,
7677
onChangeView,
@@ -85,6 +86,7 @@ export function FilterVisibilityToggle( {
8586
isShowingFilter: boolean;
8687
setIsShowingFilter: React.Dispatch< React.SetStateAction< boolean > >;
8788
} ) {
89+
const buttonRef = useRef< HTMLButtonElement >( null );
8890
const onChangeViewWithFilterVisibility = useCallback(
8991
( _view: View ) => {
9092
onChangeView( _view );
@@ -98,48 +100,81 @@ export function FilterVisibilityToggle( {
98100
if ( filters.length === 0 ) {
99101
return null;
100102
}
101-
if ( ! hasVisibleFilters ) {
102-
return (
103-
<AddFilterMenu
104-
filters={ filters }
105-
view={ view }
106-
onChangeView={ onChangeViewWithFilterVisibility }
107-
setOpenedFilter={ setOpenedFilter }
108-
trigger={
109-
<Button
110-
className="dataviews-filters__visibility-toggle"
111-
size="compact"
112-
icon={ funnel }
113-
label={ __( 'Add filter' ) }
114-
isPressed={ false }
115-
aria-expanded={ false }
116-
/>
117-
}
118-
/>
119-
);
120-
}
103+
104+
const addFilterButtonProps = {
105+
label: __( 'Add filter' ),
106+
'aria-expanded': false,
107+
isPressed: false,
108+
};
109+
const toggleFiltersButtonProps = {
110+
label: _x( 'Filter', 'verb' ),
111+
'aria-expanded': isShowingFilter,
112+
isPressed: isShowingFilter,
113+
onClick: () => {
114+
if ( ! isShowingFilter ) {
115+
setOpenedFilter( null );
116+
}
117+
setIsShowingFilter( ! isShowingFilter );
118+
},
119+
};
120+
const buttonComponent = (
121+
<Button
122+
ref={ buttonRef }
123+
className="dataviews-filters__visibility-toggle"
124+
size="compact"
125+
icon={ funnel }
126+
{ ...( hasVisibleFilters
127+
? toggleFiltersButtonProps
128+
: addFilterButtonProps ) }
129+
/>
130+
);
121131
return (
122132
<div className="dataviews-filters__container-visibility-toggle">
123-
<Button
124-
className="dataviews-filters__visibility-toggle"
125-
size="compact"
126-
icon={ funnel }
127-
label={ _x( 'Filter', 'verb' ) }
128-
onClick={ () => {
129-
if ( ! isShowingFilter ) {
130-
setOpenedFilter( null );
131-
}
132-
setIsShowingFilter( ! isShowingFilter );
133-
} }
134-
isPressed={ isShowingFilter }
135-
aria-expanded={ isShowingFilter }
136-
/>
137-
{ hasVisibleFilters && !! view.filters?.length && (
133+
{ ! hasVisibleFilters ? (
134+
<AddFilterMenu
135+
filters={ filters }
136+
view={ view }
137+
onChangeView={ onChangeViewWithFilterVisibility }
138+
setOpenedFilter={ setOpenedFilter }
139+
trigger={ buttonComponent }
140+
/>
141+
) : (
142+
<FilterVisibilityToggle
143+
buttonRef={ buttonRef }
144+
filtersCount={ view.filters?.length }
145+
>
146+
{ buttonComponent }
147+
</FilterVisibilityToggle>
148+
) }
149+
</div>
150+
);
151+
}
152+
153+
function FilterVisibilityToggle( {
154+
buttonRef,
155+
filtersCount,
156+
children,
157+
}: {
158+
buttonRef: React.RefObject< HTMLButtonElement >;
159+
filtersCount?: number;
160+
children: React.ReactNode;
161+
} ) {
162+
// Focus the `add filter` button when unmounts.
163+
useEffect(
164+
() => () => {
165+
buttonRef.current?.focus();
166+
},
167+
[ buttonRef ]
168+
);
169+
return (
170+
<>
171+
{ children }
172+
{ !! filtersCount && (
138173
<span className="dataviews-filters-toggle__count">
139-
{ view.filters?.length }
174+
{ filtersCount }
140175
</span>
141176
) }
142-
</div>
177+
</>
143178
);
144179
}
145180

packages/dataviews/src/components/dataviews/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import DataViewsContext from '../dataviews-context';
1616
import {
1717
default as DataViewsFilters,
1818
useFilters,
19-
FilterVisibilityToggle,
19+
FiltersToggle,
2020
} from '../dataviews-filters';
2121
import DataViewsLayout from '../dataviews-layout';
2222
import DataViewsFooter from '../dataviews-footer';
@@ -135,7 +135,7 @@ export default function DataViews< Item >( {
135135
className="dataviews__search"
136136
>
137137
{ search && <DataViewsSearch label={ searchLabel } /> }
138-
<FilterVisibilityToggle
138+
<FiltersToggle
139139
filters={ filters }
140140
view={ view }
141141
onChangeView={ onChangeView }

0 commit comments

Comments
 (0)