Rework fix

This commit is contained in:
Eric Liu 2025-03-18 18:55:21 -07:00
commit 9150222a68
2 changed files with 28 additions and 9 deletions

View file

@ -175,11 +175,18 @@
filteredItems = []; filteredItems = [];
if (!selectedItem) { if (!selectedItem) {
selectedId = undefined; selectedId = undefined;
// Only reset value if the input is not focused
if (!ref.contains(document.activeElement)) {
value = "";
}
highlightedIndex = -1; highlightedIndex = -1;
highlightedId = undefined; highlightedId = undefined;
} else { } else {
// programmatically set value // Only set value if the input is not focused
value = itemToString(selectedItem); if (!ref.contains(document.activeElement)) {
// programmatically set value
value = itemToString(selectedItem);
}
} }
} }
}); });
@ -282,13 +289,7 @@
open = true; open = true;
} }
}} }}
on:keydown={(e) => { on:keydown
// If there's a selection and user types a printable character, clear selection immediately
if (e.key.length === 1 && selectedItem) {
selectedId = undefined;
selectedItem = undefined;
}
}}
on:keydown|stopPropagation={(e) => { on:keydown|stopPropagation={(e) => {
const { key } = e; const { key } = e;
if (["Enter", "ArrowDown", "ArrowUp"].includes(key)) { if (["Enter", "ArrowDown", "ArrowUp"].includes(key)) {

View file

@ -127,6 +127,24 @@ describe("ComboBox", () => {
const options = screen.getAllByRole("option"); const options = screen.getAllByRole("option");
expect(options).toHaveLength(1); expect(options).toHaveLength(1);
expect(options[0]).toHaveTextContent("Email"); 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 () => { it("should handle disabled items", async () => {