fix(combo-box): fix typing when refocusing input

Fixes a bug where the input `value` is immediately reset
when re-focusing the input. The `value` resetting is necessary
to support programmatically clearing the value, but it should
only execute if the input is not currently focused.
This commit is contained in:
Brian West 2025-03-19 12:29:13 -05:00 committed by GitHub
commit 9e3d83031e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 27 additions and 3 deletions

View file

@ -175,12 +175,18 @@
filteredItems = [];
if (!selectedItem) {
selectedId = undefined;
value = "";
// Only reset value if the input is not focused
if (!ref.contains(document.activeElement)) {
value = "";
}
highlightedIndex = -1;
highlightedId = undefined;
} else {
// programmatically set value
value = itemToString(selectedItem);
// Only set value if the input is not focused
if (!ref.contains(document.activeElement)) {
// programmatically set value
value = itemToString(selectedItem);
}
}
}
});

View file

@ -127,6 +127,24 @@ describe("ComboBox", () => {
const options = screen.getAllByRole("option");
expect(options).toHaveLength(1);
expect(options[0]).toHaveTextContent("Email");
await user.clear(input);
expect(input).toHaveValue("");
expect(screen.getAllByRole("option")).toHaveLength(3);
await user.click(document.body);
expect(input).not.toHaveFocus();
await user.keyboard("{Tab}");
expect(input).toHaveFocus();
await user.type(input, "a");
await user.click(screen.getAllByRole("option")[1]);
expect(input).toHaveValue("Email");
await user.click(document.body);
expect(input).not.toHaveFocus();
expect(screen.queryByRole("option")).not.toBeInTheDocument();
});
it("should handle disabled items", async () => {