@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.
Files changed (95) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/RichTreeView/RichTreeView.js +4 -4
  3. package/SimpleTreeView/SimpleTreeView.plugins.d.ts +1 -1
  4. package/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
  5. package/TreeItem/TreeItem.js +4 -4
  6. package/TreeItem/treeItemClasses.d.ts +1 -1
  7. package/TreeItem/useTreeItemState.js +9 -9
  8. package/TreeItem2Icon/TreeItem2Icon.types.d.ts +4 -4
  9. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +8 -8
  10. package/hooks/useTreeViewApiRef.d.ts +1 -1
  11. package/index.js +1 -1
  12. package/internals/TreeViewProvider/DescendantProvider.d.ts +1 -1
  13. package/internals/TreeViewProvider/DescendantProvider.js +1 -1
  14. package/internals/index.d.ts +2 -2
  15. package/internals/plugins/defaultPlugins.d.ts +3 -3
  16. package/internals/plugins/defaultPlugins.js +2 -2
  17. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +9 -9
  18. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +5 -5
  19. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +35 -33
  20. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +6 -6
  21. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +6 -6
  22. package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
  23. package/internals/plugins/useTreeViewItems/index.d.ts +2 -0
  24. package/internals/plugins/useTreeViewItems/index.js +1 -0
  25. package/internals/plugins/useTreeViewItems/useTreeViewItems.d.ts +3 -0
  26. package/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +42 -32
  27. package/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.d.ts → useTreeViewItems/useTreeViewItems.types.d.ts} +32 -21
  28. package/internals/plugins/useTreeViewJSXItems/index.d.ts +2 -0
  29. package/internals/plugins/useTreeViewJSXItems/index.js +1 -0
  30. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.d.ts +3 -0
  31. package/{modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +26 -25
  32. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.types.d.ts +18 -0
  33. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +40 -44
  34. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -2
  35. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
  36. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +6 -6
  37. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +7 -7
  38. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
  39. package/internals/useTreeView/useTreeView.utils.d.ts +5 -5
  40. package/internals/useTreeView/useTreeView.utils.js +15 -15
  41. package/modern/RichTreeView/RichTreeView.js +4 -4
  42. package/modern/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
  43. package/modern/TreeItem/TreeItem.js +4 -4
  44. package/modern/TreeItem/useTreeItemState.js +9 -9
  45. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +8 -8
  46. package/modern/index.js +1 -1
  47. package/modern/internals/TreeViewProvider/DescendantProvider.js +1 -1
  48. package/modern/internals/plugins/defaultPlugins.js +2 -2
  49. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +9 -9
  50. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +35 -33
  51. package/modern/internals/plugins/useTreeViewItems/index.js +1 -0
  52. package/modern/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +42 -32
  53. package/modern/internals/plugins/useTreeViewJSXItems/index.js +1 -0
  54. package/{internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +26 -25
  55. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +40 -44
  56. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
  57. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
  58. package/modern/internals/useTreeView/useTreeView.utils.js +15 -15
  59. package/node/RichTreeView/RichTreeView.js +4 -4
  60. package/node/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
  61. package/node/TreeItem/TreeItem.js +4 -4
  62. package/node/TreeItem/useTreeItemState.js +9 -9
  63. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +8 -8
  64. package/node/index.js +1 -1
  65. package/node/internals/TreeViewProvider/DescendantProvider.js +1 -1
  66. package/node/internals/plugins/defaultPlugins.js +2 -2
  67. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +9 -9
  68. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +35 -33
  69. package/node/internals/plugins/useTreeViewItems/index.js +12 -0
  70. package/node/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +44 -34
  71. package/node/internals/plugins/useTreeViewJSXItems/index.js +12 -0
  72. package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.js → useTreeViewJSXItems/useTreeViewJSXItems.js} +28 -27
  73. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +39 -43
  74. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +33 -33
  75. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
  76. package/node/internals/useTreeView/useTreeView.utils.js +20 -20
  77. package/package.json +1 -1
  78. package/useTreeItem2/useTreeItem2.d.ts +1 -1
  79. package/internals/plugins/useTreeViewJSXNodes/index.d.ts +0 -2
  80. package/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
  81. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.d.ts +0 -3
  82. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +0 -18
  83. package/internals/plugins/useTreeViewNodes/index.d.ts +0 -2
  84. package/internals/plugins/useTreeViewNodes/index.js +0 -1
  85. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.d.ts +0 -3
  86. package/modern/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
  87. package/modern/internals/plugins/useTreeViewNodes/index.js +0 -1
  88. package/node/internals/plugins/useTreeViewJSXNodes/index.js +0 -12
  89. package/node/internals/plugins/useTreeViewNodes/index.js +0 -12
  90. /package/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
  91. /package/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
  92. /package/modern/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
  93. /package/modern/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
  94. /package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
  95. /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.useTreeViewNodes = void 0;
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 updateNodesState = ({
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 useTreeViewNodes = ({
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.nodes.nodeMap[itemId], [state.nodes.nodeMap]);
64
- const getItem = React.useCallback(itemId => state.nodes.itemMap[itemId], [state.nodes.itemMap]);
65
- const isNodeDisabled = React.useCallback(itemId => {
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 item = instance.getNode(itemId);
69
+ let node = instance.getNode(itemId);
70
70
 
71
- // This can be called before the item has been added to the node map.
72
- if (!item) {
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 (item.disabled) {
75
+ if (node.disabled) {
76
76
  return true;
77
77
  }
78
- while (item.parentId != null) {
79
- item = instance.getNode(item.parentId);
80
- if (item.disabled) {
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.nodes.nodeMap).filter(item => item.parentId === itemId).sort((a, b) => a.index - b.index).map(child => child.id), [state.nodes.nodeMap]);
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.isNodeDisabled(item));
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 = updateNodesState({
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.nodes.nodeMap).forEach(node => {
103
- if (!newState.nodeMap[node.id]) {
104
- (0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
105
- id: node.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
- nodes: newState
118
+ items: newState
111
119
  });
112
120
  });
113
121
  }, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
114
- const getNodesToRender = () => {
122
+ const getItemsToRender = () => {
115
123
  const getPropsFromItemId = ({
116
124
  id,
117
125
  children
118
126
  }) => {
119
- const node = state.nodes.nodeMap[id];
127
+ const item = state.items.nodeMap[id];
120
128
  return {
121
- label: node.label,
122
- itemId: node.id,
123
- id: node.idAttribute,
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.nodes.nodeTree.map(getPropsFromItemId);
135
+ return state.items.nodeTree.map(getPropsFromItemId);
128
136
  };
129
137
  (0, _useTreeView.populateInstance)(instance, {
130
138
  getNode,
131
139
  getItem,
132
- getNodesToRender,
140
+ getItemsToRender,
133
141
  getChildrenIds,
134
142
  getNavigableChildrenIds,
135
- isNodeDisabled
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.useTreeViewNodes = useTreeViewNodes;
147
- useTreeViewNodes.getInitialState = params => ({
148
- nodes: updateNodesState({
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
- useTreeViewNodes.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
165
+ useTreeViewItems.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
156
166
  disabledItemsFocusable: params.disabledItemsFocusable ?? false
157
167
  });
158
- useTreeViewNodes.params = {
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.useTreeViewJSXNodes = void 0;
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 useTreeViewJSXNodes = ({
19
+ const useTreeViewJSXItems = ({
20
20
  instance,
21
21
  setState
22
22
  }) => {
23
- const insertJSXNode = (0, _useEventCallback.default)(node => {
23
+ instance.preventItemUpdates();
24
+ const insertJSXItem = (0, _useEventCallback.default)(item => {
24
25
  setState(prevState => {
25
- if (prevState.nodes.nodeMap[node.id] != null) {
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: "${node.id}"`].join('\n'));
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
- nodes: (0, _extends2.default)({}, prevState.nodes, {
30
- nodeMap: (0, _extends2.default)({}, prevState.nodes.nodeMap, {
31
- [node.id]: node
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.nodes.itemMap, {
35
- [node.id]: {
36
- id: node.id,
37
- label: node.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 removeJSXNode = (0, _useEventCallback.default)(itemId => {
45
+ const removeJSXItem = (0, _useEventCallback.default)(itemId => {
45
46
  setState(prevState => {
46
- const newNodeMap = (0, _extends2.default)({}, prevState.nodes.nodeMap);
47
- const newItemMap = (0, _extends2.default)({}, prevState.nodes.itemMap);
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
- nodes: (0, _extends2.default)({}, prevState.nodes, {
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, 'removeNode', {
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
- insertJSXNode,
76
- removeJSXNode,
76
+ insertJSXItem,
77
+ removeJSXItem,
77
78
  mapFirstCharFromJSX
78
79
  });
79
80
  };
80
- exports.useTreeViewJSXNodes = useTreeViewJSXNodes;
81
- const useTreeViewJSXNodesItemPlugin = ({
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 node's index will be -1. We want to wait for the real index.
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.insertJSXNode({
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.removeJSXNode(itemId);
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
- useTreeViewJSXNodes.itemPlugin = useTreeViewJSXNodesItemPlugin;
142
- useTreeViewJSXNodes.wrapItem = ({
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
- useTreeViewJSXNodes.params = {};
150
+ useTreeViewJSXItems.params = {};
@@ -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 (hasFirstCharMapBeenUpdatedImperatively.current) {
37
+ if (instance.areItemUpdatesPrevented()) {
39
38
  return;
40
39
  }
41
40
  const newFirstCharMap = {};
42
- const processItem = item => {
43
- const getItemId = params.getItemId;
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
- params.items.forEach(processItem);
44
+ Object.values(state.items.nodeMap).forEach(processItem);
49
45
  firstCharMap.current = newFirstCharMap;
50
- }, [params.items, params.getItemId, instance]);
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.isNodeExpanded(map.parentId) : true;
61
- const shouldBeSkipped = params.disabledItemsFocusable ? false : instance.isNodeDisabled(mapItemId);
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.isNodeDisabled(itemId);
84
+ const canToggleItemSelection = itemId => !params.disableSelection && !instance.isItemDisabled(itemId);
89
85
  const canToggleItemExpansion = itemId => {
90
- return !instance.isNodeDisabled(itemId) && instance.isNodeExpandable(itemId);
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 node when pressing "Space"
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.selectNode(event, itemId, true);
111
+ instance.selectItem(event, itemId, true);
116
112
  } else {
117
- instance.selectNode(event, itemId);
113
+ instance.selectItem(event, itemId);
118
114
  }
119
115
  break;
120
116
  }
121
117
 
122
- // If the focused node has children, we expand it.
123
- // If the focused node has no children, we select it.
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.toggleNodeExpansion(event, itemId);
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.selectNode(event, itemId, true);
133
- } else if (!instance.isNodeSelected(itemId)) {
134
- instance.selectNode(event, itemId);
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.getNextNode)(instance, itemId);
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.getPreviousNode)(instance, itemId);
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.isNodeExpanded(itemId)) {
186
- const nextNodeId = (0, _useTreeView.getNextNode)(instance, itemId);
187
- if (nextNodeId) {
188
- instance.focusItem(event, nextNodeId);
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.toggleNodeExpansion(event, itemId);
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.isNodeExpanded(itemId)) {
203
- instance.toggleNodeExpansion(event, itemId);
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 node in the tree
211
+ // Focuses the first item in the tree
216
212
  case key === 'Home':
217
213
  {
218
- instance.focusItem(event, (0, _useTreeView.getFirstNode)(instance));
214
+ instance.focusItem(event, (0, _useTreeView.getFirstItem)(instance));
219
215
 
220
216
  // Multi select behavior when pressing Ctrl + Shift + Home
221
- // Selects the focused node and all nodes up to the first node.
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.getLastNode)(instance));
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 nodes
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.getFirstNode)(instance),
257
- end: (0, _useTreeView.getLastNode)(instance)
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 matchingNode = getFirstMatchingItem(itemId, key);
268
- if (matchingNode != null) {
269
- instance.focusItem(event, matchingNode);
263
+ const matchingItem = getFirstMatchingItem(itemId, key);
264
+ if (matchingItem != null) {
265
+ instance.focusItem(event, matchingItem);
270
266
  event.preventDefault();
271
267
  }
272
268
  break;