@pingux/astro 2.32.0-alpha.8 → 2.32.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/lib/cjs/components/TreeView/TreeView.js +99 -11
- package/lib/cjs/components/TreeView/TreeView.stories.js +23 -10
- package/lib/cjs/components/TreeView/TreeView.styles.js +22 -2
- package/lib/cjs/components/TreeView/TreeView.test.js +91 -11
- package/lib/cjs/components/TreeView/TreeViewItem.js +112 -14
- package/lib/cjs/components/TreeView/TreeViewKeyboardDelegate.js +200 -0
- package/lib/cjs/components/TreeView/TreeViewKeyboardDelegate.test.js +511 -0
- package/lib/cjs/components/TreeView/TreeViewRow.js +20 -5
- package/lib/cjs/components/TreeView/TreeViewSection.js +164 -16
- package/lib/cjs/components/TreeView/TreeViewWrapper.js +40 -0
- package/lib/cjs/hooks/useField/index.d.ts +1 -0
- package/lib/cjs/hooks/useField/useField.d.ts +1686 -0
- package/lib/cjs/hooks/useField/useField.js +7 -16
- package/lib/cjs/hooks/useField/useField.test.d.ts +1 -0
- package/lib/cjs/hooks/useField/useField.test.js +6 -6
- package/lib/cjs/hooks/useModalState/index.d.ts +1 -0
- package/lib/cjs/hooks/useModalState/useModalState.d.ts +21 -0
- package/lib/cjs/hooks/useModalState/useModalState.js +0 -9
- package/lib/cjs/hooks/useModalState/useModalState.test.d.ts +1 -0
- package/lib/cjs/hooks/useMountTransition/index.d.ts +1 -0
- package/lib/cjs/hooks/useMountTransition/useMountTransition.d.ts +14 -0
- package/lib/cjs/hooks/useMountTransition/useMountTransition.js +0 -9
- package/lib/cjs/hooks/useMountTransition/useMountTransition.test.d.ts +1 -0
- package/lib/cjs/hooks/useMountTransition/useMountTransition.test.js +2 -2
- package/lib/cjs/hooks/useStatusClasses/index.d.ts +1 -0
- package/lib/cjs/hooks/useStatusClasses/useStatusClasses.d.ts +18 -0
- package/lib/cjs/hooks/useStatusClasses/useStatusClasses.js +0 -9
- package/lib/cjs/hooks/useStatusClasses/useStatusClasses.test.d.ts +1 -0
- package/lib/components/TreeView/TreeView.js +100 -12
- package/lib/components/TreeView/TreeView.stories.js +23 -10
- package/lib/components/TreeView/TreeView.styles.js +22 -2
- package/lib/components/TreeView/TreeView.test.js +92 -12
- package/lib/components/TreeView/TreeViewItem.js +111 -14
- package/lib/components/TreeView/TreeViewKeyboardDelegate.js +176 -0
- package/lib/components/TreeView/TreeViewKeyboardDelegate.test.js +496 -0
- package/lib/components/TreeView/TreeViewRow.js +20 -5
- package/lib/components/TreeView/TreeViewSection.js +161 -16
- package/lib/components/TreeView/TreeViewWrapper.js +31 -0
- package/lib/hooks/useField/useField.js +7 -16
- package/lib/hooks/useField/useField.test.js +6 -6
- package/lib/hooks/useModalState/useModalState.js +0 -10
- package/lib/hooks/useMountTransition/useMountTransition.js +0 -10
- package/lib/hooks/useMountTransition/useMountTransition.test.js +2 -2
- package/lib/hooks/useStatusClasses/useStatusClasses.js +0 -10
- package/package.json +1 -1
@@ -20,6 +20,7 @@ var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable
|
|
20
20
|
var _from = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/array/from"));
|
21
21
|
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
|
22
22
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
|
23
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
|
23
24
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
|
24
25
|
var _react = _interopRequireWildcard(require("react"));
|
25
26
|
var _reactStately = require("react-stately");
|
@@ -30,8 +31,9 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
30
31
|
var _TreeViewContext = require("../../context/TreeViewContext");
|
31
32
|
var _index = require("../../index");
|
32
33
|
var _isIterable = require("../../utils/devUtils/props/isIterable");
|
34
|
+
var _TreeViewWrapper = _interopRequireDefault(require("./TreeViewWrapper"));
|
33
35
|
var _react2 = require("@emotion/react");
|
34
|
-
var _excluded = ["tree", "disabledKeys", "onExpandedChange"]; // split out and exported for ease of use across components
|
36
|
+
var _excluded = ["tree", "disabledKeys", "onExpandedChange", "onKeyDown", "pageLength"]; // split out and exported for ease of use across components
|
35
37
|
// and to facilitate easier testing (eliminates redundant conditional renders)
|
36
38
|
function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
37
39
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
@@ -57,11 +59,23 @@ function useTreeViewLayout(state) {
|
|
57
59
|
return layout;
|
58
60
|
}
|
59
61
|
var TreeView = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
60
|
-
var _context;
|
62
|
+
var _tree$items$, _context;
|
61
63
|
var tree = props.tree,
|
62
64
|
disabledKeys = props.disabledKeys,
|
63
65
|
onExpandedChange = props.onExpandedChange,
|
66
|
+
onKeyDown = props.onKeyDown,
|
67
|
+
_props$pageLength = props.pageLength,
|
68
|
+
pageLength = _props$pageLength === void 0 ? 5 : _props$pageLength,
|
64
69
|
others = (0, _objectWithoutProperties2["default"])(props, _excluded);
|
70
|
+
|
71
|
+
// we are tracking the last focused item.
|
72
|
+
// this enables us to have focus jump back to the item, after focus
|
73
|
+
// leaves the tree, and then returns.
|
74
|
+
var _useState = (0, _react.useState)(tree === null || tree === void 0 || (_tree$items$ = tree.items[0]) === null || _tree$items$ === void 0 ? void 0 : _tree$items$.key),
|
75
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
76
|
+
lastFocusedItem = _useState2[0],
|
77
|
+
setLastFocusedItem = _useState2[1];
|
78
|
+
var level = 0;
|
65
79
|
var treeViewRef = (0, _react.useRef)();
|
66
80
|
var selectedKeys = tree.selectedKeys;
|
67
81
|
|
@@ -76,7 +90,66 @@ var TreeView = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
76
90
|
selectionMode: 'single',
|
77
91
|
disallowEmptySelection: true
|
78
92
|
}, others));
|
79
|
-
var
|
93
|
+
var flattenNestedData = function flattenNestedData(_data) {
|
94
|
+
var returnArray = [];
|
95
|
+
var checkItemNesting = function checkItemNesting(item) {
|
96
|
+
var _item$value, _item$items;
|
97
|
+
if (((_item$value = item.value) === null || _item$value === void 0 || (_item$value = _item$value.items) === null || _item$value === void 0 ? void 0 : _item$value.length) > 0) {
|
98
|
+
return {
|
99
|
+
isTopLevel: true,
|
100
|
+
hasChildren: true
|
101
|
+
};
|
102
|
+
}
|
103
|
+
if (((_item$items = item.items) === null || _item$items === void 0 ? void 0 : _item$items.length) > 0) {
|
104
|
+
return {
|
105
|
+
isTopLevel: false,
|
106
|
+
hasChildren: true
|
107
|
+
};
|
108
|
+
}
|
109
|
+
return {
|
110
|
+
isTopLevel: false,
|
111
|
+
hasChildren: false
|
112
|
+
};
|
113
|
+
};
|
114
|
+
var checkSection = function checkSection(isRendered, hasItems) {
|
115
|
+
return isRendered && hasItems;
|
116
|
+
};
|
117
|
+
var loop = function loop(data) {
|
118
|
+
for (var i = 0; i < data.length; i += 1) {
|
119
|
+
var obj = {
|
120
|
+
key: data[i].key
|
121
|
+
};
|
122
|
+
returnArray.push(obj);
|
123
|
+
var _checkItemNesting = checkItemNesting(data[i]),
|
124
|
+
hasChildren = _checkItemNesting.hasChildren,
|
125
|
+
isTopLevel = _checkItemNesting.isTopLevel;
|
126
|
+
if (checkSection(state.expandedKeys.has(data[i].key), hasChildren) === true) {
|
127
|
+
if (isTopLevel) {
|
128
|
+
var _data$i$value;
|
129
|
+
loop((_data$i$value = data[i].value) === null || _data$i$value === void 0 ? void 0 : _data$i$value.items);
|
130
|
+
} else {
|
131
|
+
loop(data[i].items);
|
132
|
+
}
|
133
|
+
}
|
134
|
+
}
|
135
|
+
};
|
136
|
+
loop(_data);
|
137
|
+
return returnArray;
|
138
|
+
};
|
139
|
+
|
140
|
+
// list of value pairs of keys and refs
|
141
|
+
// does not need to be in order, because they are values pairs
|
142
|
+
var _useState3 = (0, _react.useState)([]),
|
143
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
144
|
+
refArray = _useState4[0],
|
145
|
+
setRefs = _useState4[1];
|
146
|
+
|
147
|
+
// creates a flattened list of keys for up/down keyboard use
|
148
|
+
// this DOES need to be in the same order as the HTML appears in the DOM.
|
149
|
+
// we are essentially turning all rendered items into a flat list, for up/down
|
150
|
+
var flatKeyArray = (0, _react.useMemo)(function () {
|
151
|
+
return flattenNestedData(props.items);
|
152
|
+
}, [state.expandedKeys]);
|
80
153
|
var ariaLabel = props['aria-label'];
|
81
154
|
var listBoxOptions = {
|
82
155
|
disabledKeys: disabledKeys,
|
@@ -90,7 +163,13 @@ var TreeView = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
90
163
|
return (0, _react2.jsx)(_TreeViewContext.TreeViewContext.Provider, {
|
91
164
|
value: {
|
92
165
|
state: state,
|
93
|
-
tree: tree
|
166
|
+
tree: tree,
|
167
|
+
refArray: refArray,
|
168
|
+
setRefs: setRefs,
|
169
|
+
flatKeyArray: flatKeyArray,
|
170
|
+
pageLength: pageLength,
|
171
|
+
setLastFocusedItem: setLastFocusedItem,
|
172
|
+
lastFocusedItem: lastFocusedItem
|
94
173
|
}
|
95
174
|
}, (0, _react2.jsx)(_index.Box, (0, _extends2["default"])({
|
96
175
|
as: "ul"
|
@@ -99,14 +178,17 @@ var TreeView = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
99
178
|
"aria-label": ariaLabel,
|
100
179
|
role: "treegrid",
|
101
180
|
sx: {
|
102
|
-
overflow: 'hidden'
|
181
|
+
overflow: 'hidden',
|
182
|
+
p: '5px',
|
183
|
+
border: 'none !important'
|
103
184
|
}
|
104
|
-
}, others), (0, _map["default"])(_context = (0, _from["default"])(state.collection)).call(_context, function (item, index) {
|
185
|
+
}, others), (0, _react2.jsx)(_TreeViewWrapper["default"], null, (0, _map["default"])(_context = (0, _from["default"])(state.collection)).call(_context, function (item, index) {
|
105
186
|
return SectionOrItemRender(item.props.items.length > 0, (0, _react2.jsx)(_index.TreeViewSection, {
|
106
187
|
item: item,
|
107
188
|
items: item.props.items,
|
108
189
|
title: item.props.title,
|
109
190
|
key: item.props.title,
|
191
|
+
onKeyDown: onKeyDown,
|
110
192
|
level: level + 1,
|
111
193
|
setSize: state.collection.size,
|
112
194
|
position: index
|
@@ -114,17 +196,19 @@ var TreeView = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
114
196
|
item: item,
|
115
197
|
title: item.value.value.title,
|
116
198
|
key: item.value.value.title,
|
199
|
+
onKeyDown: onKeyDown,
|
117
200
|
level: level + 1,
|
118
|
-
|
119
|
-
|
201
|
+
setSize: state.collection.size,
|
202
|
+
position: index
|
120
203
|
}));
|
121
|
-
})));
|
204
|
+
}))));
|
122
205
|
});
|
123
206
|
TreeView.propTypes = {
|
124
207
|
/** data object prop that is required to make the tree function
|
125
208
|
this is returned from the useTreeData hook in React-Aria */
|
126
209
|
tree: _propTypes["default"].shape({
|
127
|
-
selectedKeys: _isIterable.isIterableProp
|
210
|
+
selectedKeys: _isIterable.isIterableProp,
|
211
|
+
items: _isIterable.isIterableProp
|
128
212
|
}).isRequired,
|
129
213
|
/** The currently disabled keys in the collection. */
|
130
214
|
disabledKeys: _propTypes["default"].arrayOf(_propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].object])),
|
@@ -133,7 +217,11 @@ TreeView.propTypes = {
|
|
133
217
|
/** The list of TreeView items. */
|
134
218
|
items: _isIterable.isIterableProp,
|
135
219
|
/** String that describes the treeview when using a screen reader. */
|
136
|
-
'aria-label': _propTypes["default"].string
|
220
|
+
'aria-label': _propTypes["default"].string,
|
221
|
+
/** Handler that is called when a key is pressed. */
|
222
|
+
onKeyDown: _propTypes["default"].func,
|
223
|
+
/** Number of items to move the focus when page up or page down is pressed */
|
224
|
+
pageLength: _propTypes["default"].number
|
137
225
|
};
|
138
226
|
var _default = TreeView;
|
139
227
|
exports["default"] = _default;
|
@@ -29,36 +29,50 @@ var _default = {
|
|
29
29
|
exports["default"] = _default;
|
30
30
|
var data = [{
|
31
31
|
title: 'Policies',
|
32
|
+
key: 'Policies',
|
32
33
|
items: [{
|
33
34
|
title: 'Registration',
|
35
|
+
key: 'Registration',
|
34
36
|
items: [{
|
35
|
-
title: 'Registration A'
|
37
|
+
title: 'Registration A',
|
38
|
+
key: 'Registration A'
|
36
39
|
}, {
|
37
40
|
title: 'Registration B',
|
41
|
+
key: 'Registration B',
|
38
42
|
items: [{
|
39
|
-
title: 'Registration B1'
|
43
|
+
title: 'Registration B1',
|
44
|
+
key: 'Registration B1'
|
40
45
|
}, {
|
41
|
-
title: 'Registration B2'
|
46
|
+
title: 'Registration B2',
|
47
|
+
key: 'Registration B2'
|
42
48
|
}]
|
43
49
|
}, {
|
44
|
-
title: 'Registration C'
|
50
|
+
title: 'Registration C',
|
51
|
+
key: 'Registration C'
|
45
52
|
}, {
|
46
|
-
title: 'Registration D'
|
53
|
+
title: 'Registration D',
|
54
|
+
key: 'Registration D'
|
47
55
|
}]
|
48
56
|
}, {
|
49
57
|
title: 'Authentication',
|
58
|
+
key: 'Authentication',
|
50
59
|
items: [{
|
51
|
-
title: 'Authentication A'
|
60
|
+
title: 'Authentication A',
|
61
|
+
key: 'Authentication A'
|
52
62
|
}, {
|
53
|
-
title: 'Authentication B'
|
63
|
+
title: 'Authentication B',
|
64
|
+
key: 'Authentication B'
|
54
65
|
}]
|
55
66
|
}]
|
56
67
|
}, {
|
57
68
|
title: 'Other',
|
69
|
+
key: 'Other',
|
58
70
|
items: [{
|
59
|
-
title: 'Other A'
|
71
|
+
title: 'Other A',
|
72
|
+
key: 'Other A'
|
60
73
|
}]
|
61
74
|
}, {
|
75
|
+
key: 'Single Item',
|
62
76
|
title: 'Single Item'
|
63
77
|
}];
|
64
78
|
var Default = function Default(args) {
|
@@ -74,8 +88,7 @@ var Default = function Default(args) {
|
|
74
88
|
return (0, _react2.jsx)(_index.TreeView, (0, _extends2["default"])({}, args, {
|
75
89
|
items: tree.items,
|
76
90
|
tree: tree,
|
77
|
-
"aria-label": "Example Tree"
|
78
|
-
disabledKeys: ['Single Item']
|
91
|
+
"aria-label": "Example Tree"
|
79
92
|
}), function (section) {
|
80
93
|
var _section$value;
|
81
94
|
return (0, _react2.jsx)(_index.Item, {
|
@@ -10,7 +10,7 @@ var treeRow = {
|
|
10
10
|
cursor: 'pointer',
|
11
11
|
height: '31px',
|
12
12
|
outline: 'none',
|
13
|
-
'&.is-selected, &.is-hovered
|
13
|
+
'&.is-selected, &.is-hovered': {
|
14
14
|
backgroundColor: 'active',
|
15
15
|
'& span': {
|
16
16
|
color: 'white'
|
@@ -24,9 +24,29 @@ var treeRow = {
|
|
24
24
|
},
|
25
25
|
'&.is-expanded': {
|
26
26
|
marginBottom: 'xs'
|
27
|
+
},
|
28
|
+
'& :focus': {
|
29
|
+
border: 'none'
|
27
30
|
}
|
28
31
|
};
|
32
|
+
var wrapper = {
|
33
|
+
'&.is-focused': {
|
34
|
+
boxSizing: 'unset',
|
35
|
+
outline: '1px solid',
|
36
|
+
outlineColor: 'focus',
|
37
|
+
outlineOffset: '2px'
|
38
|
+
},
|
39
|
+
width: '100%',
|
40
|
+
':not(:last-child)': {
|
41
|
+
mb: 'sm'
|
42
|
+
},
|
43
|
+
':focus': {
|
44
|
+
border: 'none'
|
45
|
+
},
|
46
|
+
outline: 'none'
|
47
|
+
};
|
29
48
|
var _default = {
|
30
|
-
treeRow: treeRow
|
49
|
+
treeRow: treeRow,
|
50
|
+
wrapper: wrapper
|
31
51
|
};
|
32
52
|
exports["default"] = _default;
|
@@ -4,9 +4,13 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
|
|
4
4
|
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
|
5
5
|
var _react = _interopRequireDefault(require("react"));
|
6
6
|
var _reactStately = require("react-stately");
|
7
|
+
var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
|
8
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
7
9
|
var _index = require("../../index");
|
8
10
|
var _testWrapper = require("../../utils/testUtils/testWrapper");
|
9
11
|
var _TreeView = require("./TreeView");
|
12
|
+
var _TreeViewKeyboardDelegate = require("./TreeViewKeyboardDelegate.test");
|
13
|
+
var _TreeViewSection = require("./TreeViewSection");
|
10
14
|
var _ = _interopRequireDefault(require("."));
|
11
15
|
var _react2 = require("@emotion/react");
|
12
16
|
var testId = 'test-TreeView';
|
@@ -43,9 +47,12 @@ var data = [{
|
|
43
47
|
}, {
|
44
48
|
title: 'Single Item'
|
45
49
|
}];
|
50
|
+
var singleData = [{
|
51
|
+
title: 'Single Item'
|
52
|
+
}];
|
46
53
|
var TreeViewComponent = function TreeViewComponent(props) {
|
47
54
|
var tree = (0, _reactStately.useTreeData)({
|
48
|
-
initialItems: data,
|
55
|
+
initialItems: props.data,
|
49
56
|
getKey: function getKey(item) {
|
50
57
|
return item.title;
|
51
58
|
},
|
@@ -65,6 +72,9 @@ var TreeViewComponent = function TreeViewComponent(props) {
|
|
65
72
|
});
|
66
73
|
});
|
67
74
|
};
|
75
|
+
TreeViewComponent.propTypes = {
|
76
|
+
data: _propTypes["default"].arrayOf(_propTypes["default"].shape({}))
|
77
|
+
};
|
68
78
|
var offsetWidth;
|
69
79
|
var offsetHeight;
|
70
80
|
var scrollHeight;
|
@@ -98,16 +108,20 @@ test('TreeView component does load', function () {
|
|
98
108
|
expect(element).toBeInTheDocument();
|
99
109
|
});
|
100
110
|
test('Can select an Item using the mouse', function () {
|
101
|
-
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent,
|
111
|
+
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
|
112
|
+
data: data
|
113
|
+
}));
|
102
114
|
var element = _testWrapper.screen.queryByRole('treegrid');
|
103
115
|
expect(element).toBeInTheDocument();
|
104
116
|
var peopleElement = _testWrapper.screen.queryByText('Single Item');
|
105
117
|
expect(peopleElement).not.toHaveClass('is-selected');
|
106
|
-
|
118
|
+
_userEvent["default"].click(peopleElement);
|
107
119
|
expect(peopleElement).toHaveClass('is-selected');
|
108
120
|
});
|
109
121
|
test('Renders both Sections and Items', function () {
|
110
|
-
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent,
|
122
|
+
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
|
123
|
+
data: data
|
124
|
+
}));
|
111
125
|
var peopleElement = _testWrapper.screen.getByText('Single Item');
|
112
126
|
expect(peopleElement).toBeInTheDocument();
|
113
127
|
var plantElement = _testWrapper.screen.getByText('Other');
|
@@ -116,7 +130,9 @@ test('Renders both Sections and Items', function () {
|
|
116
130
|
expect(allListItems).toHaveLength(3);
|
117
131
|
});
|
118
132
|
test('Can expand an Item using the mouse', function () {
|
119
|
-
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent,
|
133
|
+
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
|
134
|
+
data: data
|
135
|
+
}));
|
120
136
|
|
121
137
|
// The children of collapsed sections will not
|
122
138
|
// be rendered by default.
|
@@ -125,47 +141,91 @@ test('Can expand an Item using the mouse', function () {
|
|
125
141
|
// Clicking the dropdown icon, renders the children
|
126
142
|
// of the collapsed section.
|
127
143
|
var buttons = _testWrapper.screen.queryAllByRole('button');
|
128
|
-
|
144
|
+
_userEvent["default"].click(buttons[0]);
|
129
145
|
expect(_testWrapper.screen.queryByText(data[0].items[0].title)).toBeInTheDocument();
|
130
146
|
});
|
131
147
|
test('onExpandedChange change prop calls when used', function () {
|
132
148
|
var onPress = jest.fn();
|
133
149
|
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
|
150
|
+
data: data,
|
134
151
|
onExpandedChange: onPress
|
135
152
|
}));
|
136
153
|
expect(onPress).not.toHaveBeenCalled();
|
137
154
|
var buttons = _testWrapper.screen.queryAllByRole('button');
|
138
|
-
|
155
|
+
_userEvent["default"].click(buttons[0]);
|
139
156
|
expect(onPress).toHaveBeenCalled();
|
140
157
|
});
|
141
158
|
test('disabledKeys prop disables items in the tree -- rendering them unclickable', function () {
|
142
159
|
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
|
160
|
+
data: data,
|
143
161
|
disabledKeys: ['Single Item']
|
144
162
|
}));
|
145
163
|
var listItems = _testWrapper.screen.queryAllByRole('treeitem');
|
146
164
|
var thisItem = listItems[2];
|
147
165
|
expect(thisItem).not.toHaveClass('is-selected');
|
148
166
|
expect(thisItem).toHaveAttribute('aria-disabled', 'true');
|
149
|
-
|
150
|
-
_testWrapper.fireEvent.mouseUp(thisItem);
|
167
|
+
_userEvent["default"].click(thisItem);
|
151
168
|
expect(thisItem).not.toHaveClass('is-selected');
|
152
169
|
expect(thisItem).toHaveAttribute('aria-selected', 'false');
|
153
170
|
});
|
154
171
|
test('displays correct aria attributes', function () {
|
155
|
-
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent,
|
172
|
+
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
|
173
|
+
data: data
|
174
|
+
}));
|
156
175
|
var listItems = _testWrapper.screen.getAllByRole('treeitem');
|
157
176
|
var lastTreeItem = listItems[2];
|
158
177
|
expect(lastTreeItem).toHaveAttribute('aria-level', '1');
|
159
178
|
expect(lastTreeItem).toHaveAttribute('aria-posinset', '3');
|
160
179
|
expect(lastTreeItem).toHaveAttribute('aria-setsize', '3');
|
161
180
|
var buttons = _testWrapper.screen.queryAllByRole('button');
|
162
|
-
|
181
|
+
_userEvent["default"].click(buttons[1]);
|
163
182
|
var expandedItems = _testWrapper.screen.getAllByRole('treeitem');
|
164
183
|
var nestedItem = expandedItems[2];
|
165
184
|
expect(nestedItem).toHaveAttribute('aria-level', '2');
|
166
185
|
expect(nestedItem).toHaveAttribute('aria-posinset', '1');
|
167
186
|
expect(nestedItem).toHaveAttribute('aria-setsize', '1');
|
168
187
|
});
|
188
|
+
test('onKeyDown calls passed in prop call back function', function () {
|
189
|
+
var callback = jest.fn();
|
190
|
+
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
|
191
|
+
data: data,
|
192
|
+
onKeyDown: callback
|
193
|
+
}));
|
194
|
+
var listItems = _testWrapper.screen.queryAllByRole('treeitem');
|
195
|
+
var thisItem = listItems[0];
|
196
|
+
_userEvent["default"].type(thisItem, '{arrowleft}');
|
197
|
+
expect(callback).toHaveBeenCalled();
|
198
|
+
});
|
199
|
+
test('onKeyDown calls passed in prop call back function', function () {
|
200
|
+
var callback = jest.fn();
|
201
|
+
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
|
202
|
+
data: data,
|
203
|
+
onKeyDown: callback
|
204
|
+
}));
|
205
|
+
var listItems = _testWrapper.screen.queryAllByRole('treeitem');
|
206
|
+
var thisItem = listItems[2];
|
207
|
+
_userEvent["default"].type(thisItem, '{arrowleft}');
|
208
|
+
expect(callback).toHaveBeenCalled();
|
209
|
+
});
|
210
|
+
test('onKeyDown does not call passed in prop call back function', function () {
|
211
|
+
var callback = jest.fn();
|
212
|
+
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
|
213
|
+
data: data
|
214
|
+
}));
|
215
|
+
var listItems = _testWrapper.screen.queryAllByRole('treeitem');
|
216
|
+
var thisItem = listItems[2];
|
217
|
+
_userEvent["default"].type(thisItem, '{arrowleft}');
|
218
|
+
expect(callback).not.toHaveBeenCalled();
|
219
|
+
});
|
220
|
+
test('items still render if there is only one provided', function () {
|
221
|
+
var callback = jest.fn();
|
222
|
+
(0, _testWrapper.render)((0, _react2.jsx)(TreeViewComponent, {
|
223
|
+
data: singleData,
|
224
|
+
onKeyDown: callback
|
225
|
+
}));
|
226
|
+
var listItem = _testWrapper.screen.queryByText('Single Item');
|
227
|
+
expect(listItem).toBeInTheDocument();
|
228
|
+
});
|
169
229
|
var firstJSX = (0, _react2.jsx)("p", null, "first");
|
170
230
|
var secondJSX = (0, _react2.jsx)("p", null, "second");
|
171
231
|
test('Section or Item Render renders first item if condition is true', function () {
|
@@ -179,4 +239,24 @@ test('Section or Item Render renders second item if condition is false', functio
|
|
179
239
|
var thisItem = _testWrapper.screen.getByText('second');
|
180
240
|
expect(thisItem).toBeInTheDocument();
|
181
241
|
expect(_testWrapper.screen.queryByText('first')).not.toBeInTheDocument();
|
242
|
+
});
|
243
|
+
test('Handler function removes ref from array', function () {
|
244
|
+
var newArray = (0, _TreeViewSection.removeRefFromArrayHelper)(_TreeViewKeyboardDelegate.refArray, 'test');
|
245
|
+
expect(newArray).toHaveLength(2);
|
246
|
+
});
|
247
|
+
test('Handler function does not remove ref from array', function () {
|
248
|
+
var newArray = (0, _TreeViewSection.removeRefFromArrayHelper)(_TreeViewKeyboardDelegate.refArray, 'anothertest');
|
249
|
+
expect(newArray).toHaveLength(3);
|
250
|
+
});
|
251
|
+
test('Handler function does add ref to array', function () {
|
252
|
+
var newArray = (0, _TreeViewSection.addRefToArrayHelper)(_TreeViewKeyboardDelegate.refArray, 'yetanothertest', {
|
253
|
+
current: 'currentlystilltesting'
|
254
|
+
});
|
255
|
+
expect(newArray).toHaveLength(4);
|
256
|
+
});
|
257
|
+
test('Handler function does not add ref to array', function () {
|
258
|
+
var newArray = (0, _TreeViewSection.addRefToArrayHelper)(_TreeViewKeyboardDelegate.refArray, 'test', {
|
259
|
+
current: 'currentlystilltesting'
|
260
|
+
});
|
261
|
+
expect(newArray).toHaveLength(3);
|
182
262
|
});
|
@@ -8,21 +8,68 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
|
|
8
8
|
_Object$defineProperty(exports, "__esModule", {
|
9
9
|
value: true
|
10
10
|
});
|
11
|
-
exports["default"] = void 0;
|
11
|
+
exports.onKeyDownItem = exports["default"] = void 0;
|
12
12
|
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
|
13
13
|
var _react = _interopRequireWildcard(require("react"));
|
14
14
|
var _FileIcon = _interopRequireDefault(require("@pingux/mdi-react/FileIcon"));
|
15
|
+
var _focus = require("@react-aria/focus");
|
15
16
|
var _listbox = require("@react-aria/listbox");
|
17
|
+
var _utils = require("@react-aria/utils");
|
16
18
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
17
19
|
var _TreeViewContext = require("../../context/TreeViewContext");
|
20
|
+
var _hooks = require("../../hooks");
|
18
21
|
var _index = require("../../index");
|
22
|
+
var _TreeViewKeyboardDelegate = require("./TreeViewKeyboardDelegate");
|
19
23
|
var _TreeViewRow = _interopRequireDefault(require("./TreeViewRow"));
|
24
|
+
var _TreeViewSection = require("./TreeViewSection");
|
20
25
|
var _react2 = require("@emotion/react");
|
21
26
|
function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
22
27
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
28
|
+
var onKeyDownItem = function onKeyDownItem(e, state, key, tree, isSelected, isExpanded, focusManager, flatKeyArray, refArray, pageLength) {
|
29
|
+
switch (e.which) {
|
30
|
+
case 32:
|
31
|
+
_TreeViewKeyboardDelegate.itemPressHandlers.onSpacePress(e, tree, key, isSelected);
|
32
|
+
break;
|
33
|
+
case 38:
|
34
|
+
_TreeViewKeyboardDelegate.itemPressHandlers.onUpPress(e, key, refArray, flatKeyArray);
|
35
|
+
e.preventDefault();
|
36
|
+
e.stopPropagation();
|
37
|
+
break;
|
38
|
+
case 40:
|
39
|
+
_TreeViewKeyboardDelegate.itemPressHandlers.onDownPress(e, key, refArray, flatKeyArray);
|
40
|
+
e.preventDefault();
|
41
|
+
e.stopPropagation();
|
42
|
+
break;
|
43
|
+
case 37:
|
44
|
+
case 39:
|
45
|
+
_TreeViewKeyboardDelegate.itemPressHandlers.onRightLeftItemPress(e);
|
46
|
+
break;
|
47
|
+
case 33:
|
48
|
+
_TreeViewKeyboardDelegate.itemPressHandlers.onPageUpPress(e, key, flatKeyArray, refArray, pageLength);
|
49
|
+
break;
|
50
|
+
case 34:
|
51
|
+
_TreeViewKeyboardDelegate.itemPressHandlers.onPageDownPress(e, key, flatKeyArray, refArray, pageLength);
|
52
|
+
break;
|
53
|
+
case 36:
|
54
|
+
_TreeViewKeyboardDelegate.itemPressHandlers.onHomePress(key, flatKeyArray, refArray);
|
55
|
+
e.preventDefault();
|
56
|
+
e.stopPropagation();
|
57
|
+
break;
|
58
|
+
case 35:
|
59
|
+
_TreeViewKeyboardDelegate.itemPressHandlers.onEndPress(key, flatKeyArray, refArray);
|
60
|
+
e.preventDefault();
|
61
|
+
e.stopPropagation();
|
62
|
+
break;
|
63
|
+
default:
|
64
|
+
break;
|
65
|
+
}
|
66
|
+
};
|
67
|
+
exports.onKeyDownItem = onKeyDownItem;
|
23
68
|
var TreeViewItem = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
24
69
|
var item = props.item,
|
25
70
|
title = props.title,
|
71
|
+
focusManager = props.focusManager,
|
72
|
+
onKeyDown = props.onKeyDown,
|
26
73
|
level = props.level,
|
27
74
|
position = props.position,
|
28
75
|
setSize = props.setSize;
|
@@ -32,8 +79,16 @@ var TreeViewItem = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
32
79
|
(0, _react.useImperativeHandle)(ref, function () {
|
33
80
|
return treeItemRef.current;
|
34
81
|
});
|
82
|
+
|
83
|
+
/* istanbul ignore next */
|
35
84
|
var _useTreeViewContext = (0, _TreeViewContext.useTreeViewContext)(),
|
36
|
-
state = _useTreeViewContext.state
|
85
|
+
state = _useTreeViewContext.state,
|
86
|
+
tree = _useTreeViewContext.tree,
|
87
|
+
refArray = _useTreeViewContext.refArray,
|
88
|
+
setRefs = _useTreeViewContext.setRefs,
|
89
|
+
flatKeyArray = _useTreeViewContext.flatKeyArray,
|
90
|
+
pageLength = _useTreeViewContext.pageLength,
|
91
|
+
setLastFocusedItem = _useTreeViewContext.setLastFocusedItem;
|
37
92
|
var _useOption = (0, _listbox.useOption)({
|
38
93
|
key: key
|
39
94
|
}, state, treeItemRef),
|
@@ -41,24 +96,65 @@ var TreeViewItem = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
41
96
|
isSelected = _useOption.isSelected,
|
42
97
|
isDisabled = _useOption.isDisabled;
|
43
98
|
var isExpanded = state.expandedKeys.has(key);
|
99
|
+
var onKeyDownFunction = function onKeyDownFunction(e) {
|
100
|
+
/* istanbul ignore next */
|
101
|
+
onKeyDownItem(e, state, key, tree, isSelected, isExpanded, focusManager, flatKeyArray, refArray, pageLength);
|
102
|
+
if (onKeyDown) {
|
103
|
+
onKeyDown(e, key);
|
104
|
+
}
|
105
|
+
};
|
106
|
+
|
107
|
+
// ignoring from tests, but this is actually being unit tested
|
108
|
+
/* istanbul ignore next */
|
109
|
+
var removeRefFromArray = function removeRefFromArray() {
|
110
|
+
setRefs(function (prev) {
|
111
|
+
return (0, _TreeViewSection.removeRefFromArrayHelper)(prev, key);
|
112
|
+
});
|
113
|
+
};
|
114
|
+
var addRefToArray = function addRefToArray() {
|
115
|
+
setRefs(function (prev) {
|
116
|
+
return (0, _TreeViewSection.addRefToArrayHelper)(prev, key, treeItemRef);
|
117
|
+
});
|
118
|
+
};
|
119
|
+
|
120
|
+
// adds and removes refs on mount and dismount
|
121
|
+
/* istanbul ignore next */
|
122
|
+
(0, _react.useEffect)(function () {
|
123
|
+
// this runs on mount
|
124
|
+
addRefToArray();
|
125
|
+
return function () {
|
126
|
+
// this runs on cleanup
|
127
|
+
removeRefFromArray(key, refArray);
|
128
|
+
};
|
129
|
+
}, []);
|
130
|
+
var _useFocusRing = (0, _focus.useFocusRing)(),
|
131
|
+
isFocusVisible = _useFocusRing.isFocusVisible,
|
132
|
+
focusProps = _useFocusRing.focusProps;
|
133
|
+
var mergedProps = (0, _utils.mergeProps)(focusProps, optionProps, {
|
134
|
+
onFocus: function onFocus() {
|
135
|
+
return setLastFocusedItem(key);
|
136
|
+
}
|
137
|
+
});
|
138
|
+
var _useStatusClasses = (0, _hooks.useStatusClasses)('', {
|
139
|
+
isFocused: isFocusVisible
|
140
|
+
}),
|
141
|
+
classNames = _useStatusClasses.classNames;
|
44
142
|
return (0, _react2.jsx)(_index.Box, (0, _extends2["default"])({
|
45
143
|
as: "li",
|
46
144
|
isRow: true,
|
47
145
|
ref: treeItemRef,
|
48
|
-
"aria-disabled": isDisabled
|
146
|
+
"aria-disabled": isDisabled
|
147
|
+
}, mergedProps, {
|
148
|
+
role: "treeitem",
|
149
|
+
variant: "treeView.wrapper",
|
150
|
+
className: classNames,
|
151
|
+
"aria-selected": isSelected,
|
49
152
|
"aria-level": level,
|
50
153
|
"aria-posinset": position + 1,
|
51
|
-
"aria-setsize": setSize
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
width: '100%',
|
56
|
-
ml: '36px',
|
57
|
-
':not(:last-child)': {
|
58
|
-
pb: 'sm'
|
59
|
-
}
|
60
|
-
},
|
61
|
-
"aria-selected": isSelected
|
154
|
+
"aria-setsize": setSize,
|
155
|
+
onKeyDown: function onKeyDown(e) {
|
156
|
+
return onKeyDownFunction(e);
|
157
|
+
}
|
62
158
|
}), (0, _react2.jsx)(_TreeViewRow["default"], {
|
63
159
|
item: item,
|
64
160
|
title: title,
|
@@ -72,8 +168,10 @@ TreeViewItem.propTypes = {
|
|
72
168
|
item: _propTypes["default"].shape({
|
73
169
|
key: _propTypes["default"].string
|
74
170
|
}),
|
171
|
+
focusManager: _propTypes["default"].shape({}),
|
75
172
|
name: _propTypes["default"].string,
|
76
173
|
title: _propTypes["default"].string,
|
174
|
+
onKeyDown: _propTypes["default"].func,
|
77
175
|
level: _propTypes["default"].number,
|
78
176
|
position: _propTypes["default"].number,
|
79
177
|
setSize: _propTypes["default"].number
|