From 57c36bed8ecf7e904ac427ad396c584389f97388 Mon Sep 17 00:00:00 2001 From: Fabien MARIE-LOUISE Date: Thu, 19 Jan 2023 09:59:17 +0100 Subject: [PATCH 1/2] fix(select): cannot shift+tab when focus in on select.trigger --- packages/core/src/select/select-trigger.tsx | 24 ++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/core/src/select/select-trigger.tsx b/packages/core/src/select/select-trigger.tsx index 208aeffe..c3f17f7c 100644 --- a/packages/core/src/select/select-trigger.tsx +++ b/packages/core/src/select/select-trigger.tsx @@ -34,7 +34,7 @@ export const SelectTrigger = createPolymorphicComponent<"button", Button.ButtonR const [local, formControlFieldProps, others] = splitProps( props, - ["ref", "isDisabled", "onPressStart", "onPress", "onKeyDown"], + ["ref", "isDisabled", "onPressStart", "onPress", "onKeyDown", "onFocus", "onBlur"], FORM_CONTROL_FIELD_PROP_NAMES ); @@ -143,6 +143,26 @@ export const SelectTrigger = createPolymorphicComponent<"button", Button.ButtonR } }; + const onFocus: JSX.EventHandlerUnion = e => { + callHandler(e, local.onFocus); + + if (selectionManager().isFocused()) { + return; + } + + selectionManager().setFocused(true); + }; + + const onBlur: JSX.EventHandlerUnion = e => { + callHandler(e, local.onBlur); + + if (context.isOpen()) { + return; + } + + selectionManager().setFocused(false); + }; + createEffect(() => onCleanup(context.registerTriggerId(fieldProps.id()!))); createEffect(() => { @@ -171,6 +191,8 @@ export const SelectTrigger = createPolymorphicComponent<"button", Button.ButtonR onPressStart={onPressStart} onPress={onPress} onKeyDown={onKeyDown} + onFocus={onFocus} + onBlur={onBlur} {...formControlContext.dataset()} {...others} /> From 06bae5c174d1e9611a5d82d7183d5306c08029a2 Mon Sep 17 00:00:00 2001 From: Fabien MARIE-LOUISE Date: Thu, 19 Jan 2023 10:41:19 +0100 Subject: [PATCH 2/2] test(select): fix failing tests --- packages/core/src/multi-select/multi-select.test.tsx | 2 +- packages/core/src/select/select.test.tsx | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/core/src/multi-select/multi-select.test.tsx b/packages/core/src/multi-select/multi-select.test.tsx index bc494b5b..5745deb8 100644 --- a/packages/core/src/multi-select/multi-select.test.tsx +++ b/packages/core/src/multi-select/multi-select.test.tsx @@ -59,7 +59,7 @@ describe("MultiSelect", () => { expect(items[1]).toHaveTextContent("Two"); expect(items[2]).toHaveTextContent("Three"); - expect(document.activeElement).toBe(items[0]); + expect(document.activeElement).toBe(listbox); await triggerPress(items[0]); await triggerPress(items[2]); diff --git a/packages/core/src/select/select.test.tsx b/packages/core/src/select/select.test.tsx index d58016ce..c869bcf9 100644 --- a/packages/core/src/select/select.test.tsx +++ b/packages/core/src/select/select.test.tsx @@ -103,7 +103,7 @@ describe("Select", () => { expect(items[1]).toHaveTextContent("Two"); expect(items[2]).toHaveTextContent("Three"); - expect(document.activeElement).toBe(items[0]); + expect(document.activeElement).toBe(listbox); }); it("can be opened on touch up", async () => { @@ -162,7 +162,7 @@ describe("Select", () => { expect(items[1]).toHaveTextContent("Two"); expect(items[2]).toHaveTextContent("Three"); - expect(document.activeElement).toBe(items[0]); + expect(document.activeElement).toBe(listbox); }); it("can be opened on Space key down", async () => { @@ -991,7 +991,7 @@ describe("Select", () => { expect(items[1]).toHaveTextContent("Two"); expect(items[2]).toHaveTextContent("Three"); - expect(document.activeElement).toBe(items[0]); + expect(document.activeElement).toBe(listbox); await triggerPress(items[2]); @@ -1163,7 +1163,7 @@ describe("Select", () => { expect(items[1]).toHaveTextContent("Two"); expect(items[2]).toHaveTextContent("Three"); - expect(document.activeElement).toBe(items[0]); + expect(document.activeElement).toBe(listbox); fireEvent.pointerEnter(items[1]); await Promise.resolve(); @@ -1863,8 +1863,7 @@ describe("Select", () => { expect(trigger).toHaveTextContent("France"); }); - // TODO: failing, don't know why. - it.skip("should have a hidden input to marshall focus to the button", async () => { + it("should have a hidden input to marshall focus to the button", async () => { render(() => ( Label