@fluentui-react-native/menu 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +16 -1
- package/CHANGELOG.md +10 -2
- package/jest.config.js +2 -0
- package/lib/Menu/useMenu.js +1 -1
- package/lib/Menu/useMenu.js.map +1 -1
- package/lib/MenuPopover/useMenuPopover.d.ts.map +1 -1
- package/lib/MenuPopover/useMenuPopover.js +2 -1
- package/lib/MenuPopover/useMenuPopover.js.map +1 -1
- package/lib/MenuTrigger/MenuTrigger.js +4 -4
- package/lib/MenuTrigger/MenuTrigger.js.map +1 -1
- package/lib/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
- package/lib/MenuTrigger/useMenuTrigger.js +3 -1
- package/lib/MenuTrigger/useMenuTrigger.js.map +1 -1
- package/lib/__tests__/Menu.test.d.ts +2 -0
- package/lib/__tests__/Menu.test.d.ts.map +1 -0
- package/lib/__tests__/Menu.test.js +145 -0
- package/lib/__tests__/Menu.test.js.map +1 -0
- package/lib-commonjs/Menu/useMenu.js +1 -1
- package/lib-commonjs/Menu/useMenu.js.map +1 -1
- package/lib-commonjs/MenuPopover/useMenuPopover.d.ts.map +1 -1
- package/lib-commonjs/MenuPopover/useMenuPopover.js +2 -1
- package/lib-commonjs/MenuPopover/useMenuPopover.js.map +1 -1
- package/lib-commonjs/MenuTrigger/MenuTrigger.js +4 -4
- package/lib-commonjs/MenuTrigger/MenuTrigger.js.map +1 -1
- package/lib-commonjs/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
- package/lib-commonjs/MenuTrigger/useMenuTrigger.js +3 -1
- package/lib-commonjs/MenuTrigger/useMenuTrigger.js.map +1 -1
- package/lib-commonjs/__tests__/Menu.test.d.ts +2 -0
- package/lib-commonjs/__tests__/Menu.test.d.ts.map +1 -0
- package/lib-commonjs/__tests__/Menu.test.js +148 -0
- package/lib-commonjs/__tests__/Menu.test.js.map +1 -0
- package/package.json +3 -1
- package/src/Menu/useMenu.ts +1 -1
- package/src/MenuPopover/useMenuPopover.ts +3 -1
- package/src/MenuTrigger/MenuTrigger.tsx +4 -4
- package/src/MenuTrigger/useMenuTrigger.ts +3 -1
- package/src/__tests__/Menu.test.tsx +235 -0
- package/src/__tests__/__snapshots__/Menu.test.tsx.snap +2098 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var React = (0, tslib_1.__importStar)(require("react"));
|
|
5
|
+
var renderer = (0, tslib_1.__importStar)(require("react-test-renderer"));
|
|
6
|
+
var Menu_1 = require("../Menu/Menu");
|
|
7
|
+
var test_tools_1 = require("@fluentui-react-native/test-tools");
|
|
8
|
+
var MenuTrigger_1 = (0, tslib_1.__importDefault)(require("../MenuTrigger/MenuTrigger"));
|
|
9
|
+
var button_1 = require("@fluentui-react-native/button");
|
|
10
|
+
var MenuPopover_1 = (0, tslib_1.__importDefault)(require("../MenuPopover/MenuPopover"));
|
|
11
|
+
var MenuList_1 = require("../MenuList/MenuList");
|
|
12
|
+
var MenuItem_1 = require("../MenuItem/MenuItem");
|
|
13
|
+
var MenuItemCheckbox_1 = require("../MenuItemCheckbox/MenuItemCheckbox");
|
|
14
|
+
var MenuDivider_1 = require("../MenuDivider/MenuDivider");
|
|
15
|
+
var MenuItemRadio_1 = require("../MenuItemRadio/MenuItemRadio");
|
|
16
|
+
describe('Checkbox component tests', function () {
|
|
17
|
+
it('Menu default', function () {
|
|
18
|
+
var tree = renderer
|
|
19
|
+
.create(React.createElement(Menu_1.Menu, null,
|
|
20
|
+
React.createElement(MenuTrigger_1.default, null,
|
|
21
|
+
React.createElement(button_1.ButtonV1, null, "Default")),
|
|
22
|
+
React.createElement(MenuPopover_1.default, null,
|
|
23
|
+
React.createElement(MenuList_1.MenuList, null,
|
|
24
|
+
React.createElement(MenuItem_1.MenuItem, { content: "Option 1" })))))
|
|
25
|
+
.toJSON();
|
|
26
|
+
expect(tree).toMatchSnapshot();
|
|
27
|
+
});
|
|
28
|
+
it('Menu open', function () {
|
|
29
|
+
var tree = renderer
|
|
30
|
+
.create(React.createElement(Menu_1.Menu, { open: true },
|
|
31
|
+
React.createElement(MenuTrigger_1.default, null,
|
|
32
|
+
React.createElement(button_1.ButtonV1, null, "Open")),
|
|
33
|
+
React.createElement(MenuPopover_1.default, null,
|
|
34
|
+
React.createElement(MenuList_1.MenuList, null,
|
|
35
|
+
React.createElement(MenuItem_1.MenuItem, { content: "Option 1" })))))
|
|
36
|
+
.toJSON();
|
|
37
|
+
expect(tree).toMatchSnapshot();
|
|
38
|
+
});
|
|
39
|
+
it('Menu defaultOpen', function () {
|
|
40
|
+
var tree = renderer
|
|
41
|
+
.create(React.createElement(Menu_1.Menu, { defaultOpen: true },
|
|
42
|
+
React.createElement(MenuTrigger_1.default, null,
|
|
43
|
+
React.createElement(button_1.ButtonV1, null, "Open")),
|
|
44
|
+
React.createElement(MenuPopover_1.default, null,
|
|
45
|
+
React.createElement(MenuList_1.MenuList, null,
|
|
46
|
+
React.createElement(MenuItem_1.MenuItem, { content: "Option 1" }),
|
|
47
|
+
React.createElement(MenuItem_1.MenuItem, { disabled: true, content: "Option 2" })))))
|
|
48
|
+
.toJSON();
|
|
49
|
+
expect(tree).toMatchSnapshot();
|
|
50
|
+
});
|
|
51
|
+
it('Menu open checkbox and divider', function () {
|
|
52
|
+
var tree = renderer
|
|
53
|
+
.create(React.createElement(Menu_1.Menu, { open: true },
|
|
54
|
+
React.createElement(MenuTrigger_1.default, null,
|
|
55
|
+
React.createElement(button_1.ButtonV1, null, "Open")),
|
|
56
|
+
React.createElement(MenuPopover_1.default, null,
|
|
57
|
+
React.createElement(MenuList_1.MenuList, null,
|
|
58
|
+
React.createElement(MenuItemCheckbox_1.MenuItemCheckbox, { content: "Option 1", name: "Option 1" }),
|
|
59
|
+
React.createElement(MenuDivider_1.MenuDivider, null),
|
|
60
|
+
React.createElement(MenuItemCheckbox_1.MenuItemCheckbox, { disabled: true, content: "Option 2", name: "Option 2" })))))
|
|
61
|
+
.toJSON();
|
|
62
|
+
expect(tree).toMatchSnapshot();
|
|
63
|
+
});
|
|
64
|
+
it('Menu open radio', function () {
|
|
65
|
+
var tree = renderer
|
|
66
|
+
.create(React.createElement(Menu_1.Menu, { open: true },
|
|
67
|
+
React.createElement(MenuTrigger_1.default, null,
|
|
68
|
+
React.createElement(button_1.ButtonV1, null, "Open")),
|
|
69
|
+
React.createElement(MenuPopover_1.default, null,
|
|
70
|
+
React.createElement(MenuList_1.MenuList, null,
|
|
71
|
+
React.createElement(MenuItemRadio_1.MenuItemRadio, { content: "Option 1", name: "Option 1" }),
|
|
72
|
+
React.createElement(MenuItemRadio_1.MenuItemRadio, { content: "Option 2", name: "Option 2" })))))
|
|
73
|
+
.toJSON();
|
|
74
|
+
expect(tree).toMatchSnapshot();
|
|
75
|
+
});
|
|
76
|
+
it('Menu open checkbox defaultChecked', function () {
|
|
77
|
+
var tree = renderer
|
|
78
|
+
.create(React.createElement(Menu_1.Menu, { open: true, defaultChecked: { 'Option 1': true } },
|
|
79
|
+
React.createElement(MenuTrigger_1.default, null,
|
|
80
|
+
React.createElement(button_1.ButtonV1, null, "Open")),
|
|
81
|
+
React.createElement(MenuPopover_1.default, null,
|
|
82
|
+
React.createElement(MenuList_1.MenuList, null,
|
|
83
|
+
React.createElement(MenuItemCheckbox_1.MenuItemCheckbox, { content: "Option 1", name: "Option 1" }),
|
|
84
|
+
React.createElement(MenuDivider_1.MenuDivider, null),
|
|
85
|
+
React.createElement(MenuItemCheckbox_1.MenuItemCheckbox, { content: "Option 2", name: "Option 2" })))))
|
|
86
|
+
.toJSON();
|
|
87
|
+
expect(tree).toMatchSnapshot();
|
|
88
|
+
});
|
|
89
|
+
it('Menu open checkbox checked', function () {
|
|
90
|
+
var tree = renderer
|
|
91
|
+
.create(React.createElement(Menu_1.Menu, { open: true, checked: { 'Option 1': true } },
|
|
92
|
+
React.createElement(MenuTrigger_1.default, null,
|
|
93
|
+
React.createElement(button_1.ButtonV1, null, "Open")),
|
|
94
|
+
React.createElement(MenuPopover_1.default, null,
|
|
95
|
+
React.createElement(MenuList_1.MenuList, null,
|
|
96
|
+
React.createElement(MenuItemCheckbox_1.MenuItemCheckbox, { content: "Option 1", name: "Option 1" }),
|
|
97
|
+
React.createElement(MenuDivider_1.MenuDivider, null),
|
|
98
|
+
React.createElement(MenuItemCheckbox_1.MenuItemCheckbox, { content: "Option 2", name: "Option 2" })))))
|
|
99
|
+
.toJSON();
|
|
100
|
+
expect(tree).toMatchSnapshot();
|
|
101
|
+
});
|
|
102
|
+
it('Menu submenu', function () {
|
|
103
|
+
var tree = renderer
|
|
104
|
+
.create(React.createElement(Menu_1.Menu, { open: true },
|
|
105
|
+
React.createElement(MenuTrigger_1.default, null,
|
|
106
|
+
React.createElement(button_1.ButtonV1, null, "Default")),
|
|
107
|
+
React.createElement(MenuPopover_1.default, null,
|
|
108
|
+
React.createElement(MenuList_1.MenuList, null,
|
|
109
|
+
React.createElement(MenuItem_1.MenuItem, { content: "Option 1" }),
|
|
110
|
+
React.createElement(Menu_1.Menu, null,
|
|
111
|
+
React.createElement(MenuTrigger_1.default, null,
|
|
112
|
+
React.createElement(MenuItem_1.MenuItem, { content: "Option 2" })),
|
|
113
|
+
React.createElement(MenuPopover_1.default, null,
|
|
114
|
+
React.createElement(MenuList_1.MenuList, null,
|
|
115
|
+
React.createElement(MenuItem_1.MenuItem, { content: "Option 1" }))))))))
|
|
116
|
+
.toJSON();
|
|
117
|
+
expect(tree).toMatchSnapshot();
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('Menu rerender tests', function () {
|
|
121
|
+
it('Menu re-renders correctly', function () {
|
|
122
|
+
(0, test_tools_1.checkReRender)(function () { return (React.createElement(Menu_1.Menu, { open: true },
|
|
123
|
+
React.createElement(MenuTrigger_1.default, null,
|
|
124
|
+
React.createElement(button_1.ButtonV1, null, "Rerender twice")),
|
|
125
|
+
React.createElement(MenuPopover_1.default, null,
|
|
126
|
+
React.createElement(MenuList_1.MenuList, null,
|
|
127
|
+
React.createElement(MenuItem_1.MenuItem, { content: "Option 1" }))))); }, 3);
|
|
128
|
+
});
|
|
129
|
+
it('Menu re-renders correctly with style', function () {
|
|
130
|
+
var style = { backgroundColor: 'black' };
|
|
131
|
+
(0, test_tools_1.checkReRender)(function () { return (React.createElement(Menu_1.Menu, null,
|
|
132
|
+
React.createElement(MenuTrigger_1.default, null,
|
|
133
|
+
React.createElement(button_1.ButtonV1, { style: style }, "Rerender twice")),
|
|
134
|
+
React.createElement(MenuPopover_1.default, null,
|
|
135
|
+
React.createElement(MenuList_1.MenuList, null,
|
|
136
|
+
React.createElement(MenuItem_1.MenuItem, { content: "Option 1" }))))); }, 3);
|
|
137
|
+
});
|
|
138
|
+
it('Menu re-renders correctly with accessibilityAction', function () {
|
|
139
|
+
var action = [{ name: 'Expand' }];
|
|
140
|
+
(0, test_tools_1.checkReRender)(function () { return (React.createElement(Menu_1.Menu, null,
|
|
141
|
+
React.createElement(MenuTrigger_1.default, null,
|
|
142
|
+
React.createElement(button_1.ButtonV1, null, "Rerender twice")),
|
|
143
|
+
React.createElement(MenuPopover_1.default, null,
|
|
144
|
+
React.createElement(MenuList_1.MenuList, null,
|
|
145
|
+
React.createElement(MenuItem_1.MenuItem, { accessibilityActions: action, content: "Option 1" }))))); }, 3);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=Menu.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Menu.test.js","sourceRoot":"","sources":["../../src/__tests__/Menu.test.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluentui-react-native/menu",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "A cross-platform Menu component using the Fluent Design System",
|
|
5
5
|
"main": "lib-commonjs/index.js",
|
|
6
6
|
"module": "lib/index.js",
|
|
@@ -34,8 +34,10 @@
|
|
|
34
34
|
"tslib": "^2.3.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
+
"@fluentui-react-native/button": ">=0.22.26 <1.0.0",
|
|
37
38
|
"@fluentui-react-native/eslint-config-rules": "^0.1.1",
|
|
38
39
|
"@fluentui-react-native/scripts": "^0.1.1",
|
|
40
|
+
"@fluentui-react-native/test-tools": ">=0.1.1 <1.0.0",
|
|
39
41
|
"@types/react-native": "^0.64.0",
|
|
40
42
|
"react-native": "^0.64.3"
|
|
41
43
|
},
|
package/src/Menu/useMenu.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { useMenuContext } from '../context/menuContext';
|
|
|
4
4
|
import { MenuProps, MenuState } from './Menu.types';
|
|
5
5
|
|
|
6
6
|
export const useMenu = (props: MenuProps): MenuState => {
|
|
7
|
-
const triggerRef = React.useRef(
|
|
7
|
+
const triggerRef = React.useRef();
|
|
8
8
|
const context = useMenuContext();
|
|
9
9
|
const isSubmenu = context.triggerRef !== null;
|
|
10
10
|
const isControlled = typeof props.open !== 'undefined';
|
|
@@ -5,6 +5,8 @@ import { useMenuContext } from '../context/menuContext';
|
|
|
5
5
|
import { MenuPopoverProps, MenuPopoverState } from './MenuPopover.types';
|
|
6
6
|
import { isCloseOnHoverOutEnabled } from '../consts';
|
|
7
7
|
|
|
8
|
+
const controlledDismissBehaviors = ['preventDismissOnKeyDown', 'preventDismissOnClickOutside'] as DismissBehaviors[];
|
|
9
|
+
|
|
8
10
|
export const useMenuPopover = (_props: MenuPopoverProps): MenuPopoverState => {
|
|
9
11
|
const context = useMenuContext();
|
|
10
12
|
const {
|
|
@@ -20,7 +22,7 @@ export const useMenuPopover = (_props: MenuPopoverProps): MenuPopoverState => {
|
|
|
20
22
|
} = context;
|
|
21
23
|
|
|
22
24
|
const onDismiss = React.useCallback(() => setOpen(undefined, false /* isOpen */), [setOpen]);
|
|
23
|
-
const dismissBehaviors = isControlled ?
|
|
25
|
+
const dismissBehaviors = isControlled ? controlledDismissBehaviors : undefined;
|
|
24
26
|
const directionalHint = getDirectionalHint(isSubmenu, I18nManager.isRTL);
|
|
25
27
|
|
|
26
28
|
// Initial focus behavior differs per platform, Windows platforms move focus
|
|
@@ -31,18 +31,18 @@ MenuTrigger.displayName = menuTriggerName;
|
|
|
31
31
|
|
|
32
32
|
const getRevisedState = memoize(getRevisedStateWorker);
|
|
33
33
|
function getRevisedStateWorker(state: MenuTriggerState, props: any): MenuTriggerProps {
|
|
34
|
-
const revisedProps =
|
|
34
|
+
const revisedProps = state.props;
|
|
35
35
|
if (props.accessibilityState) {
|
|
36
|
-
revisedProps.accessibilityState = { ...
|
|
36
|
+
revisedProps.accessibilityState = { ...revisedProps.accessibilityState, ...props.accessibilityState };
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
if (props.accessibilityActions) {
|
|
40
|
-
revisedProps.accessibilityActions = { ...
|
|
40
|
+
revisedProps.accessibilityActions = { ...revisedProps.accessibilityActions, ...props.accessibilityActions };
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
if (props.onAccessibilityAction) {
|
|
44
44
|
revisedProps.onAccessibilityAction = (e: AccessibilityActionEvent) => {
|
|
45
|
-
|
|
45
|
+
revisedProps.onAccessibilityAction(e);
|
|
46
46
|
props.onAccessibilityAction(e);
|
|
47
47
|
};
|
|
48
48
|
}
|
|
@@ -7,12 +7,14 @@ import { delayHover, isCloseOnHoverOutEnabled } from '../consts';
|
|
|
7
7
|
|
|
8
8
|
const accessibilityActions =
|
|
9
9
|
Platform.OS === ('win32' as any) ? [{ name: 'Expand' as AccessibilityActionName }, { name: 'Collapse' as AccessibilityActionName }] : [];
|
|
10
|
+
const expandedState = { expanded: true };
|
|
11
|
+
const collapsedState = { expanded: false };
|
|
10
12
|
|
|
11
13
|
export const useMenuTrigger = (_props: MenuTriggerProps): MenuTriggerState => {
|
|
12
14
|
const context = useMenuContext();
|
|
13
15
|
const { open, openOnHover, popoverHoverOutTimer, setOpen, setTriggerHoverOutTimer, triggerHoverOutTimer, triggerRef } = context;
|
|
14
16
|
|
|
15
|
-
const accessibilityState = open ?
|
|
17
|
+
const accessibilityState = open ? expandedState : collapsedState;
|
|
16
18
|
|
|
17
19
|
const onAccessibilityAction = React.useCallback(
|
|
18
20
|
(e: AccessibilityActionEvent) => {
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { AccessibilityActionName } from 'react-native';
|
|
3
|
+
import * as renderer from 'react-test-renderer';
|
|
4
|
+
import { Menu } from '../Menu/Menu';
|
|
5
|
+
import { checkReRender } from '@fluentui-react-native/test-tools';
|
|
6
|
+
import MenuTrigger from '../MenuTrigger/MenuTrigger';
|
|
7
|
+
import { ButtonV1 as Button } from '@fluentui-react-native/button';
|
|
8
|
+
import MenuPopover from '../MenuPopover/MenuPopover';
|
|
9
|
+
import { MenuList } from '../MenuList/MenuList';
|
|
10
|
+
import { MenuItem } from '../MenuItem/MenuItem';
|
|
11
|
+
import { MenuItemCheckbox } from '../MenuItemCheckbox/MenuItemCheckbox';
|
|
12
|
+
import { MenuDivider } from '../MenuDivider/MenuDivider';
|
|
13
|
+
import { MenuItemRadio } from '../MenuItemRadio/MenuItemRadio';
|
|
14
|
+
|
|
15
|
+
describe('Checkbox component tests', () => {
|
|
16
|
+
it('Menu default', () => {
|
|
17
|
+
const tree = renderer
|
|
18
|
+
.create(
|
|
19
|
+
<Menu>
|
|
20
|
+
<MenuTrigger>
|
|
21
|
+
<Button>Default</Button>
|
|
22
|
+
</MenuTrigger>
|
|
23
|
+
<MenuPopover>
|
|
24
|
+
<MenuList>
|
|
25
|
+
<MenuItem content="Option 1" />
|
|
26
|
+
</MenuList>
|
|
27
|
+
</MenuPopover>
|
|
28
|
+
</Menu>,
|
|
29
|
+
)
|
|
30
|
+
.toJSON();
|
|
31
|
+
expect(tree).toMatchSnapshot();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('Menu open', () => {
|
|
35
|
+
const tree = renderer
|
|
36
|
+
.create(
|
|
37
|
+
<Menu open>
|
|
38
|
+
<MenuTrigger>
|
|
39
|
+
<Button>Open</Button>
|
|
40
|
+
</MenuTrigger>
|
|
41
|
+
<MenuPopover>
|
|
42
|
+
<MenuList>
|
|
43
|
+
<MenuItem content="Option 1" />
|
|
44
|
+
</MenuList>
|
|
45
|
+
</MenuPopover>
|
|
46
|
+
</Menu>,
|
|
47
|
+
)
|
|
48
|
+
.toJSON();
|
|
49
|
+
expect(tree).toMatchSnapshot();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('Menu defaultOpen', () => {
|
|
53
|
+
const tree = renderer
|
|
54
|
+
.create(
|
|
55
|
+
<Menu defaultOpen>
|
|
56
|
+
<MenuTrigger>
|
|
57
|
+
<Button>Open</Button>
|
|
58
|
+
</MenuTrigger>
|
|
59
|
+
<MenuPopover>
|
|
60
|
+
<MenuList>
|
|
61
|
+
<MenuItem content="Option 1" />
|
|
62
|
+
<MenuItem disabled content="Option 2" />
|
|
63
|
+
</MenuList>
|
|
64
|
+
</MenuPopover>
|
|
65
|
+
</Menu>,
|
|
66
|
+
)
|
|
67
|
+
.toJSON();
|
|
68
|
+
expect(tree).toMatchSnapshot();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('Menu open checkbox and divider', () => {
|
|
72
|
+
const tree = renderer
|
|
73
|
+
.create(
|
|
74
|
+
<Menu open>
|
|
75
|
+
<MenuTrigger>
|
|
76
|
+
<Button>Open</Button>
|
|
77
|
+
</MenuTrigger>
|
|
78
|
+
<MenuPopover>
|
|
79
|
+
<MenuList>
|
|
80
|
+
<MenuItemCheckbox content="Option 1" name="Option 1" />
|
|
81
|
+
<MenuDivider />
|
|
82
|
+
<MenuItemCheckbox disabled content="Option 2" name="Option 2" />
|
|
83
|
+
</MenuList>
|
|
84
|
+
</MenuPopover>
|
|
85
|
+
</Menu>,
|
|
86
|
+
)
|
|
87
|
+
.toJSON();
|
|
88
|
+
expect(tree).toMatchSnapshot();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('Menu open radio', () => {
|
|
92
|
+
const tree = renderer
|
|
93
|
+
.create(
|
|
94
|
+
<Menu open>
|
|
95
|
+
<MenuTrigger>
|
|
96
|
+
<Button>Open</Button>
|
|
97
|
+
</MenuTrigger>
|
|
98
|
+
<MenuPopover>
|
|
99
|
+
<MenuList>
|
|
100
|
+
<MenuItemRadio content="Option 1" name="Option 1" />
|
|
101
|
+
<MenuItemRadio content="Option 2" name="Option 2" />
|
|
102
|
+
</MenuList>
|
|
103
|
+
</MenuPopover>
|
|
104
|
+
</Menu>,
|
|
105
|
+
)
|
|
106
|
+
.toJSON();
|
|
107
|
+
expect(tree).toMatchSnapshot();
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('Menu open checkbox defaultChecked', () => {
|
|
111
|
+
const tree = renderer
|
|
112
|
+
.create(
|
|
113
|
+
<Menu open defaultChecked={{ 'Option 1': true }}>
|
|
114
|
+
<MenuTrigger>
|
|
115
|
+
<Button>Open</Button>
|
|
116
|
+
</MenuTrigger>
|
|
117
|
+
<MenuPopover>
|
|
118
|
+
<MenuList>
|
|
119
|
+
<MenuItemCheckbox content="Option 1" name="Option 1" />
|
|
120
|
+
<MenuDivider />
|
|
121
|
+
<MenuItemCheckbox content="Option 2" name="Option 2" />
|
|
122
|
+
</MenuList>
|
|
123
|
+
</MenuPopover>
|
|
124
|
+
</Menu>,
|
|
125
|
+
)
|
|
126
|
+
.toJSON();
|
|
127
|
+
expect(tree).toMatchSnapshot();
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('Menu open checkbox checked', () => {
|
|
131
|
+
const tree = renderer
|
|
132
|
+
.create(
|
|
133
|
+
<Menu open checked={{ 'Option 1': true }}>
|
|
134
|
+
<MenuTrigger>
|
|
135
|
+
<Button>Open</Button>
|
|
136
|
+
</MenuTrigger>
|
|
137
|
+
<MenuPopover>
|
|
138
|
+
<MenuList>
|
|
139
|
+
<MenuItemCheckbox content="Option 1" name="Option 1" />
|
|
140
|
+
<MenuDivider />
|
|
141
|
+
<MenuItemCheckbox content="Option 2" name="Option 2" />
|
|
142
|
+
</MenuList>
|
|
143
|
+
</MenuPopover>
|
|
144
|
+
</Menu>,
|
|
145
|
+
)
|
|
146
|
+
.toJSON();
|
|
147
|
+
expect(tree).toMatchSnapshot();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('Menu submenu', () => {
|
|
151
|
+
const tree = renderer
|
|
152
|
+
.create(
|
|
153
|
+
<Menu open>
|
|
154
|
+
<MenuTrigger>
|
|
155
|
+
<Button>Default</Button>
|
|
156
|
+
</MenuTrigger>
|
|
157
|
+
<MenuPopover>
|
|
158
|
+
<MenuList>
|
|
159
|
+
<MenuItem content="Option 1" />
|
|
160
|
+
<Menu>
|
|
161
|
+
<MenuTrigger>
|
|
162
|
+
<MenuItem content="Option 2" />
|
|
163
|
+
</MenuTrigger>
|
|
164
|
+
<MenuPopover>
|
|
165
|
+
<MenuList>
|
|
166
|
+
<MenuItem content="Option 1" />
|
|
167
|
+
</MenuList>
|
|
168
|
+
</MenuPopover>
|
|
169
|
+
</Menu>
|
|
170
|
+
</MenuList>
|
|
171
|
+
</MenuPopover>
|
|
172
|
+
</Menu>,
|
|
173
|
+
)
|
|
174
|
+
.toJSON();
|
|
175
|
+
expect(tree).toMatchSnapshot();
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
describe('Menu rerender tests', () => {
|
|
180
|
+
it('Menu re-renders correctly', () => {
|
|
181
|
+
checkReRender(
|
|
182
|
+
() => (
|
|
183
|
+
<Menu open>
|
|
184
|
+
<MenuTrigger>
|
|
185
|
+
<Button>Rerender twice</Button>
|
|
186
|
+
</MenuTrigger>
|
|
187
|
+
<MenuPopover>
|
|
188
|
+
<MenuList>
|
|
189
|
+
<MenuItem content="Option 1" />
|
|
190
|
+
</MenuList>
|
|
191
|
+
</MenuPopover>
|
|
192
|
+
</Menu>
|
|
193
|
+
),
|
|
194
|
+
3,
|
|
195
|
+
);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('Menu re-renders correctly with style', () => {
|
|
199
|
+
const style = { backgroundColor: 'black' };
|
|
200
|
+
checkReRender(
|
|
201
|
+
() => (
|
|
202
|
+
<Menu>
|
|
203
|
+
<MenuTrigger>
|
|
204
|
+
<Button style={style}>Rerender twice</Button>
|
|
205
|
+
</MenuTrigger>
|
|
206
|
+
<MenuPopover>
|
|
207
|
+
<MenuList>
|
|
208
|
+
<MenuItem content="Option 1" />
|
|
209
|
+
</MenuList>
|
|
210
|
+
</MenuPopover>
|
|
211
|
+
</Menu>
|
|
212
|
+
),
|
|
213
|
+
3,
|
|
214
|
+
);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('Menu re-renders correctly with accessibilityAction', () => {
|
|
218
|
+
const action = [{ name: 'Expand' as AccessibilityActionName }];
|
|
219
|
+
checkReRender(
|
|
220
|
+
() => (
|
|
221
|
+
<Menu>
|
|
222
|
+
<MenuTrigger>
|
|
223
|
+
<Button>Rerender twice</Button>
|
|
224
|
+
</MenuTrigger>
|
|
225
|
+
<MenuPopover>
|
|
226
|
+
<MenuList>
|
|
227
|
+
<MenuItem accessibilityActions={action} content="Option 1" />
|
|
228
|
+
</MenuList>
|
|
229
|
+
</MenuPopover>
|
|
230
|
+
</Menu>
|
|
231
|
+
),
|
|
232
|
+
3,
|
|
233
|
+
);
|
|
234
|
+
});
|
|
235
|
+
});
|