@mui/x-tree-view 7.0.0 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +71 -0
- package/RichTreeView/RichTreeView.js +4 -4
- package/SimpleTreeView/SimpleTreeView.plugins.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/TreeItem/TreeItem.js +4 -4
- package/TreeItem/treeItemClasses.d.ts +1 -1
- package/TreeItem/useTreeItemState.js +9 -9
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +4 -4
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +8 -8
- package/hooks/useTreeViewApiRef.d.ts +1 -1
- package/index.js +1 -1
- package/internals/TreeViewProvider/DescendantProvider.d.ts +1 -1
- package/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/internals/index.d.ts +2 -2
- package/internals/plugins/defaultPlugins.d.ts +3 -3
- package/internals/plugins/defaultPlugins.js +2 -2
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +9 -9
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +5 -5
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +35 -33
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +6 -6
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +6 -6
- package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/index.d.ts +2 -0
- package/internals/plugins/useTreeViewItems/index.js +1 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.d.ts +3 -0
- package/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +42 -32
- package/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.d.ts → useTreeViewItems/useTreeViewItems.types.d.ts} +32 -21
- package/internals/plugins/useTreeViewJSXItems/index.d.ts +2 -0
- package/internals/plugins/useTreeViewJSXItems/index.js +1 -0
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.d.ts +3 -0
- package/{modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +26 -25
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.types.d.ts +18 -0
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +40 -44
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -2
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +6 -6
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +7 -7
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/internals/useTreeView/useTreeView.utils.d.ts +5 -5
- package/internals/useTreeView/useTreeView.utils.js +15 -15
- package/modern/RichTreeView/RichTreeView.js +4 -4
- package/modern/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/modern/TreeItem/TreeItem.js +4 -4
- package/modern/TreeItem/useTreeItemState.js +9 -9
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +8 -8
- package/modern/index.js +1 -1
- package/modern/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/modern/internals/plugins/defaultPlugins.js +2 -2
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +9 -9
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +35 -33
- package/modern/internals/plugins/useTreeViewItems/index.js +1 -0
- package/modern/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +42 -32
- package/modern/internals/plugins/useTreeViewJSXItems/index.js +1 -0
- package/{internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +26 -25
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +40 -44
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/modern/internals/useTreeView/useTreeView.utils.js +15 -15
- package/node/RichTreeView/RichTreeView.js +4 -4
- package/node/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/node/TreeItem/TreeItem.js +4 -4
- package/node/TreeItem/useTreeItemState.js +9 -9
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +8 -8
- package/node/index.js +1 -1
- package/node/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/node/internals/plugins/defaultPlugins.js +2 -2
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +9 -9
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +35 -33
- package/node/internals/plugins/useTreeViewItems/index.js +12 -0
- package/node/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +44 -34
- package/node/internals/plugins/useTreeViewJSXItems/index.js +12 -0
- package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.js → useTreeViewJSXItems/useTreeViewJSXItems.js} +28 -27
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +39 -43
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +33 -33
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/node/internals/useTreeView/useTreeView.utils.js +20 -20
- package/package.json +1 -1
- package/useTreeItem2/useTreeItem2.d.ts +1 -1
- package/internals/plugins/useTreeViewJSXNodes/index.d.ts +0 -2
- package/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.d.ts +0 -3
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +0 -18
- package/internals/plugins/useTreeViewNodes/index.d.ts +0 -2
- package/internals/plugins/useTreeViewNodes/index.js +0 -1
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.d.ts +0 -3
- package/modern/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
- package/modern/internals/plugins/useTreeViewNodes/index.js +0 -1
- package/node/internals/plugins/useTreeViewJSXNodes/index.js +0 -12
- package/node/internals/plugins/useTreeViewNodes/index.js +0 -12
- /package/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
- /package/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
- /package/modern/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
- /package/modern/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
- /package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
- /package/node/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
|
@@ -4,14 +4,14 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.
|
|
7
|
+
exports.useTreeViewItems = void 0;
|
|
8
8
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
9
|
var React = _interopRequireWildcard(require("react"));
|
|
10
10
|
var _useTreeView = require("../../useTreeView/useTreeView.utils");
|
|
11
11
|
var _publishTreeViewEvent = require("../../utils/publishTreeViewEvent");
|
|
12
12
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
13
13
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
14
|
-
const
|
|
14
|
+
const updateItemsState = ({
|
|
15
15
|
items,
|
|
16
16
|
isItemDisabled,
|
|
17
17
|
getItemLabel,
|
|
@@ -53,86 +53,96 @@ const updateNodesState = ({
|
|
|
53
53
|
itemMap
|
|
54
54
|
};
|
|
55
55
|
};
|
|
56
|
-
const
|
|
56
|
+
const useTreeViewItems = ({
|
|
57
57
|
instance,
|
|
58
58
|
publicAPI,
|
|
59
59
|
params,
|
|
60
60
|
state,
|
|
61
61
|
setState
|
|
62
62
|
}) => {
|
|
63
|
-
const getNode = React.useCallback(itemId => state.
|
|
64
|
-
const getItem = React.useCallback(itemId => state.
|
|
65
|
-
const
|
|
63
|
+
const getNode = React.useCallback(itemId => state.items.nodeMap[itemId], [state.items.nodeMap]);
|
|
64
|
+
const getItem = React.useCallback(itemId => state.items.itemMap[itemId], [state.items.itemMap]);
|
|
65
|
+
const isItemDisabled = React.useCallback(itemId => {
|
|
66
66
|
if (itemId == null) {
|
|
67
67
|
return false;
|
|
68
68
|
}
|
|
69
|
-
let
|
|
69
|
+
let node = instance.getNode(itemId);
|
|
70
70
|
|
|
71
|
-
// This can be called before the item has been added to the
|
|
72
|
-
if (!
|
|
71
|
+
// This can be called before the item has been added to the item map.
|
|
72
|
+
if (!node) {
|
|
73
73
|
return false;
|
|
74
74
|
}
|
|
75
|
-
if (
|
|
75
|
+
if (node.disabled) {
|
|
76
76
|
return true;
|
|
77
77
|
}
|
|
78
|
-
while (
|
|
79
|
-
|
|
80
|
-
if (
|
|
78
|
+
while (node.parentId != null) {
|
|
79
|
+
node = instance.getNode(node.parentId);
|
|
80
|
+
if (node.disabled) {
|
|
81
81
|
return true;
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
return false;
|
|
85
85
|
}, [instance]);
|
|
86
|
-
const getChildrenIds = React.useCallback(itemId => Object.values(state.
|
|
86
|
+
const getChildrenIds = React.useCallback(itemId => Object.values(state.items.nodeMap).filter(item => item.parentId === itemId).sort((a, b) => a.index - b.index).map(child => child.id), [state.items.nodeMap]);
|
|
87
87
|
const getNavigableChildrenIds = itemId => {
|
|
88
88
|
let childrenIds = instance.getChildrenIds(itemId);
|
|
89
89
|
if (!params.disabledItemsFocusable) {
|
|
90
|
-
childrenIds = childrenIds.filter(item => !instance.
|
|
90
|
+
childrenIds = childrenIds.filter(item => !instance.isItemDisabled(item));
|
|
91
91
|
}
|
|
92
92
|
return childrenIds;
|
|
93
93
|
};
|
|
94
|
+
const areItemUpdatesPreventedRef = React.useRef(false);
|
|
95
|
+
const preventItemUpdates = React.useCallback(() => {
|
|
96
|
+
areItemUpdatesPreventedRef.current = true;
|
|
97
|
+
}, []);
|
|
98
|
+
const areItemUpdatesPrevented = React.useCallback(() => areItemUpdatesPreventedRef.current, []);
|
|
94
99
|
React.useEffect(() => {
|
|
100
|
+
if (instance.areItemUpdatesPrevented()) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
95
103
|
setState(prevState => {
|
|
96
|
-
const newState =
|
|
104
|
+
const newState = updateItemsState({
|
|
97
105
|
items: params.items,
|
|
98
106
|
isItemDisabled: params.isItemDisabled,
|
|
99
107
|
getItemId: params.getItemId,
|
|
100
108
|
getItemLabel: params.getItemLabel
|
|
101
109
|
});
|
|
102
|
-
Object.values(prevState.
|
|
103
|
-
if (!newState.nodeMap[
|
|
104
|
-
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, '
|
|
105
|
-
id:
|
|
110
|
+
Object.values(prevState.items.nodeMap).forEach(item => {
|
|
111
|
+
if (!newState.nodeMap[item.id]) {
|
|
112
|
+
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeItem', {
|
|
113
|
+
id: item.id
|
|
106
114
|
});
|
|
107
115
|
}
|
|
108
116
|
});
|
|
109
117
|
return (0, _extends2.default)({}, prevState, {
|
|
110
|
-
|
|
118
|
+
items: newState
|
|
111
119
|
});
|
|
112
120
|
});
|
|
113
121
|
}, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
|
|
114
|
-
const
|
|
122
|
+
const getItemsToRender = () => {
|
|
115
123
|
const getPropsFromItemId = ({
|
|
116
124
|
id,
|
|
117
125
|
children
|
|
118
126
|
}) => {
|
|
119
|
-
const
|
|
127
|
+
const item = state.items.nodeMap[id];
|
|
120
128
|
return {
|
|
121
|
-
label:
|
|
122
|
-
itemId:
|
|
123
|
-
id:
|
|
129
|
+
label: item.label,
|
|
130
|
+
itemId: item.id,
|
|
131
|
+
id: item.idAttribute,
|
|
124
132
|
children: children?.map(getPropsFromItemId)
|
|
125
133
|
};
|
|
126
134
|
};
|
|
127
|
-
return state.
|
|
135
|
+
return state.items.nodeTree.map(getPropsFromItemId);
|
|
128
136
|
};
|
|
129
137
|
(0, _useTreeView.populateInstance)(instance, {
|
|
130
138
|
getNode,
|
|
131
139
|
getItem,
|
|
132
|
-
|
|
140
|
+
getItemsToRender,
|
|
133
141
|
getChildrenIds,
|
|
134
142
|
getNavigableChildrenIds,
|
|
135
|
-
|
|
143
|
+
isItemDisabled,
|
|
144
|
+
preventItemUpdates,
|
|
145
|
+
areItemUpdatesPrevented
|
|
136
146
|
});
|
|
137
147
|
(0, _useTreeView.populatePublicAPI)(publicAPI, {
|
|
138
148
|
getItem
|
|
@@ -143,19 +153,19 @@ const useTreeViewNodes = ({
|
|
|
143
153
|
}
|
|
144
154
|
};
|
|
145
155
|
};
|
|
146
|
-
exports.
|
|
147
|
-
|
|
148
|
-
|
|
156
|
+
exports.useTreeViewItems = useTreeViewItems;
|
|
157
|
+
useTreeViewItems.getInitialState = params => ({
|
|
158
|
+
items: updateItemsState({
|
|
149
159
|
items: params.items,
|
|
150
160
|
isItemDisabled: params.isItemDisabled,
|
|
151
161
|
getItemId: params.getItemId,
|
|
152
162
|
getItemLabel: params.getItemLabel
|
|
153
163
|
})
|
|
154
164
|
});
|
|
155
|
-
|
|
165
|
+
useTreeViewItems.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
|
|
156
166
|
disabledItemsFocusable: params.disabledItemsFocusable ?? false
|
|
157
167
|
});
|
|
158
|
-
|
|
168
|
+
useTreeViewItems.params = {
|
|
159
169
|
disabledItemsFocusable: true,
|
|
160
170
|
items: true,
|
|
161
171
|
isItemDisabled: true,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "useTreeViewJSXItems", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _useTreeViewJSXItems.useTreeViewJSXItems;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _useTreeViewJSXItems = require("./useTreeViewJSXItems");
|
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.
|
|
7
|
+
exports.useTreeViewJSXItems = void 0;
|
|
8
8
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
9
|
var React = _interopRequireWildcard(require("react"));
|
|
10
10
|
var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
|
|
@@ -16,45 +16,46 @@ var _DescendantProvider = require("../../TreeViewProvider/DescendantProvider");
|
|
|
16
16
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
17
17
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
18
18
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
19
|
-
const
|
|
19
|
+
const useTreeViewJSXItems = ({
|
|
20
20
|
instance,
|
|
21
21
|
setState
|
|
22
22
|
}) => {
|
|
23
|
-
|
|
23
|
+
instance.preventItemUpdates();
|
|
24
|
+
const insertJSXItem = (0, _useEventCallback.default)(item => {
|
|
24
25
|
setState(prevState => {
|
|
25
|
-
if (prevState.
|
|
26
|
-
throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Tow items were provided with the same id in the \`items\` prop: "${
|
|
26
|
+
if (prevState.items.nodeMap[item.id] != null) {
|
|
27
|
+
throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Tow items were provided with the same id in the \`items\` prop: "${item.id}"`].join('\n'));
|
|
27
28
|
}
|
|
28
29
|
return (0, _extends2.default)({}, prevState, {
|
|
29
|
-
|
|
30
|
-
nodeMap: (0, _extends2.default)({}, prevState.
|
|
31
|
-
[
|
|
30
|
+
items: (0, _extends2.default)({}, prevState.items, {
|
|
31
|
+
nodeMap: (0, _extends2.default)({}, prevState.items.nodeMap, {
|
|
32
|
+
[item.id]: item
|
|
32
33
|
}),
|
|
33
34
|
// For `SimpleTreeView`, we don't have a proper `item` object, so we create a very basic one.
|
|
34
|
-
itemMap: (0, _extends2.default)({}, prevState.
|
|
35
|
-
[
|
|
36
|
-
id:
|
|
37
|
-
label:
|
|
35
|
+
itemMap: (0, _extends2.default)({}, prevState.items.itemMap, {
|
|
36
|
+
[item.id]: {
|
|
37
|
+
id: item.id,
|
|
38
|
+
label: item.label
|
|
38
39
|
}
|
|
39
40
|
})
|
|
40
41
|
})
|
|
41
42
|
});
|
|
42
43
|
});
|
|
43
44
|
});
|
|
44
|
-
const
|
|
45
|
+
const removeJSXItem = (0, _useEventCallback.default)(itemId => {
|
|
45
46
|
setState(prevState => {
|
|
46
|
-
const newNodeMap = (0, _extends2.default)({}, prevState.
|
|
47
|
-
const newItemMap = (0, _extends2.default)({}, prevState.
|
|
47
|
+
const newNodeMap = (0, _extends2.default)({}, prevState.items.nodeMap);
|
|
48
|
+
const newItemMap = (0, _extends2.default)({}, prevState.items.itemMap);
|
|
48
49
|
delete newNodeMap[itemId];
|
|
49
50
|
delete newItemMap[itemId];
|
|
50
51
|
return (0, _extends2.default)({}, prevState, {
|
|
51
|
-
|
|
52
|
+
items: (0, _extends2.default)({}, prevState.items, {
|
|
52
53
|
nodeMap: newNodeMap,
|
|
53
54
|
itemMap: newItemMap
|
|
54
55
|
})
|
|
55
56
|
});
|
|
56
57
|
});
|
|
57
|
-
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, '
|
|
58
|
+
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeItem', {
|
|
58
59
|
id: itemId
|
|
59
60
|
});
|
|
60
61
|
});
|
|
@@ -72,13 +73,13 @@ const useTreeViewJSXNodes = ({
|
|
|
72
73
|
};
|
|
73
74
|
});
|
|
74
75
|
(0, _useTreeView.populateInstance)(instance, {
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
insertJSXItem,
|
|
77
|
+
removeJSXItem,
|
|
77
78
|
mapFirstCharFromJSX
|
|
78
79
|
});
|
|
79
80
|
};
|
|
80
|
-
exports.
|
|
81
|
-
const
|
|
81
|
+
exports.useTreeViewJSXItems = useTreeViewJSXItems;
|
|
82
|
+
const useTreeViewJSXItemsItemPlugin = ({
|
|
82
83
|
props,
|
|
83
84
|
rootRef,
|
|
84
85
|
contentRef
|
|
@@ -113,9 +114,9 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
113
114
|
parentId
|
|
114
115
|
} = (0, _DescendantProvider.useDescendant)(descendant);
|
|
115
116
|
React.useEffect(() => {
|
|
116
|
-
// On the first render a
|
|
117
|
+
// On the first render a item's index will be -1. We want to wait for the real index.
|
|
117
118
|
if (index !== -1) {
|
|
118
|
-
instance.
|
|
119
|
+
instance.insertJSXItem({
|
|
119
120
|
id: itemId,
|
|
120
121
|
idAttribute: id,
|
|
121
122
|
index,
|
|
@@ -123,7 +124,7 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
123
124
|
expandable,
|
|
124
125
|
disabled
|
|
125
126
|
});
|
|
126
|
-
return () => instance.
|
|
127
|
+
return () => instance.removeJSXItem(itemId);
|
|
127
128
|
}
|
|
128
129
|
return undefined;
|
|
129
130
|
}, [instance, parentId, index, itemId, expandable, disabled, id]);
|
|
@@ -138,12 +139,12 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
138
139
|
rootRef: handleRootRef
|
|
139
140
|
};
|
|
140
141
|
};
|
|
141
|
-
|
|
142
|
-
|
|
142
|
+
useTreeViewJSXItems.itemPlugin = useTreeViewJSXItemsItemPlugin;
|
|
143
|
+
useTreeViewJSXItems.wrapItem = ({
|
|
143
144
|
children,
|
|
144
145
|
itemId
|
|
145
146
|
}) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_DescendantProvider.DescendantProvider, {
|
|
146
147
|
id: itemId,
|
|
147
148
|
children: children
|
|
148
149
|
});
|
|
149
|
-
|
|
150
|
+
useTreeViewJSXItems.params = {};
|
package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js
CHANGED
|
@@ -24,30 +24,26 @@ function findNextFirstChar(firstChars, startIndex, char) {
|
|
|
24
24
|
}
|
|
25
25
|
const useTreeViewKeyboardNavigation = ({
|
|
26
26
|
instance,
|
|
27
|
-
params
|
|
27
|
+
params,
|
|
28
|
+
state
|
|
28
29
|
}) => {
|
|
29
30
|
const theme = (0, _styles.useTheme)();
|
|
30
31
|
const isRTL = theme.direction === 'rtl';
|
|
31
32
|
const firstCharMap = React.useRef({});
|
|
32
|
-
const hasFirstCharMapBeenUpdatedImperatively = React.useRef(false);
|
|
33
33
|
const updateFirstCharMap = (0, _useEventCallback.default)(callback => {
|
|
34
|
-
hasFirstCharMapBeenUpdatedImperatively.current = true;
|
|
35
34
|
firstCharMap.current = callback(firstCharMap.current);
|
|
36
35
|
});
|
|
37
36
|
React.useEffect(() => {
|
|
38
|
-
if (
|
|
37
|
+
if (instance.areItemUpdatesPrevented()) {
|
|
39
38
|
return;
|
|
40
39
|
}
|
|
41
40
|
const newFirstCharMap = {};
|
|
42
|
-
const processItem =
|
|
43
|
-
|
|
44
|
-
const itemId = getItemId ? getItemId(item) : item.id;
|
|
45
|
-
newFirstCharMap[itemId] = instance.getNode(itemId).label.substring(0, 1).toLowerCase();
|
|
46
|
-
item.children?.forEach(processItem);
|
|
41
|
+
const processItem = node => {
|
|
42
|
+
newFirstCharMap[node.id] = node.label.substring(0, 1).toLowerCase();
|
|
47
43
|
};
|
|
48
|
-
|
|
44
|
+
Object.values(state.items.nodeMap).forEach(processItem);
|
|
49
45
|
firstCharMap.current = newFirstCharMap;
|
|
50
|
-
}, [
|
|
46
|
+
}, [state.items.nodeMap, params.getItemId, instance]);
|
|
51
47
|
const getFirstMatchingItem = (itemId, firstChar) => {
|
|
52
48
|
let start;
|
|
53
49
|
let index;
|
|
@@ -57,8 +53,8 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
57
53
|
// This really only works since the ids are strings
|
|
58
54
|
Object.keys(firstCharMap.current).forEach(mapItemId => {
|
|
59
55
|
const map = instance.getNode(mapItemId);
|
|
60
|
-
const visible = map.parentId ? instance.
|
|
61
|
-
const shouldBeSkipped = params.disabledItemsFocusable ? false : instance.
|
|
56
|
+
const visible = map.parentId ? instance.isItemExpanded(map.parentId) : true;
|
|
57
|
+
const shouldBeSkipped = params.disabledItemsFocusable ? false : instance.isItemDisabled(mapItemId);
|
|
62
58
|
if (visible && !shouldBeSkipped) {
|
|
63
59
|
firstCharIds.push(mapItemId);
|
|
64
60
|
firstChars.push(firstCharMap.current[mapItemId]);
|
|
@@ -85,9 +81,9 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
85
81
|
}
|
|
86
82
|
return null;
|
|
87
83
|
};
|
|
88
|
-
const canToggleItemSelection = itemId => !params.disableSelection && !instance.
|
|
84
|
+
const canToggleItemSelection = itemId => !params.disableSelection && !instance.isItemDisabled(itemId);
|
|
89
85
|
const canToggleItemExpansion = itemId => {
|
|
90
|
-
return !instance.
|
|
86
|
+
return !instance.isItemDisabled(itemId) && instance.isItemExpandable(itemId);
|
|
91
87
|
};
|
|
92
88
|
|
|
93
89
|
// ARIA specification: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/#keyboardinteraction
|
|
@@ -103,7 +99,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
103
99
|
|
|
104
100
|
// eslint-disable-next-line default-case
|
|
105
101
|
switch (true) {
|
|
106
|
-
// Select the
|
|
102
|
+
// Select the item when pressing "Space"
|
|
107
103
|
case key === ' ' && canToggleItemSelection(itemId):
|
|
108
104
|
{
|
|
109
105
|
event.preventDefault();
|
|
@@ -112,26 +108,26 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
112
108
|
end: itemId
|
|
113
109
|
});
|
|
114
110
|
} else if (params.multiSelect) {
|
|
115
|
-
instance.
|
|
111
|
+
instance.selectItem(event, itemId, true);
|
|
116
112
|
} else {
|
|
117
|
-
instance.
|
|
113
|
+
instance.selectItem(event, itemId);
|
|
118
114
|
}
|
|
119
115
|
break;
|
|
120
116
|
}
|
|
121
117
|
|
|
122
|
-
// If the focused
|
|
123
|
-
// If the focused
|
|
118
|
+
// If the focused item has children, we expand it.
|
|
119
|
+
// If the focused item has no children, we select it.
|
|
124
120
|
case key === 'Enter':
|
|
125
121
|
{
|
|
126
122
|
if (canToggleItemExpansion(itemId)) {
|
|
127
|
-
instance.
|
|
123
|
+
instance.toggleItemExpansion(event, itemId);
|
|
128
124
|
event.preventDefault();
|
|
129
125
|
} else if (canToggleItemSelection(itemId)) {
|
|
130
126
|
if (params.multiSelect) {
|
|
131
127
|
event.preventDefault();
|
|
132
|
-
instance.
|
|
133
|
-
} else if (!instance.
|
|
134
|
-
instance.
|
|
128
|
+
instance.selectItem(event, itemId, true);
|
|
129
|
+
} else if (!instance.isItemSelected(itemId)) {
|
|
130
|
+
instance.selectItem(event, itemId);
|
|
135
131
|
event.preventDefault();
|
|
136
132
|
}
|
|
137
133
|
}
|
|
@@ -141,7 +137,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
141
137
|
// Focus the next focusable item
|
|
142
138
|
case key === 'ArrowDown':
|
|
143
139
|
{
|
|
144
|
-
const nextItem = (0, _useTreeView.
|
|
140
|
+
const nextItem = (0, _useTreeView.getNextItem)(instance, itemId);
|
|
145
141
|
if (nextItem) {
|
|
146
142
|
event.preventDefault();
|
|
147
143
|
instance.focusItem(event, nextItem);
|
|
@@ -161,7 +157,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
161
157
|
// Focuses the previous focusable item
|
|
162
158
|
case key === 'ArrowUp':
|
|
163
159
|
{
|
|
164
|
-
const previousItem = (0, _useTreeView.
|
|
160
|
+
const previousItem = (0, _useTreeView.getPreviousItem)(instance, itemId);
|
|
165
161
|
if (previousItem) {
|
|
166
162
|
event.preventDefault();
|
|
167
163
|
instance.focusItem(event, previousItem);
|
|
@@ -182,14 +178,14 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
182
178
|
// If the focused item is collapsed and has children, we expand it
|
|
183
179
|
case key === 'ArrowRight' && !isRTL || key === 'ArrowLeft' && isRTL:
|
|
184
180
|
{
|
|
185
|
-
if (instance.
|
|
186
|
-
const
|
|
187
|
-
if (
|
|
188
|
-
instance.focusItem(event,
|
|
181
|
+
if (instance.isItemExpanded(itemId)) {
|
|
182
|
+
const nextItemId = (0, _useTreeView.getNextItem)(instance, itemId);
|
|
183
|
+
if (nextItemId) {
|
|
184
|
+
instance.focusItem(event, nextItemId);
|
|
189
185
|
event.preventDefault();
|
|
190
186
|
}
|
|
191
187
|
} else if (canToggleItemExpansion(itemId)) {
|
|
192
|
-
instance.
|
|
188
|
+
instance.toggleItemExpansion(event, itemId);
|
|
193
189
|
event.preventDefault();
|
|
194
190
|
}
|
|
195
191
|
break;
|
|
@@ -199,8 +195,8 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
199
195
|
// If the focused item is collapsed and has a parent, we move the focus to this parent
|
|
200
196
|
case key === 'ArrowLeft' && !isRTL || key === 'ArrowRight' && isRTL:
|
|
201
197
|
{
|
|
202
|
-
if (canToggleItemExpansion(itemId) && instance.
|
|
203
|
-
instance.
|
|
198
|
+
if (canToggleItemExpansion(itemId) && instance.isItemExpanded(itemId)) {
|
|
199
|
+
instance.toggleItemExpansion(event, itemId);
|
|
204
200
|
event.preventDefault();
|
|
205
201
|
} else {
|
|
206
202
|
const parent = instance.getNode(itemId).parentId;
|
|
@@ -212,13 +208,13 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
212
208
|
break;
|
|
213
209
|
}
|
|
214
210
|
|
|
215
|
-
// Focuses the first
|
|
211
|
+
// Focuses the first item in the tree
|
|
216
212
|
case key === 'Home':
|
|
217
213
|
{
|
|
218
|
-
instance.focusItem(event, (0, _useTreeView.
|
|
214
|
+
instance.focusItem(event, (0, _useTreeView.getFirstItem)(instance));
|
|
219
215
|
|
|
220
216
|
// Multi select behavior when pressing Ctrl + Shift + Home
|
|
221
|
-
// Selects the focused
|
|
217
|
+
// Selects the focused item and all items up to the first item.
|
|
222
218
|
if (canToggleItemSelection(itemId) && params.multiSelect && ctrlPressed && event.shiftKey) {
|
|
223
219
|
instance.rangeSelectToFirst(event, itemId);
|
|
224
220
|
}
|
|
@@ -229,7 +225,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
229
225
|
// Focuses the last item in the tree
|
|
230
226
|
case key === 'End':
|
|
231
227
|
{
|
|
232
|
-
instance.focusItem(event, (0, _useTreeView.
|
|
228
|
+
instance.focusItem(event, (0, _useTreeView.getLastItem)(instance));
|
|
233
229
|
|
|
234
230
|
// Multi select behavior when pressing Ctrl + Shirt + End
|
|
235
231
|
// Selects the focused item and all the items down to the last item.
|
|
@@ -249,12 +245,12 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
249
245
|
}
|
|
250
246
|
|
|
251
247
|
// Multi select behavior when pressing Ctrl + a
|
|
252
|
-
// Selects all the
|
|
248
|
+
// Selects all the items
|
|
253
249
|
case key === 'a' && ctrlPressed && params.multiSelect && !params.disableSelection:
|
|
254
250
|
{
|
|
255
251
|
instance.selectRange(event, {
|
|
256
|
-
start: (0, _useTreeView.
|
|
257
|
-
end: (0, _useTreeView.
|
|
252
|
+
start: (0, _useTreeView.getFirstItem)(instance),
|
|
253
|
+
end: (0, _useTreeView.getLastItem)(instance)
|
|
258
254
|
});
|
|
259
255
|
event.preventDefault();
|
|
260
256
|
break;
|
|
@@ -264,9 +260,9 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
264
260
|
// TODO: Support typing multiple characters
|
|
265
261
|
case !ctrlPressed && !event.shiftKey && isPrintableCharacter(key):
|
|
266
262
|
{
|
|
267
|
-
const
|
|
268
|
-
if (
|
|
269
|
-
instance.focusItem(event,
|
|
263
|
+
const matchingItem = getFirstMatchingItem(itemId, key);
|
|
264
|
+
if (matchingItem != null) {
|
|
265
|
+
instance.focusItem(event, matchingItem);
|
|
270
266
|
event.preventDefault();
|
|
271
267
|
}
|
|
272
268
|
break;
|