Skip to content

Commit 3ae9223

Browse files
authored
fix(component): prevent onItemClick for disabled dropdown items (#1791)
* fix(component): prevent onItemClick for disabled dropdown items * fix(component): prevent onItemClick for disabled dropdown items Prevent onItemClick event for disabled dropdown items.
1 parent b6da022 commit 3ae9223

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

.changeset/metal-tips-relax.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@bigcommerce/big-design": patch
3+
---
4+
5+
fix(component): prevent onItemClick for disabled dropdown items

packages/big-design/src/components/Dropdown/Dropdown.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ export const Dropdown = memo(
6363
({ selectedItem }: Partial<UseSelectState<DropdownItem | DropdownLinkItem | null>>) => {
6464
if (
6565
selectedItem &&
66+
!selectedItem.disabled &&
6667
selectedItem.type !== 'link' &&
6768
typeof selectedItem.onItemClick === 'function'
6869
) {

packages/big-design/src/components/Dropdown/spec.tsx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,3 +698,56 @@ test('dropdown onItemClick triggers inside a modal', async () => {
698698
expect(onItemClick).toHaveBeenCalledTimes(1);
699699
expect(onItemClick).toHaveBeenCalledWith({ content: 'Option 2', onItemClick });
700700
});
701+
702+
test('disabled item does not trigger onItemClick via keyboard Enter', async () => {
703+
onItemClick.mockClear();
704+
705+
render(
706+
<Dropdown
707+
items={[
708+
{ content: 'Enabled 1', onItemClick },
709+
{ content: 'Disabled 2', onItemClick, disabled: true },
710+
{ content: 'Enabled 3', onItemClick },
711+
]}
712+
toggle={<Button>Button</Button>}
713+
/>,
714+
);
715+
716+
const toggle = screen.getByRole('button');
717+
718+
await userEvent.click(toggle);
719+
720+
// Move highlight to the disabled item (index 1)
721+
await userEvent.keyboard('{ArrowDown}');
722+
723+
// Press Enter; onItemClick should NOT fire
724+
await userEvent.keyboard('{Enter}');
725+
726+
expect(onItemClick).not.toHaveBeenCalled();
727+
});
728+
729+
test('disabled item does not trigger onItemClick via mouse click', async () => {
730+
onItemClick.mockClear();
731+
732+
render(
733+
<Dropdown
734+
items={[
735+
{ content: 'Enabled 1', onItemClick },
736+
{ content: 'Disabled 2', onItemClick, disabled: true },
737+
{ content: 'Enabled 3', onItemClick },
738+
]}
739+
toggle={<Button>Button</Button>}
740+
/>,
741+
);
742+
743+
const toggle = screen.getByRole('button');
744+
745+
await userEvent.click(toggle);
746+
747+
const options = await screen.findAllByRole('option');
748+
749+
// Click the disabled option (index 1)
750+
await userEvent.click(options[1]);
751+
752+
expect(onItemClick).not.toHaveBeenCalled();
753+
});

0 commit comments

Comments
 (0)