Skip to content

Commit e86152b

Browse files
mirkaciampotyxlaMamadukajeryj
authored
ToggleGroupControl: Don't autoselect option on first group focus (#65892)
* ToggleGroupControl: Don't autoselect option on first group focus * Fix test * Add changelog Co-authored-by: mirka <[email protected]> Co-authored-by: ciampo <[email protected]> Co-authored-by: tyxla <[email protected]> Co-authored-by: Mamaduka <[email protected]> Co-authored-by: jeryj <[email protected]>
1 parent fc62bf6 commit e86152b

File tree

6 files changed

+35
-21
lines changed

6 files changed

+35
-21
lines changed

packages/components/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- `PaletteEdit`: dedupe palette element slugs ([#65772](https://github.com/WordPress/gutenberg/pull/65772)).
88
- `RangeControl`: do not tooltip contents to the DOM when not shown ([#65875](https://github.com/WordPress/gutenberg/pull/65875)).
99
- `Tabs`: fix skipping indication animation glitch ([#65878](https://github.com/WordPress/gutenberg/pull/65878)).
10+
- `ToggleGroupControl`: Don't autoselect option on first group focus ([#65892](https://github.com/WordPress/gutenberg/pull/65892)).
1011

1112
### Enhancements
1213

packages/components/src/toggle-group-control/test/__snapshots__/index.tsx.snap

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
283283
class="components-toggle-group-control emotion-8 emotion-9"
284284
data-wp-c16t="true"
285285
data-wp-component="ToggleGroupControl"
286-
id="toggle-group-control-as-radio-group-11"
286+
id="toggle-group-control-as-radio-group-12"
287287
role="radiogroup"
288288
>
289289
<div
@@ -297,7 +297,7 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
297297
data-value="uppercase"
298298
data-wp-c16t="true"
299299
data-wp-component="ToggleGroupControlOptionBase"
300-
id="toggle-group-control-as-radio-group-11-30"
300+
id="toggle-group-control-as-radio-group-12-32"
301301
role="radio"
302302
type="button"
303303
value="uppercase"
@@ -330,7 +330,7 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
330330
data-value="lowercase"
331331
data-wp-c16t="true"
332332
data-wp-component="ToggleGroupControlOptionBase"
333-
id="toggle-group-control-as-radio-group-11-31"
333+
id="toggle-group-control-as-radio-group-12-33"
334334
role="radio"
335335
type="button"
336336
value="lowercase"
@@ -575,7 +575,7 @@ exports[`ToggleGroupControl controlled should render correctly with text options
575575
class="components-toggle-group-control emotion-8 emotion-9"
576576
data-wp-c16t="true"
577577
data-wp-component="ToggleGroupControl"
578-
id="toggle-group-control-as-radio-group-10"
578+
id="toggle-group-control-as-radio-group-11"
579579
role="radiogroup"
580580
>
581581
<div
@@ -588,7 +588,7 @@ exports[`ToggleGroupControl controlled should render correctly with text options
588588
data-value="rigas"
589589
data-wp-c16t="true"
590590
data-wp-component="ToggleGroupControlOptionBase"
591-
id="toggle-group-control-as-radio-group-10-28"
591+
id="toggle-group-control-as-radio-group-11-30"
592592
role="radio"
593593
type="button"
594594
value="rigas"
@@ -610,7 +610,7 @@ exports[`ToggleGroupControl controlled should render correctly with text options
610610
data-value="jack"
611611
data-wp-c16t="true"
612612
data-wp-component="ToggleGroupControlOptionBase"
613-
id="toggle-group-control-as-radio-group-10-29"
613+
id="toggle-group-control-as-radio-group-11-31"
614614
role="radio"
615615
type="button"
616616
value="jack"

packages/components/src/toggle-group-control/test/index.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,19 @@ describe.each( [
162162
expect( mockOnChange ).toHaveBeenCalledWith( 'rigas' );
163163
} );
164164

165+
it( 'should not set a value on focus', async () => {
166+
render(
167+
<Component label="Test Toggle Group Control">{ options }</Component>
168+
);
169+
170+
const radio = screen.getByRole( 'radio', { name: 'R' } );
171+
expect( radio ).not.toBeChecked();
172+
173+
await press.Tab();
174+
expect( radio ).toHaveFocus();
175+
expect( radio ).not.toBeChecked();
176+
} );
177+
165178
it( 'should render tooltip where `showTooltip` === `true`', async () => {
166179
render(
167180
<Component label="Test Toggle Group Control">

packages/components/src/toggle-group-control/toggle-group-control-option-base/component.tsx

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ function ToggleGroupControlOptionBase(
7575
value,
7676
children,
7777
showTooltip = false,
78-
onFocus: onFocusProp,
7978
disabled,
8079
...otherButtonProps
8180
} = buttonProps;
@@ -132,7 +131,6 @@ function ToggleGroupControlOptionBase(
132131
<button
133132
{ ...commonProps }
134133
disabled={ disabled }
135-
onFocus={ onFocusProp }
136134
aria-pressed={ isPressed }
137135
type="button"
138136
onClick={ buttonOnClick }
@@ -142,19 +140,17 @@ function ToggleGroupControlOptionBase(
142140
) : (
143141
<Ariakit.Radio
144142
disabled={ disabled }
145-
render={
146-
<button
147-
type="button"
148-
{ ...commonProps }
149-
onFocus={ ( event ) => {
150-
onFocusProp?.( event );
151-
if ( event.defaultPrevented ) {
152-
return;
153-
}
154-
toggleGroupControlContext.setValue( value );
155-
} }
156-
/>
157-
}
143+
onFocusVisible={ () => {
144+
// Conditions ensure that the first visible focus to a radio group
145+
// without a selected option will not automatically select the option.
146+
if (
147+
toggleGroupControlContext.value !== null ||
148+
toggleGroupControlContext.activeItemIsNotFirstItem?.()
149+
) {
150+
toggleGroupControlContext.setValue( value );
151+
}
152+
} }
153+
render={ <button type="button" { ...commonProps } /> }
158154
value={ value }
159155
>
160156
<ButtonContentView>{ children }</ButtonContentView>

packages/components/src/toggle-group-control/toggle-group-control/as-radio-group.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ function UnforwardedToggleGroupControlAsRadioGroup(
7575

7676
const groupContextValue = useMemo(
7777
(): ToggleGroupControlContextProps => ( {
78+
activeItemIsNotFirstItem: () =>
79+
radio.getState().activeId !== radio.first(),
7880
baseId,
7981
isBlock: ! isAdaptiveWidth,
8082
size,
@@ -87,6 +89,7 @@ function UnforwardedToggleGroupControlAsRadioGroup(
8789
[
8890
baseId,
8991
isAdaptiveWidth,
92+
radio,
9093
selectedValue,
9194
setSelectedElement,
9295
setValue,

packages/components/src/toggle-group-control/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ export type ToggleGroupControlProps = Pick<
131131
};
132132

133133
export type ToggleGroupControlContextProps = {
134+
activeItemIsNotFirstItem?: () => boolean;
134135
isDeselectable?: boolean;
135136
baseId: string;
136137
isBlock: ToggleGroupControlProps[ 'isBlock' ];

0 commit comments

Comments
 (0)