Skip to content

Commit 74792f7

Browse files
authored
fix(select): missing onChange when there are more than 300 items (#3598)
* fix(select): missing onChange when there are more than 300 items * feat(select): add tests for onChange * chore(changeset): add changeset
1 parent 446a6bf commit 74792f7

File tree

3 files changed

+80
-7
lines changed

3 files changed

+80
-7
lines changed

.changeset/few-roses-sniff.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@nextui-org/select": patch
3+
---
4+
5+
added missing onChange when there are more than 300 items (#3455)

packages/components/select/__tests__/select.test.tsx

+68
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,74 @@ describe("Select", () => {
652652
// assert that the select listbox is closed
653653
expect(select).toHaveAttribute("aria-expanded", "false");
654654
});
655+
656+
it("should work with onChange (< 300 select items)", async () => {
657+
const onChange = jest.fn();
658+
659+
let options = new Array(10).fill("");
660+
661+
options = options.map((_, i) => {
662+
return `option ${i}`;
663+
});
664+
665+
const wrapper = render(
666+
<Select isOpen aria-label="Favorite Animal" label="Favorite Animal" onChange={onChange}>
667+
{options.map((o) => (
668+
<SelectItem key={o} value={o}>
669+
{o}
670+
</SelectItem>
671+
))}
672+
</Select>,
673+
);
674+
675+
let listbox = wrapper.getByRole("listbox");
676+
677+
expect(listbox).toBeTruthy();
678+
679+
let listboxItems = wrapper.getAllByRole("option");
680+
681+
expect(listboxItems.length).toBe(10);
682+
683+
await act(async () => {
684+
await user.click(listboxItems[1]);
685+
686+
expect(onChange).toBeCalledTimes(1);
687+
});
688+
});
689+
690+
it("should work with onChange (>= 300 select items)", async () => {
691+
let onChange = jest.fn();
692+
693+
let options = new Array(300).fill("");
694+
695+
options = options.map((_, i) => {
696+
return `option ${i}`;
697+
});
698+
699+
const wrapper = render(
700+
<Select isOpen aria-label="Favorite Animal" label="Favorite Animal" onChange={onChange}>
701+
{options.map((o) => (
702+
<SelectItem key={o} value={o}>
703+
{o}
704+
</SelectItem>
705+
))}
706+
</Select>,
707+
);
708+
709+
let listbox = wrapper.getByRole("listbox");
710+
711+
expect(listbox).toBeTruthy();
712+
713+
let listboxItems = wrapper.getAllByRole("option");
714+
715+
expect(listboxItems.length).toBe(300);
716+
717+
await act(async () => {
718+
await user.click(listboxItems[1]);
719+
720+
expect(onChange).toBeCalledTimes(1);
721+
});
722+
});
655723
});
656724

657725
describe("Select with React Hook Form", () => {

packages/components/select/src/use-select.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -249,16 +249,16 @@ export function useSelect<T extends object>(originalProps: UseSelectProps<T>) {
249249
},
250250
onSelectionChange: (keys) => {
251251
onSelectionChange?.(keys);
252-
if (onChange && typeof onChange === "function" && domRef.current) {
253-
const event = {
252+
if (onChange && typeof onChange === "function") {
253+
onChange({
254254
target: {
255-
...domRef.current,
255+
...(domRef.current && {
256+
...domRef.current,
257+
name: domRef.current.name,
258+
}),
256259
value: Array.from(keys).join(","),
257-
name: domRef.current.name,
258260
},
259-
} as React.ChangeEvent<HTMLSelectElement>;
260-
261-
onChange(event);
261+
} as React.ChangeEvent<HTMLSelectElement>);
262262
}
263263
},
264264
});

0 commit comments

Comments
 (0)