@planningcenter/tapestry-react 2.0.0-rc.0 → 2.0.0-rc.1
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/dist/cjs/Dropdown/Dropdown.test.js +194 -19
- package/dist/cjs/Group/Group.js +6 -4
- package/dist/cjs/Modal/Modal.test.js +156 -0
- package/dist/cjs/Popover/Popover.js +4 -0
- package/dist/cjs/Popover/Popover.test.js +65 -0
- package/dist/cjs/Popover/rewireTabOrder.js +13 -30
- package/dist/cjs/Select/Select.js +9 -0
- package/dist/esm/Dropdown/Dropdown.test.js +158 -17
- package/dist/esm/Group/Group.js +6 -4
- package/dist/esm/Modal/Modal.test.js +122 -0
- package/dist/esm/Popover/Popover.js +4 -0
- package/dist/esm/Popover/Popover.test.js +51 -0
- package/dist/esm/Popover/rewireTabOrder.js +13 -33
- package/dist/esm/Select/Select.js +9 -0
- package/dist/types/Dropdown/Dropdown.test.d.ts +1 -1
- package/dist/types/Group/Group.d.ts +5 -1
- package/dist/types/Modal/Modal.test.d.ts +1 -0
- package/dist/types/Popover/Popover.test.d.ts +1 -0
- package/package.json +1 -1
- package/src/Dropdown/Dropdown.test.tsx +128 -17
- package/src/Group/Group.tsx +9 -3
- package/src/Modal/Modal.test.tsx +113 -0
- package/src/Popover/Popover.test.tsx +62 -0
- package/src/Popover/Popover.tsx +3 -0
- package/src/Popover/rewireTabOrder.ts +24 -42
- package/src/Select/Select.js +6 -0
|
@@ -2,34 +2,209 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
6
|
+
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
6
8
|
|
|
7
9
|
var _react2 = require("@testing-library/react");
|
|
8
10
|
|
|
11
|
+
var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
|
|
12
|
+
|
|
13
|
+
require("@testing-library/jest-dom/extend-expect");
|
|
14
|
+
|
|
15
|
+
var _lodash = require("lodash");
|
|
16
|
+
|
|
17
|
+
var _ = require("..");
|
|
18
|
+
|
|
9
19
|
var _Dropdown = _interopRequireDefault(require("./Dropdown"));
|
|
10
20
|
|
|
11
|
-
|
|
21
|
+
describe('Dropdown', function () {
|
|
22
|
+
describe('Text search', function () {
|
|
23
|
+
it("should render title", function () {
|
|
24
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Dropdown["default"], {
|
|
25
|
+
title: "A menu"
|
|
26
|
+
}));
|
|
12
27
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
28
|
+
_react2.screen.getByText('A menu');
|
|
29
|
+
});
|
|
30
|
+
it("calls passed onSearch function when receiving keyboard input", function () {
|
|
31
|
+
var customTextSearch = jest.fn();
|
|
32
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_.ThemeProvider, null, /*#__PURE__*/_react["default"].createElement(_Dropdown["default"], {
|
|
33
|
+
title: "A menu",
|
|
34
|
+
onSearch: customTextSearch
|
|
35
|
+
})));
|
|
17
36
|
|
|
18
|
-
|
|
19
|
-
});
|
|
20
|
-
it("calls passed onSearch function when receiving keyboard input", function () {
|
|
21
|
-
var customTextSearch = jest.fn();
|
|
22
|
-
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ThemeProvider["default"], null, /*#__PURE__*/_react["default"].createElement(_Dropdown["default"], {
|
|
23
|
-
title: "A menu",
|
|
24
|
-
onSearch: customTextSearch
|
|
25
|
-
})));
|
|
37
|
+
var dropdown = _react2.screen.getByText('A menu');
|
|
26
38
|
|
|
27
|
-
|
|
39
|
+
_react2.fireEvent.keyDown(dropdown, {
|
|
40
|
+
key: 'A',
|
|
41
|
+
code: 'KeyA'
|
|
42
|
+
});
|
|
28
43
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
code: 'KeyA'
|
|
44
|
+
expect(customTextSearch).toHaveBeenCalled();
|
|
45
|
+
});
|
|
32
46
|
});
|
|
47
|
+
describe('Keyboard navigation', function () {
|
|
48
|
+
var StatefulDropdown = function StatefulDropdown() {
|
|
49
|
+
var _useState = (0, _react.useState)(0),
|
|
50
|
+
count = _useState[0],
|
|
51
|
+
setCount = _useState[1];
|
|
52
|
+
|
|
53
|
+
return /*#__PURE__*/_react["default"].createElement(_.ThemeProvider, null, /*#__PURE__*/_react["default"].createElement(_.Box, null, /*#__PURE__*/_react["default"].createElement(_Dropdown["default"], null, /*#__PURE__*/_react["default"].createElement(_Dropdown["default"].Item, null, /*#__PURE__*/_react["default"].createElement(_.Button, {
|
|
54
|
+
title: "One",
|
|
55
|
+
onClick: function onClick() {
|
|
56
|
+
return (0, _lodash.noop)();
|
|
57
|
+
}
|
|
58
|
+
})), /*#__PURE__*/_react["default"].createElement(_Dropdown["default"].Item, null, /*#__PURE__*/_react["default"].createElement(_.Button, {
|
|
59
|
+
title: "Two",
|
|
60
|
+
onClick: function onClick() {
|
|
61
|
+
return setCount(function (c) {
|
|
62
|
+
return c + 1;
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}), /*#__PURE__*/_react["default"].createElement(_.Text, {
|
|
66
|
+
"data-testid": "count-text"
|
|
67
|
+
}, count)), /*#__PURE__*/_react["default"].createElement(_Dropdown["default"].Item, null, /*#__PURE__*/_react["default"].createElement(_.Button, {
|
|
68
|
+
title: "Three",
|
|
69
|
+
onClick: function onClick() {
|
|
70
|
+
return (0, _lodash.noop)();
|
|
71
|
+
}
|
|
72
|
+
})))));
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
it('should trap focus, tab forward through all elements', function () {
|
|
76
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(StatefulDropdown, null));
|
|
77
|
+
|
|
78
|
+
_userEvent["default"].tab();
|
|
79
|
+
|
|
80
|
+
_userEvent["default"].keyboard('{enter}');
|
|
81
|
+
|
|
82
|
+
var _screen$getAllByRole = _react2.screen.getAllByRole('button'),
|
|
83
|
+
openPopover = _screen$getAllByRole[0],
|
|
84
|
+
buttonOne = _screen$getAllByRole[1],
|
|
85
|
+
buttonTwo = _screen$getAllByRole[2],
|
|
86
|
+
buttonThree = _screen$getAllByRole[3];
|
|
87
|
+
|
|
88
|
+
expect(openPopover).toHaveFocus();
|
|
89
|
+
|
|
90
|
+
_userEvent["default"].tab();
|
|
91
|
+
|
|
92
|
+
expect(buttonOne).toHaveFocus();
|
|
93
|
+
|
|
94
|
+
_userEvent["default"].tab();
|
|
95
|
+
|
|
96
|
+
expect(buttonTwo).toHaveFocus();
|
|
97
|
+
|
|
98
|
+
_userEvent["default"].tab();
|
|
99
|
+
|
|
100
|
+
expect(buttonThree).toHaveFocus();
|
|
101
|
+
|
|
102
|
+
_userEvent["default"].tab();
|
|
103
|
+
|
|
104
|
+
expect(buttonOne).toHaveFocus();
|
|
105
|
+
});
|
|
106
|
+
it('should trap focus, tab backwards from first element to last', function () {
|
|
107
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(StatefulDropdown, null));
|
|
108
|
+
|
|
109
|
+
_userEvent["default"].tab();
|
|
110
|
+
|
|
111
|
+
_userEvent["default"].keyboard('{enter}');
|
|
112
|
+
|
|
113
|
+
var _screen$getAllByRole2 = _react2.screen.getAllByRole('button'),
|
|
114
|
+
openPopover = _screen$getAllByRole2[0],
|
|
115
|
+
buttonOne = _screen$getAllByRole2[1],
|
|
116
|
+
_buttonTwo = _screen$getAllByRole2[2],
|
|
117
|
+
buttonThree = _screen$getAllByRole2[3];
|
|
118
|
+
|
|
119
|
+
expect(openPopover).toHaveFocus();
|
|
120
|
+
|
|
121
|
+
_userEvent["default"].tab();
|
|
122
|
+
|
|
123
|
+
expect(buttonOne).toHaveFocus();
|
|
124
|
+
|
|
125
|
+
_userEvent["default"].tab({
|
|
126
|
+
shift: true
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
expect(buttonThree).toHaveFocus();
|
|
130
|
+
});
|
|
131
|
+
it('should retain tab order after rerender', function () {
|
|
132
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(StatefulDropdown, null));
|
|
133
|
+
|
|
134
|
+
_userEvent["default"].tab();
|
|
33
135
|
|
|
34
|
-
|
|
136
|
+
_userEvent["default"].keyboard('{enter}');
|
|
137
|
+
|
|
138
|
+
var _screen$getAllByRole3 = _react2.screen.getAllByRole('button'),
|
|
139
|
+
buttonOne = _screen$getAllByRole3[1],
|
|
140
|
+
buttonTwo = _screen$getAllByRole3[2],
|
|
141
|
+
buttonThree = _screen$getAllByRole3[3];
|
|
142
|
+
|
|
143
|
+
_userEvent["default"].tab();
|
|
144
|
+
|
|
145
|
+
_userEvent["default"].tab();
|
|
146
|
+
|
|
147
|
+
expect(_react2.screen.getByTestId('count-text')).toHaveTextContent('0');
|
|
148
|
+
|
|
149
|
+
_userEvent["default"].keyboard('{enter}');
|
|
150
|
+
|
|
151
|
+
expect(_react2.screen.getByTestId('count-text')).toHaveTextContent('1');
|
|
152
|
+
expect(buttonTwo).toHaveFocus();
|
|
153
|
+
|
|
154
|
+
_userEvent["default"].tab();
|
|
155
|
+
|
|
156
|
+
expect(buttonThree).toHaveFocus();
|
|
157
|
+
|
|
158
|
+
_userEvent["default"].tab({
|
|
159
|
+
shift: true
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
_userEvent["default"].tab({
|
|
163
|
+
shift: true
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
expect(buttonOne).toHaveFocus();
|
|
167
|
+
|
|
168
|
+
_userEvent["default"].tab();
|
|
169
|
+
|
|
170
|
+
_userEvent["default"].tab();
|
|
171
|
+
|
|
172
|
+
_userEvent["default"].tab();
|
|
173
|
+
|
|
174
|
+
expect(buttonOne).toHaveFocus();
|
|
175
|
+
|
|
176
|
+
_userEvent["default"].tab({
|
|
177
|
+
shift: true
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
_userEvent["default"].tab({
|
|
181
|
+
shift: true
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
_userEvent["default"].tab({
|
|
185
|
+
shift: true
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
expect(buttonOne).toHaveFocus();
|
|
189
|
+
});
|
|
190
|
+
it('should focus dropdown toggle when a user presses escape key', function () {
|
|
191
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(StatefulDropdown, null));
|
|
192
|
+
|
|
193
|
+
_userEvent["default"].tab();
|
|
194
|
+
|
|
195
|
+
_userEvent["default"].keyboard('{enter}');
|
|
196
|
+
|
|
197
|
+
var _screen$getAllByRole4 = _react2.screen.getAllByRole('button'),
|
|
198
|
+
openPopover = _screen$getAllByRole4[0],
|
|
199
|
+
buttonOne = _screen$getAllByRole4[1];
|
|
200
|
+
|
|
201
|
+
_userEvent["default"].tab();
|
|
202
|
+
|
|
203
|
+
expect(buttonOne).toHaveFocus();
|
|
204
|
+
|
|
205
|
+
_userEvent["default"].keyboard("{esc}");
|
|
206
|
+
|
|
207
|
+
expect(openPopover).toHaveFocus();
|
|
208
|
+
});
|
|
209
|
+
});
|
|
35
210
|
});
|
package/dist/cjs/Group/Group.js
CHANGED
|
@@ -29,7 +29,8 @@ function Group(_ref) {
|
|
|
29
29
|
childProps = _ref.childProps,
|
|
30
30
|
children = _ref.children,
|
|
31
31
|
radius = _ref.radius,
|
|
32
|
-
|
|
32
|
+
spacing = _ref.spacing,
|
|
33
|
+
restProps = (0, _objectWithoutPropertiesLoose2["default"])(_ref, ["axis", "childProps", "children", "radius", "spacing"]);
|
|
33
34
|
var themeRadius = (0, _system.useThemeValue)('group.radius');
|
|
34
35
|
var radiusValue = radius != null ? radius : themeRadius;
|
|
35
36
|
var isHorizontalLayout = axis === 'horizontal';
|
|
@@ -38,15 +39,16 @@ function Group(_ref) {
|
|
|
38
39
|
var marginBottom = isHorizontalLayout ? 0 : '-1px';
|
|
39
40
|
var marginRight = isHorizontalLayout ? '-1px' : 0;
|
|
40
41
|
return /*#__PURE__*/_react["default"].createElement(_StackView["default"], (0, _extends2["default"])({
|
|
41
|
-
axis: axis
|
|
42
|
+
axis: axis,
|
|
43
|
+
spacing: spacing
|
|
42
44
|
}, restProps), (0, _utils.cloneChildren)(children, function (child, _ref2) {
|
|
43
45
|
var _objectSpread2;
|
|
44
46
|
|
|
45
47
|
var firstChild = _ref2.firstChild,
|
|
46
48
|
lastChild = _ref2.lastChild;
|
|
47
|
-
return _objectSpread(_objectSpread(_objectSpread({}, childProps), {}, (_objectSpread2 = {}, _objectSpread2[startRadius] = firstChild ? radiusValue : 0, _objectSpread2[endRadius] = lastChild ? radiusValue : 0, _objectSpread2), !lastChild && {
|
|
49
|
+
return _objectSpread(_objectSpread(_objectSpread({}, childProps), {}, (_objectSpread2 = {}, _objectSpread2[startRadius] = firstChild ? radiusValue : 0, _objectSpread2[endRadius] = lastChild ? radiusValue : 0, _objectSpread2), !spacing && !lastChild && {
|
|
48
50
|
marginBottom: marginBottom
|
|
49
|
-
}), !lastChild && {
|
|
51
|
+
}), !spacing && !lastChild && {
|
|
50
52
|
marginRight: marginRight
|
|
51
53
|
});
|
|
52
54
|
}));
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
6
|
+
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
|
|
9
|
+
var _react2 = require("@testing-library/react");
|
|
10
|
+
|
|
11
|
+
var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
|
|
12
|
+
|
|
13
|
+
require("@testing-library/jest-dom/extend-expect");
|
|
14
|
+
|
|
15
|
+
var _Dropdown = _interopRequireDefault(require("../Dropdown"));
|
|
16
|
+
|
|
17
|
+
var _Select = _interopRequireDefault(require("../Select"));
|
|
18
|
+
|
|
19
|
+
var _ = require("../");
|
|
20
|
+
|
|
21
|
+
var _lodash = require("lodash");
|
|
22
|
+
|
|
23
|
+
describe('Modal', function () {
|
|
24
|
+
var TestModal = function TestModal() {
|
|
25
|
+
var _useState = (0, _react.useState)(false),
|
|
26
|
+
open = _useState[0],
|
|
27
|
+
setOpen = _useState[1];
|
|
28
|
+
|
|
29
|
+
return /*#__PURE__*/_react["default"].createElement(_.ThemeProvider, null, /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_.Button, {
|
|
30
|
+
"data-testid": "modal-toggle",
|
|
31
|
+
onClick: function onClick() {
|
|
32
|
+
return setOpen(!open);
|
|
33
|
+
},
|
|
34
|
+
title: "Toggle modal"
|
|
35
|
+
}), /*#__PURE__*/_react["default"].createElement(_.Modal, {
|
|
36
|
+
open: open,
|
|
37
|
+
onRequestClose: function onRequestClose() {
|
|
38
|
+
return setOpen(false);
|
|
39
|
+
}
|
|
40
|
+
}, /*#__PURE__*/_react["default"].createElement(_.Heading, {
|
|
41
|
+
"data-testid": "modal-header"
|
|
42
|
+
}, "Hello"), /*#__PURE__*/_react["default"].createElement(_Dropdown["default"], null, [1, 2, 3].map(function (n) {
|
|
43
|
+
return /*#__PURE__*/_react["default"].createElement(_Dropdown["default"].Item, {
|
|
44
|
+
"data-testid": "dropdown-item-" + n,
|
|
45
|
+
key: n
|
|
46
|
+
}, n);
|
|
47
|
+
})), /*#__PURE__*/_react["default"].createElement(_Select["default"], {
|
|
48
|
+
onChange: _lodash.noop
|
|
49
|
+
}, [1, 2, 3].map(function (n) {
|
|
50
|
+
return /*#__PURE__*/_react["default"].createElement(_Select["default"].Option, {
|
|
51
|
+
"data-testid": "select-option-" + n,
|
|
52
|
+
key: n,
|
|
53
|
+
value: n
|
|
54
|
+
}, n);
|
|
55
|
+
})))));
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
describe('Keyboard navigation', function () {
|
|
59
|
+
it('should close modal on escape keypress (dropdown button has focus)', function () {
|
|
60
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(TestModal, null));
|
|
61
|
+
expect(_react2.screen.queryByTestId('modal-header')).toBeNull();
|
|
62
|
+
|
|
63
|
+
_userEvent["default"].click(_react2.screen.getByTestId('modal-toggle'));
|
|
64
|
+
|
|
65
|
+
expect(_react2.screen.getByTestId('modal-header')).toBeInTheDocument();
|
|
66
|
+
|
|
67
|
+
_userEvent["default"].keyboard("{esc}");
|
|
68
|
+
|
|
69
|
+
expect(_react2.screen.queryByTestId('modal-header')).toBeNull();
|
|
70
|
+
});
|
|
71
|
+
it('should not close modal when escape key closes a dropdown within modal', function () {
|
|
72
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(TestModal, null));
|
|
73
|
+
|
|
74
|
+
_userEvent["default"].click(_react2.screen.getByTestId('modal-toggle'));
|
|
75
|
+
|
|
76
|
+
var _screen$getAllByRole = _react2.screen.getAllByRole('button'),
|
|
77
|
+
dropdown = _screen$getAllByRole[1];
|
|
78
|
+
|
|
79
|
+
expect(dropdown).toHaveFocus();
|
|
80
|
+
|
|
81
|
+
_userEvent["default"].keyboard('{arrowdown}');
|
|
82
|
+
|
|
83
|
+
_userEvent["default"].keyboard("{esc}");
|
|
84
|
+
|
|
85
|
+
expect(_react2.screen.getByTestId('modal-header')).toBeInTheDocument();
|
|
86
|
+
});
|
|
87
|
+
it('should close dropdown on escape & close modal on subsequent escape', function () {
|
|
88
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(TestModal, null));
|
|
89
|
+
|
|
90
|
+
_userEvent["default"].click(_react2.screen.getByTestId('modal-toggle'));
|
|
91
|
+
|
|
92
|
+
_userEvent["default"].keyboard('{arrowdown}');
|
|
93
|
+
|
|
94
|
+
_userEvent["default"].keyboard("{esc}");
|
|
95
|
+
|
|
96
|
+
expect(_react2.screen.getByTestId('modal-header')).toBeInTheDocument();
|
|
97
|
+
|
|
98
|
+
_userEvent["default"].keyboard("{esc}");
|
|
99
|
+
|
|
100
|
+
expect(_react2.screen.queryByTestId('modal-header')).toBeNull();
|
|
101
|
+
});
|
|
102
|
+
it('should hide select popover on escape, but select remains in dom', function () {
|
|
103
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(TestModal, null));
|
|
104
|
+
|
|
105
|
+
_userEvent["default"].click(_react2.screen.getByTestId('modal-toggle'));
|
|
106
|
+
|
|
107
|
+
_userEvent["default"].tab();
|
|
108
|
+
|
|
109
|
+
_userEvent["default"].keyboard('{arrowdown}');
|
|
110
|
+
|
|
111
|
+
_userEvent["default"].keyboard("{esc}");
|
|
112
|
+
|
|
113
|
+
expect(_react2.screen.queryByTestId('select-option-1')).toBeInTheDocument();
|
|
114
|
+
});
|
|
115
|
+
it('should hide select popover on escape, close (unmount) select popover on subsequent escape, persist modal', function () {
|
|
116
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(TestModal, null));
|
|
117
|
+
|
|
118
|
+
_userEvent["default"].click(_react2.screen.getByTestId('modal-toggle'));
|
|
119
|
+
|
|
120
|
+
_userEvent["default"].tab();
|
|
121
|
+
|
|
122
|
+
_userEvent["default"].keyboard('{arrowdown}');
|
|
123
|
+
|
|
124
|
+
_userEvent["default"].keyboard("{esc}");
|
|
125
|
+
|
|
126
|
+
expect(_react2.screen.queryByTestId('select-option-1')).toBeInTheDocument();
|
|
127
|
+
|
|
128
|
+
_userEvent["default"].keyboard("{esc}");
|
|
129
|
+
|
|
130
|
+
expect(_react2.screen.queryByTestId('select-option-1')).toBeNull();
|
|
131
|
+
expect(_react2.screen.queryByTestId('modal-header')).toBeInTheDocument();
|
|
132
|
+
});
|
|
133
|
+
it('should hide select popover on escape, close (unmount) select popover on subsequent escape, close modal on subsequent escape', function () {
|
|
134
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(TestModal, null));
|
|
135
|
+
|
|
136
|
+
_userEvent["default"].click(_react2.screen.getByTestId('modal-toggle'));
|
|
137
|
+
|
|
138
|
+
_userEvent["default"].tab();
|
|
139
|
+
|
|
140
|
+
_userEvent["default"].keyboard('{arrowdown}');
|
|
141
|
+
|
|
142
|
+
_userEvent["default"].keyboard("{esc}");
|
|
143
|
+
|
|
144
|
+
expect(_react2.screen.queryByTestId('select-option-1')).toBeInTheDocument();
|
|
145
|
+
|
|
146
|
+
_userEvent["default"].keyboard("{esc}");
|
|
147
|
+
|
|
148
|
+
expect(_react2.screen.queryByTestId('select-option-1')).toBeNull();
|
|
149
|
+
expect(_react2.screen.queryByTestId('modal-header')).toBeInTheDocument();
|
|
150
|
+
|
|
151
|
+
_userEvent["default"].keyboard("{esc}");
|
|
152
|
+
|
|
153
|
+
expect(_react2.screen.queryByTestId('modal-header')).toBeNull();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
});
|
|
@@ -119,6 +119,10 @@ var Popover = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
|
119
119
|
|
|
120
120
|
var requestClose = function requestClose(event) {
|
|
121
121
|
if (event.key === 'Escape' && onRequestClose) {
|
|
122
|
+
if (open) {
|
|
123
|
+
event.nativeEvent.stopImmediatePropagation();
|
|
124
|
+
}
|
|
125
|
+
|
|
122
126
|
onRequestClose();
|
|
123
127
|
}
|
|
124
128
|
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
6
|
+
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
|
|
9
|
+
var _react2 = require("@testing-library/react");
|
|
10
|
+
|
|
11
|
+
var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
|
|
12
|
+
|
|
13
|
+
require("@testing-library/jest-dom/extend-expect");
|
|
14
|
+
|
|
15
|
+
var _ = require("..");
|
|
16
|
+
|
|
17
|
+
var PopBasic = function PopBasic(_ref) {
|
|
18
|
+
var children = _ref.children;
|
|
19
|
+
|
|
20
|
+
var _useState = (0, _react.useState)(false),
|
|
21
|
+
open = _useState[0],
|
|
22
|
+
setOpen = _useState[1];
|
|
23
|
+
|
|
24
|
+
return /*#__PURE__*/_react["default"].createElement(_.Box, {
|
|
25
|
+
id: "container"
|
|
26
|
+
}, /*#__PURE__*/_react["default"].createElement(_.Popover, {
|
|
27
|
+
open: open,
|
|
28
|
+
offset: 1,
|
|
29
|
+
renderTo: "#container",
|
|
30
|
+
anchorElement: /*#__PURE__*/_react["default"].createElement(_.Button, {
|
|
31
|
+
title: "Toggle",
|
|
32
|
+
onClick: function onClick() {
|
|
33
|
+
return setOpen(!open);
|
|
34
|
+
},
|
|
35
|
+
id: "anchor-element"
|
|
36
|
+
})
|
|
37
|
+
}, children));
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
describe('Popover', function () {
|
|
41
|
+
it('should not render string in closed Popover', function () {
|
|
42
|
+
var string = 'Test Text';
|
|
43
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(PopBasic, null, /*#__PURE__*/_react["default"].createElement(_.Text, null, string)));
|
|
44
|
+
expect(_react2.screen.queryByText(string)).toBeNull();
|
|
45
|
+
});
|
|
46
|
+
it('should render string in open Popover', function () {
|
|
47
|
+
var string = 'Test Text';
|
|
48
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(PopBasic, null, /*#__PURE__*/_react["default"].createElement(_.Text, null, string)));
|
|
49
|
+
|
|
50
|
+
var openPopover = _react2.screen.getByRole('button');
|
|
51
|
+
|
|
52
|
+
_userEvent["default"].click(openPopover);
|
|
53
|
+
|
|
54
|
+
expect(_react2.screen.getByText(string)).toBeInTheDocument();
|
|
55
|
+
});
|
|
56
|
+
it('should focus open button on click', function () {
|
|
57
|
+
(0, _react2.render)( /*#__PURE__*/_react["default"].createElement(PopBasic, null, /*#__PURE__*/_react["default"].createElement(_.Box, null)));
|
|
58
|
+
|
|
59
|
+
var openPopover = _react2.screen.getByRole('button');
|
|
60
|
+
|
|
61
|
+
_userEvent["default"].click(openPopover);
|
|
62
|
+
|
|
63
|
+
expect(openPopover).toHaveFocus();
|
|
64
|
+
});
|
|
65
|
+
});
|
|
@@ -36,38 +36,29 @@ var RewireTabOrder = /*#__PURE__*/function () {
|
|
|
36
36
|
(0, _defineProperty2["default"])(this, "lastFocusableElement", null);
|
|
37
37
|
(0, _defineProperty2["default"])(this, "originalActiveElement", null);
|
|
38
38
|
(0, _defineProperty2["default"])(this, "nextActiveElement", null);
|
|
39
|
-
(0, _defineProperty2["default"])(this, "focusOriginalActiveElement", function () {
|
|
40
|
-
_this.originalActiveElement.focus();
|
|
41
|
-
});
|
|
42
|
-
(0, _defineProperty2["default"])(this, "focusNextActiveElement", function () {
|
|
43
|
-
_this.nextActiveElement.focus();
|
|
44
|
-
});
|
|
45
39
|
(0, _defineProperty2["default"])(this, "moveFocusToTargetFromTriggerElement", function (event) {
|
|
46
40
|
if (!event.shiftKey && event.keyCode === TAB_KEY) {
|
|
47
41
|
event.preventDefault();
|
|
48
42
|
|
|
49
|
-
_this.
|
|
43
|
+
if (_this.tabbables.includes(_this.nextActiveElement)) {
|
|
44
|
+
_this.nextActiveElement.focus();
|
|
45
|
+
} else {
|
|
46
|
+
_this.firstFocusableElement.focus();
|
|
47
|
+
}
|
|
50
48
|
}
|
|
51
49
|
});
|
|
52
|
-
(0, _defineProperty2["default"])(this, "
|
|
50
|
+
(0, _defineProperty2["default"])(this, "moveFocusToTargetFromFirstElement", function (event) {
|
|
53
51
|
if (event.target === _this.firstFocusableElement && event.shiftKey && event.keyCode === TAB_KEY) {
|
|
54
52
|
event.preventDefault();
|
|
55
53
|
|
|
56
|
-
_this.originalActiveElement.focus();
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
(0, _defineProperty2["default"])(this, "moveFocusToTargetFromNextElement", function (event) {
|
|
60
|
-
if (event.shiftKey && event.keyCode === TAB_KEY) {
|
|
61
|
-
event.preventDefault();
|
|
62
|
-
|
|
63
54
|
_this.lastFocusableElement.focus();
|
|
64
55
|
}
|
|
65
56
|
});
|
|
66
|
-
(0, _defineProperty2["default"])(this, "
|
|
67
|
-
if (!event.shiftKey && event.keyCode === TAB_KEY) {
|
|
57
|
+
(0, _defineProperty2["default"])(this, "moveFocusToTargetFromLastElement", function (event) {
|
|
58
|
+
if (event.target === _this.lastFocusableElement && !event.shiftKey && event.keyCode === TAB_KEY) {
|
|
68
59
|
event.preventDefault();
|
|
69
60
|
|
|
70
|
-
_this.
|
|
61
|
+
_this.firstFocusableElement.focus();
|
|
71
62
|
}
|
|
72
63
|
});
|
|
73
64
|
|
|
@@ -88,12 +79,8 @@ var RewireTabOrder = /*#__PURE__*/function () {
|
|
|
88
79
|
this.originalActiveElement = document.activeElement;
|
|
89
80
|
this.nextActiveElement = getNextActiveElement(this.originalActiveElement);
|
|
90
81
|
this.originalActiveElement.addEventListener('keydown', this.moveFocusToTargetFromTriggerElement);
|
|
91
|
-
this.firstFocusableElement.addEventListener('keydown', this.
|
|
92
|
-
|
|
93
|
-
if (this.nextActiveElement) {
|
|
94
|
-
this.nextActiveElement.addEventListener('keydown', this.moveFocusToTargetFromNextElement);
|
|
95
|
-
this.lastFocusableElement.addEventListener('keydown', this.moveFocusFromTargetToNextElement);
|
|
96
|
-
}
|
|
82
|
+
this.firstFocusableElement.addEventListener('keydown', this.moveFocusToTargetFromFirstElement);
|
|
83
|
+
this.lastFocusableElement.addEventListener('keydown', this.moveFocusToTargetFromLastElement);
|
|
97
84
|
};
|
|
98
85
|
|
|
99
86
|
_proto.destroy = function destroy() {
|
|
@@ -102,12 +89,8 @@ var RewireTabOrder = /*#__PURE__*/function () {
|
|
|
102
89
|
}
|
|
103
90
|
|
|
104
91
|
this.originalActiveElement.removeEventListener('keydown', this.moveFocusToTargetFromTriggerElement);
|
|
105
|
-
this.firstFocusableElement.removeEventListener('keydown', this.
|
|
106
|
-
|
|
107
|
-
if (this.nextActiveElement) {
|
|
108
|
-
this.nextActiveElement.removeEventListener('keydown', this.moveFocusToTargetFromNextElement);
|
|
109
|
-
this.lastFocusableElement.removeEventListener('keydown', this.moveFocusFromTargetToNextElement);
|
|
110
|
-
}
|
|
92
|
+
this.firstFocusableElement.removeEventListener('keydown', this.moveFocusToTargetFromFirstElement);
|
|
93
|
+
this.lastFocusableElement.removeEventListener('keydown', this.moveFocusToTargetFromLastElement);
|
|
111
94
|
};
|
|
112
95
|
|
|
113
96
|
return RewireTabOrder;
|
|
@@ -366,6 +366,15 @@ var Select = /*#__PURE__*/function (_Component) {
|
|
|
366
366
|
|
|
367
367
|
break;
|
|
368
368
|
|
|
369
|
+
case 'Escape':
|
|
370
|
+
if (isPopoverOpen && !isPopoverVisible) {
|
|
371
|
+
event.preventDefault();
|
|
372
|
+
|
|
373
|
+
_this2.closePopover();
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
break;
|
|
377
|
+
|
|
369
378
|
case ' ':
|
|
370
379
|
event.preventDefault();
|
|
371
380
|
|