Skip to content

Commit d7b2ca6

Browse files
authored
Adding defaultOpen and onOpenChange to ActionMenu (#2728)
* Adding defaultOpen and onOpenChange to ActionMenu * adding tests to check isOpen and defaultOpen * merging onChangeOpen and defaultOpen stories
1 parent 5115b76 commit d7b2ca6

File tree

3 files changed

+75
-0
lines changed

3 files changed

+75
-0
lines changed

packages/@react-spectrum/menu/src/ActionMenu.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ function ActionMenu<T extends object>(props: SpectrumActionMenuProps<T>, ref: Fo
3434
return (
3535
<MenuTrigger
3636
isOpen={props.isOpen}
37+
defaultOpen={props.defaultOpen}
38+
onOpenChange={props.onOpenChange}
3739
align={props.align}
3840
direction={props.direction}
3941
shouldFlip={props.shouldFlip}>

packages/@react-spectrum/menu/stories/ActionMenu.stories.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,24 @@ Disabled.args = {isDisabled: true};
133133
export const AutoFocus = Template().bind({});
134134
AutoFocus.args = {autoFocus: true};
135135

136+
export const DefaultOpen = Template().bind({});
137+
DefaultOpen.args = {onOpenChange: action('openChange'), defaultOpen: true};
138+
139+
export const ControlledOpen = () => {
140+
let [open, setOpen] = React.useState(false);
141+
142+
return (
143+
<ActionMenu
144+
isOpen={open}
145+
onOpenChange={setOpen}
146+
onAction={action('action')}>
147+
<Item key="cut">Cut</Item>
148+
<Item key="copy">Copy</Item>
149+
<Item key="paste">Paste</Item>
150+
</ActionMenu>
151+
);
152+
};
153+
136154
export const DirectionAlign = () => <DirectionAlignment />;
137155

138156
export const WithTooltip = () => (

packages/@react-spectrum/menu/test/ActionMenu.test.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@ let CLOSE_TIME = 350;
2323

2424
describe('ActionMenu', function () {
2525
let onActionSpy = jest.fn();
26+
let onOpenChange = jest.fn();
2627

2728
beforeAll(function () {
2829
jest.useFakeTimers('legacy');
2930
});
3031

3132
afterEach(() => {
3233
onActionSpy.mockClear();
34+
onOpenChange.mockClear();
3335
act(() => {
3436
jest.runAllTimers();
3537
});
@@ -107,6 +109,59 @@ describe('ActionMenu', function () {
107109
expect(document.activeElement).toBe(button);
108110
});
109111

112+
it('supports a controlled open state ', function () {
113+
let tree = render(
114+
<Provider theme={theme}>
115+
<ActionMenu onOpenChange={onOpenChange} isOpen>
116+
<Item>Foo</Item>
117+
<Item>Bar</Item>
118+
<Item>Baz</Item>
119+
</ActionMenu>
120+
</Provider>
121+
);
122+
123+
act(() => {jest.runAllTimers();});
124+
expect(onOpenChange).toBeCalledTimes(0);
125+
126+
let menu = tree.getByRole('menu');
127+
expect(menu).toBeTruthy();
128+
129+
let triggerButton = tree.getByLabelText('More actions');
130+
triggerPress(triggerButton);
131+
act(() => {jest.runAllTimers();});
132+
133+
menu = tree.getByRole('menu');
134+
expect(menu).toBeTruthy();
135+
expect(onOpenChange).toBeCalledTimes(1);
136+
expect(triggerButton).toHaveAttribute('aria-expanded', 'true');
137+
});
138+
139+
it('supports an uncontrolled default open state ', function () {
140+
let tree = render(
141+
<Provider theme={theme}>
142+
<ActionMenu onOpenChange={onOpenChange} defaultOpen>
143+
<Item>Foo</Item>
144+
<Item>Bar</Item>
145+
<Item>Baz</Item>
146+
</ActionMenu>
147+
</Provider>
148+
);
149+
150+
act(() => {jest.runAllTimers();});
151+
expect(onOpenChange).toBeCalledTimes(0);
152+
153+
let menu = tree.getByRole('menu');
154+
expect(menu).toBeTruthy();
155+
156+
let triggerButton = tree.getByLabelText('More actions');
157+
triggerPress(triggerButton);
158+
act(() => {jest.runAllTimers();});
159+
160+
expect(menu).not.toBeInTheDocument();
161+
expect(onOpenChange).toBeCalledTimes(1);
162+
expect(triggerButton).toHaveAttribute('aria-expanded', 'false');
163+
});
164+
110165
describe('with tooltips', function () {
111166
it('using mouse', function () {
112167
let tree = render(

0 commit comments

Comments
 (0)