fix(select): disabled select shouldn't get update by keyboard (#2649)

* fix(select): disable all keys for isDisabled case

* fix(select): add "disabled select shouldn't update by keyboard" test case

* refactor(select): remove unnecessary map
This commit is contained in:
աӄա 2024-04-15 03:35:07 +08:00 committed by GitHub
parent c2ef4c0935
commit e458432550
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 48 additions and 1 deletions

View File

@ -0,0 +1,5 @@
---
"@nextui-org/select": patch
---
Fixed Disabled Select Allows Changes Using Blur + Keyboard (#2345)

View File

@ -361,4 +361,39 @@ describe("Select", () => {
// assert that the select is closed
expect(select).toHaveAttribute("aria-expanded", "false");
});
it("disabled select shouldn't update by keyboard", async () => {
let onSelectionChange = jest.fn();
const wrapper = render(
<Select
isDisabled
aria-label="Favorite Animal"
data-testid="test-select"
label="Favorite Animal"
selectionMode="single"
value="penguin"
onSelectionChange={onSelectionChange}
>
<SelectItem key="penguin" value="penguin">
Penguin
</SelectItem>
<SelectItem key="zebra" value="zebra">
Zebra
</SelectItem>
<SelectItem key="shark" value="shark">
Shark
</SelectItem>
</Select>,
);
const select = wrapper.getByTestId("test-select");
await act(async () => {
await userEvent.click(document.body);
await userEvent.tab();
await userEvent.type(select, "z", {skipClick: true});
expect(onSelectionChange).toBeCalledTimes(0);
});
});
});

View File

@ -204,7 +204,7 @@ export function useSelect<T extends object>(originalProps: UseSelectProps<T>) {
const listBoxRef = useRef<HTMLUListElement>(null);
const popoverRef = useRef<HTMLDivElement>(null);
const state = useMultiSelectState<T>({
let state = useMultiSelectState<T>({
...props,
isOpen,
selectionMode,
@ -235,6 +235,13 @@ export function useSelect<T extends object>(originalProps: UseSelectProps<T>) {
},
});
state = {
...state,
...(originalProps?.isDisabled && {
disabledKeys: new Set([...state.collection.getKeys()]),
}),
};
const {labelProps, triggerProps, valueProps, menuProps, descriptionProps, errorMessageProps} =
useMultiSelect(
{...props, disallowEmptySelection, isDisabled: originalProps?.isDisabled},