From 528d894b0823d285c55f26df1c5f2014ae458936 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Sat, 3 Aug 2024 21:42:01 +0800 Subject: [PATCH 1/3] fix(select): missing onChange when there are more than 300 items --- packages/components/select/src/use-select.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/components/select/src/use-select.ts b/packages/components/select/src/use-select.ts index 3439fd1761..0c8d31733b 100644 --- a/packages/components/select/src/use-select.ts +++ b/packages/components/select/src/use-select.ts @@ -250,16 +250,16 @@ export function useSelect(originalProps: UseSelectProps) { }, onSelectionChange: (keys) => { onSelectionChange?.(keys); - if (onChange && typeof onChange === "function" && domRef.current) { - const event = { + if (onChange && typeof onChange === "function") { + onChange({ target: { - ...domRef.current, + ...(domRef.current && { + ...domRef.current, + name: domRef.current.name, + }), value: Array.from(keys).join(","), - name: domRef.current.name, }, - } as React.ChangeEvent; - - onChange(event); + } as React.ChangeEvent); } }, }); From 7785e9ae125abe8e1950e7cd8e250caadc61b9a2 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Sat, 3 Aug 2024 22:25:00 +0800 Subject: [PATCH 2/3] feat(select): add tests for onChange --- .../select/__tests__/select.test.tsx | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/packages/components/select/__tests__/select.test.tsx b/packages/components/select/__tests__/select.test.tsx index 61a9e753a8..ec751bec8c 100644 --- a/packages/components/select/__tests__/select.test.tsx +++ b/packages/components/select/__tests__/select.test.tsx @@ -652,6 +652,74 @@ describe("Select", () => { // assert that the select listbox is closed expect(select).toHaveAttribute("aria-expanded", "false"); }); + + it("should work with onChange (< 300 select items)", async () => { + const onChange = jest.fn(); + + let options = new Array(10).fill(""); + + options = options.map((_, i) => { + return `option ${i}`; + }); + + const wrapper = render( + , + ); + + let listbox = wrapper.getByRole("listbox"); + + expect(listbox).toBeTruthy(); + + let listboxItems = wrapper.getAllByRole("option"); + + expect(listboxItems.length).toBe(10); + + await act(async () => { + await user.click(listboxItems[1]); + + expect(onChange).toBeCalledTimes(1); + }); + }); + + it("should work with onChange (>= 300 select items)", async () => { + let onChange = jest.fn(); + + let options = new Array(300).fill(""); + + options = options.map((_, i) => { + return `option ${i}`; + }); + + const wrapper = render( + , + ); + + let listbox = wrapper.getByRole("listbox"); + + expect(listbox).toBeTruthy(); + + let listboxItems = wrapper.getAllByRole("option"); + + expect(listboxItems.length).toBe(300); + + await act(async () => { + await user.click(listboxItems[1]); + + expect(onChange).toBeCalledTimes(1); + }); + }); }); describe("Select with React Hook Form", () => { From cb2b30186f92b1b1ccf7f5b650a9a78d4e62bdfb Mon Sep 17 00:00:00 2001 From: WK Wong Date: Fri, 16 Aug 2024 17:11:15 +0800 Subject: [PATCH 3/3] chore(changeset): add changeset --- .changeset/few-roses-sniff.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/few-roses-sniff.md diff --git a/.changeset/few-roses-sniff.md b/.changeset/few-roses-sniff.md new file mode 100644 index 0000000000..59c86128c3 --- /dev/null +++ b/.changeset/few-roses-sniff.md @@ -0,0 +1,5 @@ +--- +"@nextui-org/select": patch +--- + +added missing onChange when there are more than 300 items (#3455)