@planningcenter/tapestry-react 2.0.0-rc.0 → 2.0.1-rc.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/dist/cjs/DataTable/hooks/useCollapsibleRows.js +1 -1
- 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/Scrim/Scrim.js +1 -1
- package/dist/cjs/Select/Select.js +9 -0
- package/dist/cjs/Sidebar/Sidebar.js +4 -3
- package/dist/cjs/Table/Table.js +3 -5
- package/dist/cjs/ThemeProvider/ThemeProvider.js +5 -5
- package/dist/cjs/hooks/useConstant.js +23 -0
- package/dist/cjs/system/utils.js +2 -2
- package/dist/cjs/utils.js +3 -3
- package/dist/esm/DataTable/hooks/useCollapsibleRows.js +1 -1
- 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/Scrim/Scrim.js +1 -1
- package/dist/esm/Select/Select.js +9 -0
- package/dist/esm/Sidebar/Sidebar.js +4 -2
- package/dist/esm/Table/Table.js +1 -2
- package/dist/esm/ThemeProvider/ThemeProvider.js +1 -1
- package/dist/esm/hooks/useConstant.js +15 -0
- package/dist/esm/system/utils.js +1 -1
- package/dist/esm/utils.js +3 -3
- 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/dist/types/hooks/useConstant.d.ts +1 -0
- package/package.json +15 -24
- package/src/DataTable/hooks/useCollapsibleRows.js +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/Scrim/Scrim.tsx +3 -3
- package/src/Select/Select.js +6 -0
- package/src/Sidebar/Sidebar.js +7 -5
- package/src/Table/Table.js +1 -2
- package/src/ThemeProvider/ThemeProvider.tsx +1 -1
- package/src/hooks/useConstant.ts +17 -0
- package/src/system/utils.js +1 -1
- package/src/utils.js +3 -3
- package/src/utils.test.js +29 -0
|
@@ -13,7 +13,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
|
|
|
13
13
|
|
|
14
14
|
var _react = require("react");
|
|
15
15
|
|
|
16
|
-
var _useConstant = _interopRequireDefault(require("
|
|
16
|
+
var _useConstant = _interopRequireDefault(require("../../hooks/useConstant"));
|
|
17
17
|
|
|
18
18
|
var _zustand = _interopRequireDefault(require("zustand"));
|
|
19
19
|
|
|
@@ -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;
|
package/dist/cjs/Scrim/Scrim.js
CHANGED
|
@@ -13,7 +13,7 @@ var React = _interopRequireWildcard(require("react"));
|
|
|
13
13
|
|
|
14
14
|
var _StackView = _interopRequireDefault(require("../StackView"));
|
|
15
15
|
|
|
16
|
-
var Scrim = /*#__PURE__*/React.forwardRef(function (props) {
|
|
16
|
+
var Scrim = /*#__PURE__*/React.forwardRef(function (props, _ref) {
|
|
17
17
|
React.useLayoutEffect(function () {
|
|
18
18
|
document.body.style.overflow = 'hidden';
|
|
19
19
|
return function () {
|
|
@@ -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
|
|
|
@@ -15,8 +15,6 @@ var _react = require("react");
|
|
|
15
15
|
|
|
16
16
|
var _reactStickyBox = _interopRequireDefault(require("react-sticky-box"));
|
|
17
17
|
|
|
18
|
-
var _warning = _interopRequireDefault(require("warning"));
|
|
19
|
-
|
|
20
18
|
var _system = require("../system");
|
|
21
19
|
|
|
22
20
|
var _StackView = _interopRequireDefault(require("../StackView"));
|
|
@@ -44,7 +42,10 @@ function Sidebar(_ref) {
|
|
|
44
42
|
}, restProps), (0, _core.jsx)(_reactStickyBox["default"], {
|
|
45
43
|
css: flexColumnCss
|
|
46
44
|
}, _react.Children.map(children, function (child) {
|
|
47
|
-
|
|
45
|
+
if (child && child.type !== Sidebar.List || child && child.type !== Sidebar.Item) {
|
|
46
|
+
console.warn("Invalid component nesting. " + child.type + " cannot appear as a child of <Sidebar>. Only <Sidebar.List/> or <Sidebar.Item/> may be used.");
|
|
47
|
+
}
|
|
48
|
+
|
|
48
49
|
return child;
|
|
49
50
|
})));
|
|
50
51
|
}
|
package/dist/cjs/Table/Table.js
CHANGED
|
@@ -21,9 +21,7 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
21
21
|
|
|
22
22
|
var _core = require("@emotion/core");
|
|
23
23
|
|
|
24
|
-
var _lodash =
|
|
25
|
-
|
|
26
|
-
var _lodash2 = _interopRequireDefault(require("lodash.snakecase"));
|
|
24
|
+
var _lodash = require("lodash");
|
|
27
25
|
|
|
28
26
|
var _Button = _interopRequireDefault(require("../Button"));
|
|
29
27
|
|
|
@@ -311,13 +309,13 @@ var Table = /*#__PURE__*/function (_PureComponent) {
|
|
|
311
309
|
_proto.getSortOrder = function getSortOrder(_ref3) {
|
|
312
310
|
var columnId = _ref3.columnId,
|
|
313
311
|
direction = _ref3.direction;
|
|
314
|
-
return "" + (direction === Table.ASC ? '' : '-') + (0,
|
|
312
|
+
return "" + (direction === Table.ASC ? '' : '-') + (0, _lodash.snakeCase)(columnId);
|
|
315
313
|
};
|
|
316
314
|
|
|
317
315
|
_proto.parseSortOrder = function parseSortOrder(query) {
|
|
318
316
|
var isDescending = query[0] === '-';
|
|
319
317
|
return {
|
|
320
|
-
columnId: (0, _lodash
|
|
318
|
+
columnId: (0, _lodash.camelCase)(isDescending ? query.substring(1) : query),
|
|
321
319
|
direction: isDescending ? Table.DESC : Table.ASC
|
|
322
320
|
};
|
|
323
321
|
};
|