Skip to content

Commit

Permalink
Merge pull request #825 from equinor/fix/combobox-on-add-items
Browse files Browse the repository at this point in the history
🐛 Fix form onSubmit being called when hitting {Enter} inside of Select components
  • Loading branch information
mariush2 authored Oct 21, 2024
2 parents 77fd5b7 + 0d19bdc commit 7103958
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 2 deletions.
1 change: 1 addition & 0 deletions src/atoms/hooks/useSelect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ const useSelect = <T extends SelectOptionRequired>(
'onAddItem' in props &&
props.onAddItem
) {
event.preventDefault();
props.onAddItem(search);
setSearch('');
} else if (event.key === 'Space' || event.key === 'Enter') {
Expand Down
6 changes: 4 additions & 2 deletions src/molecules/Select/ComboBox/ComboBox.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ export const ComboBoxInDialog: StoryFn = (args) => {
};

export const ComboBoxWithAdd: StoryFn = (args) => {
const [items, setItems] = useState([...FAKE_ITEMS]);
const [values, setValues] = useState<SelectOption<Item>[]>([]);
const handleOnSelect = (newValues: SelectOptionRequired[]) => {
actions('onSelect').onSelect(newValues);
Expand All @@ -233,15 +234,16 @@ export const ComboBoxWithAdd: StoryFn = (args) => {
label: value,
value: faker.string.uuid(),
};

// NEW
setItems((prev) => [...prev, newItem]);
setValues((prev) => [...prev, newItem]);
};

return (
<ComboBox
{...args}
values={values as SelectOptionRequired[]}
items={FAKE_ITEMS}
items={items}
onSelect={handleOnSelect}
onAddItem={handleOnAdd}
/>
Expand Down
34 changes: 34 additions & 0 deletions src/molecules/Select/ComboBox/ComboBox.test.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { FormEvent } from 'react';

import { faker } from '@faker-js/faker';

import { ComboBox } from './ComboBox';
Expand Down Expand Up @@ -82,6 +84,38 @@ test('OnAddItem works as expected with {Enter} and preselected values', async ()
expect(handleOnSelect).not.toHaveBeenCalled();
});

test('OnAddItem works as expected with {Enter} inside a form', async () => {
const handleOnAddItem = vi.fn();
const handleOnSelect = vi.fn();
const handleOnSubmit = vi.fn((e: FormEvent) => e.preventDefault());
const items = fakeSelectItems();
render(
<form onSubmit={handleOnSubmit}>
<ComboBox
values={[items[0]]}
onSelect={handleOnSelect}
onAddItem={handleOnAddItem}
items={items}
/>
</form>
);
const user = userEvent.setup();

const input = screen.getByRole('combobox');

const someRandomText = faker.vehicle.vehicle();

await user.click(input);

await user.type(input, someRandomText);

await user.keyboard('{Enter}');

expect(handleOnAddItem).toHaveBeenCalledWith(someRandomText);
expect(handleOnSelect).not.toHaveBeenCalled();
expect(handleOnSubmit).not.toHaveBeenCalled();
});

test('OnAddItem works as expected when clicking item', async () => {
const handleOnAddItem = vi.fn();
const handleOnSelect = vi.fn();
Expand Down

0 comments on commit 7103958

Please sign in to comment.