@mui/x-tree-view 7.0.0-beta.7 → 7.0.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 (86) hide show
  1. package/CHANGELOG.md +195 -12
  2. package/README.md +1 -1
  3. package/RichTreeView/RichTreeView.js +12 -14
  4. package/RichTreeView/RichTreeView.types.d.ts +1 -1
  5. package/SimpleTreeView/SimpleTreeView.js +3 -4
  6. package/TreeItem/TreeItem.js +43 -35
  7. package/TreeItem/TreeItem.types.d.ts +3 -3
  8. package/TreeItem/TreeItemContent.d.ts +7 -7
  9. package/TreeItem/TreeItemContent.js +10 -10
  10. package/TreeItem/useTreeItemState.d.ts +1 -1
  11. package/TreeItem/useTreeItemState.js +13 -13
  12. package/TreeItem2/TreeItem2.js +16 -17
  13. package/TreeItem2Icon/TreeItem2Icon.js +5 -6
  14. package/TreeItem2Provider/TreeItem2Provider.js +3 -3
  15. package/TreeItem2Provider/TreeItem2Provider.types.d.ts +1 -1
  16. package/TreeView/TreeView.d.ts +1 -1
  17. package/TreeView/TreeView.js +1 -1
  18. package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +2 -2
  19. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
  20. package/index.js +1 -1
  21. package/internals/hooks/useInstanceEventHandler.js +5 -10
  22. package/internals/models/plugin.d.ts +1 -1
  23. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +11 -18
  24. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +3 -3
  25. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +59 -43
  26. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +6 -5
  27. package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  28. package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
  29. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -18
  30. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +2 -2
  31. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +70 -77
  32. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +4 -1
  33. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +24 -29
  34. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +11 -11
  35. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +18 -21
  36. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +4 -4
  37. package/internals/useTreeView/useTreeView.js +5 -6
  38. package/internals/useTreeView/useTreeView.utils.d.ts +2 -2
  39. package/internals/useTreeView/useTreeView.utils.js +22 -22
  40. package/internals/utils/extractPluginParamsFromProps.js +2 -2
  41. package/internals/utils/utils.js +1 -0
  42. package/modern/RichTreeView/RichTreeView.js +7 -7
  43. package/modern/SimpleTreeView/SimpleTreeView.js +1 -1
  44. package/modern/TreeItem/TreeItem.js +31 -22
  45. package/modern/TreeItem/TreeItemContent.js +10 -10
  46. package/modern/TreeItem/useTreeItemState.js +13 -13
  47. package/modern/TreeItem2/TreeItem2.js +11 -11
  48. package/modern/TreeItem2Provider/TreeItem2Provider.js +3 -3
  49. package/modern/TreeView/TreeView.js +1 -1
  50. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
  51. package/modern/index.js +1 -1
  52. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -7
  53. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +57 -38
  54. package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  55. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -17
  56. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +69 -74
  57. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +19 -20
  58. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +13 -13
  59. package/modern/internals/useTreeView/useTreeView.js +3 -4
  60. package/modern/internals/useTreeView/useTreeView.utils.js +22 -22
  61. package/modern/internals/utils/utils.js +1 -0
  62. package/modern/useTreeItem2/useTreeItem2.js +23 -12
  63. package/node/RichTreeView/RichTreeView.js +7 -7
  64. package/node/SimpleTreeView/SimpleTreeView.js +1 -1
  65. package/node/TreeItem/TreeItem.js +31 -22
  66. package/node/TreeItem/TreeItemContent.js +10 -10
  67. package/node/TreeItem/useTreeItemState.js +13 -13
  68. package/node/TreeItem2/TreeItem2.js +11 -11
  69. package/node/TreeItem2Provider/TreeItem2Provider.js +3 -3
  70. package/node/TreeView/TreeView.js +1 -1
  71. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
  72. package/node/index.js +1 -1
  73. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +7 -7
  74. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +57 -38
  75. package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  76. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +17 -17
  77. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +69 -74
  78. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +19 -20
  79. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +13 -13
  80. package/node/internals/useTreeView/useTreeView.js +3 -4
  81. package/node/internals/useTreeView/useTreeView.utils.js +22 -22
  82. package/node/internals/utils/utils.js +1 -0
  83. package/node/useTreeItem2/useTreeItem2.js +23 -12
  84. package/package.json +5 -5
  85. package/useTreeItem2/useTreeItem2.js +26 -18
  86. package/useTreeItem2/useTreeItem2.types.d.ts +9 -7
@@ -1,6 +1,5 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
- import useEventCallback from '@mui/utils/useEventCallback';
4
3
  import { populateInstance, populatePublicAPI } from '../../useTreeView/useTreeView.utils';
5
4
  import { publishTreeViewEvent } from '../../utils/publishTreeViewEvent';
6
5
  const updateNodesState = ({
@@ -12,7 +11,6 @@ const updateNodesState = ({
12
11
  const nodeMap = {};
13
12
  const itemMap = {};
14
13
  const processItem = (item, index, parentId) => {
15
- var _item$children, _item$children2;
16
14
  const id = getItemId ? getItemId(item) : item.id;
17
15
  if (id == null) {
18
16
  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.', 'An item was provided without id in the `items` prop:', JSON.stringify(item)].join('\n'));
@@ -30,13 +28,13 @@ const updateNodesState = ({
30
28
  index,
31
29
  parentId,
32
30
  idAttribute: undefined,
33
- expandable: !!((_item$children = item.children) != null && _item$children.length),
31
+ expandable: !!item.children?.length,
34
32
  disabled: isItemDisabled ? isItemDisabled(item) : false
35
33
  };
36
34
  itemMap[id] = item;
37
35
  return {
38
36
  id,
39
- children: (_item$children2 = item.children) == null ? void 0 : _item$children2.map((child, childIndex) => processItem(child, childIndex, id))
37
+ children: item.children?.map((child, childIndex) => processItem(child, childIndex, id))
40
38
  };
41
39
  };
42
40
  const nodeTree = items.map((item, itemIndex) => processItem(item, itemIndex, null));
@@ -53,34 +51,34 @@ export const useTreeViewNodes = ({
53
51
  state,
54
52
  setState
55
53
  }) => {
56
- const getNode = React.useCallback(nodeId => state.nodes.nodeMap[nodeId], [state.nodes.nodeMap]);
57
- const getItem = React.useCallback(nodeId => state.nodes.itemMap[nodeId], [state.nodes.itemMap]);
58
- const isNodeDisabled = React.useCallback(nodeId => {
59
- if (nodeId == null) {
54
+ const getNode = React.useCallback(itemId => state.nodes.nodeMap[itemId], [state.nodes.nodeMap]);
55
+ const getItem = React.useCallback(itemId => state.nodes.itemMap[itemId], [state.nodes.itemMap]);
56
+ const isNodeDisabled = React.useCallback(itemId => {
57
+ if (itemId == null) {
60
58
  return false;
61
59
  }
62
- let node = instance.getNode(nodeId);
60
+ let item = instance.getNode(itemId);
63
61
 
64
- // This can be called before the node has been added to the node map.
65
- if (!node) {
62
+ // This can be called before the item has been added to the node map.
63
+ if (!item) {
66
64
  return false;
67
65
  }
68
- if (node.disabled) {
66
+ if (item.disabled) {
69
67
  return true;
70
68
  }
71
- while (node.parentId != null) {
72
- node = instance.getNode(node.parentId);
73
- if (node.disabled) {
69
+ while (item.parentId != null) {
70
+ item = instance.getNode(item.parentId);
71
+ if (item.disabled) {
74
72
  return true;
75
73
  }
76
74
  }
77
75
  return false;
78
76
  }, [instance]);
79
- const getChildrenIds = useEventCallback(nodeId => Object.values(state.nodes.nodeMap).filter(node => node.parentId === nodeId).sort((a, b) => a.index - b.index).map(child => child.id));
80
- const getNavigableChildrenIds = nodeId => {
81
- let childrenIds = instance.getChildrenIds(nodeId);
77
+ 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]);
78
+ const getNavigableChildrenIds = itemId => {
79
+ let childrenIds = instance.getChildrenIds(itemId);
82
80
  if (!params.disabledItemsFocusable) {
83
- childrenIds = childrenIds.filter(node => !instance.isNodeDisabled(node));
81
+ childrenIds = childrenIds.filter(item => !instance.isNodeDisabled(item));
84
82
  }
85
83
  return childrenIds;
86
84
  };
@@ -105,19 +103,19 @@ export const useTreeViewNodes = ({
105
103
  });
106
104
  }, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
107
105
  const getNodesToRender = () => {
108
- const getPropsFromNodeId = ({
106
+ const getPropsFromItemId = ({
109
107
  id,
110
108
  children
111
109
  }) => {
112
110
  const node = state.nodes.nodeMap[id];
113
111
  return {
114
112
  label: node.label,
115
- nodeId: node.id,
113
+ itemId: node.id,
116
114
  id: node.idAttribute,
117
- children: children == null ? void 0 : children.map(getPropsFromNodeId)
115
+ children: children?.map(getPropsFromItemId)
118
116
  };
119
117
  };
120
- return state.nodes.nodeTree.map(getPropsFromNodeId);
118
+ return state.nodes.nodeTree.map(getPropsFromItemId);
121
119
  };
122
120
  populateInstance(instance, {
123
121
  getNode,
@@ -144,12 +142,9 @@ useTreeViewNodes.getInitialState = params => ({
144
142
  getItemLabel: params.getItemLabel
145
143
  })
146
144
  });
147
- useTreeViewNodes.getDefaultizedParams = params => {
148
- var _params$disabledItems;
149
- return _extends({}, params, {
150
- disabledItemsFocusable: (_params$disabledItems = params.disabledItemsFocusable) != null ? _params$disabledItems : false
151
- });
152
- };
145
+ useTreeViewNodes.getDefaultizedParams = params => _extends({}, params, {
146
+ disabledItemsFocusable: params.disabledItemsFocusable ?? false
147
+ });
153
148
  useTreeViewNodes.params = {
154
149
  disabledItemsFocusable: true,
155
150
  items: true,
@@ -2,17 +2,17 @@ import { TreeViewNode, DefaultizedProps, TreeViewPluginSignature } from '../../m
2
2
  import { TreeViewItemId } from '../../../models';
3
3
  interface TreeViewNodeProps {
4
4
  label: string;
5
- nodeId: string;
5
+ itemId: string;
6
6
  id: string | undefined;
7
7
  children?: TreeViewNodeProps[];
8
8
  }
9
9
  export interface UseTreeViewNodesInstance<R extends {}> {
10
- getNode: (nodeId: string) => TreeViewNode;
11
- getItem: (nodeId: string) => R;
10
+ getNode: (itemId: string) => TreeViewNode;
11
+ getItem: (itemId: string) => R;
12
12
  getNodesToRender: () => TreeViewNodeProps[];
13
- getChildrenIds: (nodeId: string | null) => string[];
14
- getNavigableChildrenIds: (nodeId: string | null) => string[];
15
- isNodeDisabled: (nodeId: string | null) => nodeId is string;
13
+ getChildrenIds: (itemId: string | null) => string[];
14
+ getNavigableChildrenIds: (itemId: string | null) => string[];
15
+ isNodeDisabled: (itemId: string | null) => itemId is string;
16
16
  }
17
17
  export interface UseTreeViewNodesPublicAPI<R extends {}> extends Pick<UseTreeViewNodesInstance<R>, 'getItem'> {
18
18
  }
@@ -57,13 +57,13 @@ interface UseTreeViewNodesEventLookup {
57
57
  };
58
58
  };
59
59
  }
60
- export interface TreeViewNodeIdAndChildren {
60
+ export interface TreeViewItemIdAndChildren {
61
61
  id: TreeViewItemId;
62
- children?: TreeViewNodeIdAndChildren[];
62
+ children?: TreeViewItemIdAndChildren[];
63
63
  }
64
64
  export interface UseTreeViewNodesState<R extends {}> {
65
65
  nodes: {
66
- nodeTree: TreeViewNodeIdAndChildren[];
66
+ nodeTree: TreeViewItemIdAndChildren[];
67
67
  nodeMap: TreeViewNodeMap;
68
68
  itemMap: TreeViewItemMap<R>;
69
69
  };
@@ -80,9 +80,9 @@ export type UseTreeViewNodesSignature = TreeViewPluginSignature<{
80
80
  contextValue: UseTreeViewNodesContextValue;
81
81
  }>;
82
82
  export type TreeViewNodeMap = {
83
- [nodeId: string]: TreeViewNode;
83
+ [itemId: string]: TreeViewNode;
84
84
  };
85
85
  export type TreeViewItemMap<R extends {}> = {
86
- [nodeId: string]: R;
86
+ [itemId: string]: R;
87
87
  };
88
88
  export {};
@@ -35,26 +35,26 @@ export const useTreeViewSelection = ({
35
35
  }
36
36
  models.selectedItems.setControlledValue(newSelectedItems);
37
37
  };
38
- const isNodeSelected = nodeId => Array.isArray(models.selectedItems.value) ? models.selectedItems.value.indexOf(nodeId) !== -1 : models.selectedItems.value === nodeId;
39
- const selectNode = (event, nodeId, multiple = false) => {
38
+ const isNodeSelected = itemId => Array.isArray(models.selectedItems.value) ? models.selectedItems.value.indexOf(itemId) !== -1 : models.selectedItems.value === itemId;
39
+ const selectNode = (event, itemId, multiple = false) => {
40
40
  if (params.disableSelection) {
41
41
  return;
42
42
  }
43
43
  if (multiple) {
44
44
  if (Array.isArray(models.selectedItems.value)) {
45
45
  let newSelected;
46
- if (models.selectedItems.value.indexOf(nodeId) !== -1) {
47
- newSelected = models.selectedItems.value.filter(id => id !== nodeId);
46
+ if (models.selectedItems.value.indexOf(itemId) !== -1) {
47
+ newSelected = models.selectedItems.value.filter(id => id !== itemId);
48
48
  } else {
49
- newSelected = [nodeId].concat(models.selectedItems.value);
49
+ newSelected = [itemId].concat(models.selectedItems.value);
50
50
  }
51
51
  setSelectedItems(event, newSelected);
52
52
  }
53
53
  } else {
54
- const newSelected = params.multiSelect ? [nodeId] : nodeId;
54
+ const newSelected = params.multiSelect ? [itemId] : itemId;
55
55
  setSelectedItems(event, newSelected);
56
56
  }
57
- lastSelectedNode.current = nodeId;
57
+ lastSelectedNode.current = itemId;
58
58
  lastSelectionWasRange.current = false;
59
59
  currentRangeSelection.current = [];
60
60
  };
@@ -135,21 +135,21 @@ export const useTreeViewSelection = ({
135
135
  }
136
136
  lastSelectionWasRange.current = true;
137
137
  };
138
- const rangeSelectToFirst = (event, nodeId) => {
138
+ const rangeSelectToFirst = (event, itemId) => {
139
139
  if (!lastSelectedNode.current) {
140
- lastSelectedNode.current = nodeId;
140
+ lastSelectedNode.current = itemId;
141
141
  }
142
- const start = lastSelectionWasRange.current ? lastSelectedNode.current : nodeId;
142
+ const start = lastSelectionWasRange.current ? lastSelectedNode.current : itemId;
143
143
  instance.selectRange(event, {
144
144
  start,
145
145
  end: getFirstNode(instance)
146
146
  });
147
147
  };
148
- const rangeSelectToLast = (event, nodeId) => {
148
+ const rangeSelectToLast = (event, itemId) => {
149
149
  if (!lastSelectedNode.current) {
150
- lastSelectedNode.current = nodeId;
150
+ lastSelectedNode.current = itemId;
151
151
  }
152
- const start = lastSelectionWasRange.current ? lastSelectedNode.current : nodeId;
152
+ const start = lastSelectionWasRange.current ? lastSelectedNode.current : itemId;
153
153
  instance.selectRange(event, {
154
154
  start,
155
155
  end: getLastNode(instance)
@@ -179,14 +179,11 @@ useTreeViewSelection.models = {
179
179
  }
180
180
  };
181
181
  const DEFAULT_SELECTED_NODES = [];
182
- useTreeViewSelection.getDefaultizedParams = params => {
183
- var _params$disableSelect, _params$multiSelect, _params$defaultSelect;
184
- return _extends({}, params, {
185
- disableSelection: (_params$disableSelect = params.disableSelection) != null ? _params$disableSelect : false,
186
- multiSelect: (_params$multiSelect = params.multiSelect) != null ? _params$multiSelect : false,
187
- defaultSelectedItems: (_params$defaultSelect = params.defaultSelectedItems) != null ? _params$defaultSelect : params.multiSelect ? DEFAULT_SELECTED_NODES : null
188
- });
189
- };
182
+ useTreeViewSelection.getDefaultizedParams = params => _extends({}, params, {
183
+ disableSelection: params.disableSelection ?? false,
184
+ multiSelect: params.multiSelect ?? false,
185
+ defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ? DEFAULT_SELECTED_NODES : null)
186
+ });
190
187
  useTreeViewSelection.params = {
191
188
  disableSelection: true,
192
189
  multiSelect: true,
@@ -3,11 +3,11 @@ import type { DefaultizedProps, TreeViewItemRange, TreeViewPluginSignature } fro
3
3
  import { UseTreeViewNodesSignature } from '../useTreeViewNodes';
4
4
  import { UseTreeViewExpansionSignature } from '../useTreeViewExpansion';
5
5
  export interface UseTreeViewSelectionInstance {
6
- isNodeSelected: (nodeId: string) => boolean;
7
- selectNode: (event: React.SyntheticEvent, nodeId: string, multiple?: boolean) => void;
6
+ isNodeSelected: (itemId: string) => boolean;
7
+ selectNode: (event: React.SyntheticEvent, itemId: string, multiple?: boolean) => void;
8
8
  selectRange: (event: React.SyntheticEvent, nodes: TreeViewItemRange, stacked?: boolean) => void;
9
- rangeSelectToFirst: (event: React.KeyboardEvent<HTMLUListElement>, nodeId: string) => void;
10
- rangeSelectToLast: (event: React.KeyboardEvent<HTMLUListElement>, nodeId: string) => void;
9
+ rangeSelectToFirst: (event: React.KeyboardEvent, itemId: string) => void;
10
+ rangeSelectToLast: (event: React.KeyboardEvent, itemId: string) => void;
11
11
  }
12
12
  type TreeViewSelectionValue<Multiple extends boolean | undefined> = Multiple extends true ? string[] : string | null;
13
13
  export interface UseTreeViewSelectionParameters<Multiple extends boolean | undefined> {
@@ -73,10 +73,10 @@ export const useTreeView = inParams => {
73
73
  rootRef: finalRootRef,
74
74
  contentRef: finalContentRef
75
75
  });
76
- if (itemPluginResponse != null && itemPluginResponse.rootRef) {
76
+ if (itemPluginResponse?.rootRef) {
77
77
  finalRootRef = itemPluginResponse.rootRef;
78
78
  }
79
- if (itemPluginResponse != null && itemPluginResponse.contentRef) {
79
+ if (itemPluginResponse?.contentRef) {
80
80
  finalContentRef = itemPluginResponse.contentRef;
81
81
  }
82
82
  });
@@ -87,13 +87,13 @@ export const useTreeView = inParams => {
87
87
  };
88
88
  const itemWrappers = plugins.map(plugin => plugin.wrapItem).filter(wrapItem => !!wrapItem);
89
89
  contextValue.wrapItem = ({
90
- nodeId,
90
+ itemId,
91
91
  children
92
92
  }) => {
93
93
  let finalChildren = children;
94
94
  itemWrappers.forEach(itemWrapper => {
95
95
  finalChildren = itemWrapper({
96
- nodeId,
96
+ itemId,
97
97
  children: finalChildren
98
98
  });
99
99
  });
@@ -101,8 +101,7 @@ export const useTreeView = inParams => {
101
101
  };
102
102
  const getRootProps = (otherHandlers = {}) => {
103
103
  const rootProps = _extends({
104
- role: 'tree',
105
- tabIndex: 0
104
+ role: 'tree'
106
105
  }, otherHandlers, {
107
106
  ref: handleRootRef
108
107
  });
@@ -1,8 +1,8 @@
1
1
  import { TreeViewAnyPluginSignature, TreeViewInstance, TreeViewUsedInstance, TreeViewUsedPublicAPI } from '../models';
2
2
  import type { UseTreeViewExpansionSignature } from '../plugins/useTreeViewExpansion';
3
3
  import type { UseTreeViewNodesSignature } from '../plugins/useTreeViewNodes';
4
- export declare const getPreviousNode: (instance: TreeViewInstance<[UseTreeViewNodesSignature, UseTreeViewExpansionSignature]>, nodeId: string) => string | null;
5
- export declare const getNextNode: (instance: TreeViewInstance<[UseTreeViewExpansionSignature, UseTreeViewNodesSignature]>, nodeId: string) => string | null;
4
+ export declare const getPreviousNode: (instance: TreeViewInstance<[UseTreeViewNodesSignature, UseTreeViewExpansionSignature]>, itemId: string) => string | null;
5
+ export declare const getNextNode: (instance: TreeViewInstance<[UseTreeViewExpansionSignature, UseTreeViewNodesSignature]>, itemId: string) => string | null;
6
6
  export declare const getLastNode: (instance: TreeViewInstance<[UseTreeViewExpansionSignature, UseTreeViewNodesSignature]>) => string;
7
7
  export declare const getFirstNode: (instance: TreeViewInstance<[UseTreeViewNodesSignature]>) => string;
8
8
  export declare const populateInstance: <T extends TreeViewAnyPluginSignature>(instance: TreeViewUsedInstance<T>, methods: T["instance"]) => void;
@@ -1,41 +1,41 @@
1
- export const getPreviousNode = (instance, nodeId) => {
2
- const node = instance.getNode(nodeId);
3
- const siblings = instance.getNavigableChildrenIds(node.parentId);
4
- const nodeIndex = siblings.indexOf(nodeId);
5
- if (nodeIndex === 0) {
6
- return node.parentId;
1
+ export const getPreviousNode = (instance, itemId) => {
2
+ const item = instance.getNode(itemId);
3
+ const siblings = instance.getNavigableChildrenIds(item.parentId);
4
+ const itemIndex = siblings.indexOf(itemId);
5
+ if (itemIndex === 0) {
6
+ return item.parentId;
7
7
  }
8
- let currentNode = siblings[nodeIndex - 1];
9
- while (instance.isNodeExpanded(currentNode) && instance.getNavigableChildrenIds(currentNode).length > 0) {
10
- currentNode = instance.getNavigableChildrenIds(currentNode).pop();
8
+ let currentItem = siblings[itemIndex - 1];
9
+ while (instance.isNodeExpanded(currentItem) && instance.getNavigableChildrenIds(currentItem).length > 0) {
10
+ currentItem = instance.getNavigableChildrenIds(currentItem).pop();
11
11
  }
12
- return currentNode;
12
+ return currentItem;
13
13
  };
14
- export const getNextNode = (instance, nodeId) => {
14
+ export const getNextNode = (instance, itemId) => {
15
15
  // If expanded get first child
16
- if (instance.isNodeExpanded(nodeId) && instance.getNavigableChildrenIds(nodeId).length > 0) {
17
- return instance.getNavigableChildrenIds(nodeId)[0];
16
+ if (instance.isNodeExpanded(itemId) && instance.getNavigableChildrenIds(itemId).length > 0) {
17
+ return instance.getNavigableChildrenIds(itemId)[0];
18
18
  }
19
- let node = instance.getNode(nodeId);
20
- while (node != null) {
19
+ let item = instance.getNode(itemId);
20
+ while (item != null) {
21
21
  // Try to get next sibling
22
- const siblings = instance.getNavigableChildrenIds(node.parentId);
23
- const nextSibling = siblings[siblings.indexOf(node.id) + 1];
22
+ const siblings = instance.getNavigableChildrenIds(item.parentId);
23
+ const nextSibling = siblings[siblings.indexOf(item.id) + 1];
24
24
  if (nextSibling) {
25
25
  return nextSibling;
26
26
  }
27
27
 
28
28
  // If the sibling does not exist, go up a level to the parent and try again.
29
- node = instance.getNode(node.parentId);
29
+ item = instance.getNode(item.parentId);
30
30
  }
31
31
  return null;
32
32
  };
33
33
  export const getLastNode = instance => {
34
- let lastNode = instance.getNavigableChildrenIds(null).pop();
35
- while (instance.isNodeExpanded(lastNode)) {
36
- lastNode = instance.getNavigableChildrenIds(lastNode).pop();
34
+ let lastItem = instance.getNavigableChildrenIds(null).pop();
35
+ while (instance.isNodeExpanded(lastItem)) {
36
+ lastItem = instance.getNavigableChildrenIds(lastItem).pop();
37
37
  }
38
- return lastNode;
38
+ return lastItem;
39
39
  };
40
40
  export const getFirstNode = instance => instance.getNavigableChildrenIds(null)[0];
41
41
  export const populateInstance = (instance, methods) => {
@@ -18,8 +18,8 @@ export const extractPluginParamsFromProps = _ref => {
18
18
  const pluginParams = {
19
19
  plugins,
20
20
  rootRef,
21
- slots: slots != null ? slots : {},
22
- slotProps: slotProps != null ? slotProps : {},
21
+ slots: slots ?? {},
22
+ slotProps: slotProps ?? {},
23
23
  apiRef
24
24
  };
25
25
  const otherProps = {};
@@ -1,3 +1,4 @@
1
+ // https://www.abeautifulsite.net/posts/finding-the-active-element-in-a-shadow-root/
1
2
  export const getActiveElement = (root = document) => {
2
3
  const activeEl = root.activeElement;
3
4
  if (!activeEl) {
@@ -36,7 +36,7 @@ function WrappedTreeItem({
36
36
  slotProps,
37
37
  label,
38
38
  id,
39
- nodeId,
39
+ itemId,
40
40
  children
41
41
  }) {
42
42
  const Item = slots?.item ?? TreeItem;
@@ -44,12 +44,12 @@ function WrappedTreeItem({
44
44
  elementType: Item,
45
45
  externalSlotProps: slotProps?.item,
46
46
  additionalProps: {
47
- nodeId,
47
+ itemId,
48
48
  id,
49
49
  label
50
50
  },
51
51
  ownerState: {
52
- nodeId,
52
+ itemId,
53
53
  label
54
54
  }
55
55
  });
@@ -57,7 +57,7 @@ function WrappedTreeItem({
57
57
  children: children
58
58
  }));
59
59
  }
60
- const childrenWarning = buildWarning(['MUI X: The `RichTreeView` component does not support JSX children.', 'If you want to add items, you need to use the `items` prop', 'Check the documentation for more details: https://next.mui.com/x/react-tree-view/rich-tree-view/items/']);
60
+ const childrenWarning = buildWarning(['MUI X: The `RichTreeView` component does not support JSX children.', 'If you want to add items, you need to use the `items` prop', 'Check the documentation for more details: https://mui.com/x/react-tree-view/rich-tree-view/items/']);
61
61
 
62
62
  /**
63
63
  *
@@ -107,7 +107,7 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
107
107
  const nodesToRender = instance.getNodesToRender();
108
108
  const renderNode = ({
109
109
  label,
110
- nodeId,
110
+ itemId,
111
111
  id,
112
112
  children
113
113
  }) => {
@@ -116,9 +116,9 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
116
116
  slotProps: slotProps,
117
117
  label: label,
118
118
  id: id,
119
- nodeId: nodeId,
119
+ itemId: itemId,
120
120
  children: children?.map(renderNode)
121
- }, nodeId);
121
+ }, itemId);
122
122
  };
123
123
  return /*#__PURE__*/_jsx(TreeViewProvider, {
124
124
  value: contextValue,
@@ -31,7 +31,7 @@ export const SimpleTreeViewRoot = styled('ul', {
31
31
  outline: 0
32
32
  });
33
33
  const EMPTY_ITEMS = [];
34
- const itemsPropWarning = buildWarning(['MUI X: The `SimpleTreeView` component does not support the `items` prop.', 'If you want to add items, you need to pass them as JSX children.', 'Check the documentation for more details: https://next.mui.com/x/react-tree-view/simple-tree-view/items/']);
34
+ const itemsPropWarning = buildWarning(['MUI X: The `SimpleTreeView` component does not support the `items` prop.', 'If you want to add items, you need to pass them as JSX children.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/simple-tree-view/items/']);
35
35
 
36
36
  /**
37
37
  *
@@ -1,6 +1,6 @@
1
1
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
- const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "nodeId", "id", "label", "onClick", "onMouseDown"],
3
+ const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "itemId", "id", "label", "onClick", "onMouseDown", "onFocus", "onBlur", "onKeyDown"],
4
4
  _excluded2 = ["ownerState"],
5
5
  _excluded3 = ["ownerState"],
6
6
  _excluded4 = ["ownerState"];
@@ -157,11 +157,13 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
157
157
  slotProps: inSlotProps,
158
158
  ContentComponent = TreeItemContent,
159
159
  ContentProps,
160
- nodeId,
160
+ itemId,
161
161
  id,
162
162
  label,
163
163
  onClick,
164
- onMouseDown
164
+ onMouseDown,
165
+ onBlur,
166
+ onKeyDown
165
167
  } = props,
166
168
  other = _objectWithoutPropertiesLoose(props, _excluded);
167
169
  const {
@@ -184,10 +186,10 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
184
186
  return Boolean(reactChildren);
185
187
  };
186
188
  const expandable = isExpandable(children);
187
- const expanded = instance.isNodeExpanded(nodeId);
188
- const focused = instance.isNodeFocused(nodeId);
189
- const selected = instance.isNodeSelected(nodeId);
190
- const disabled = instance.isNodeDisabled(nodeId);
189
+ const expanded = instance.isNodeExpanded(itemId);
190
+ const focused = instance.isNodeFocused(itemId);
191
+ const selected = instance.isNodeSelected(itemId);
192
+ const disabled = instance.isNodeDisabled(itemId);
191
193
  const ownerState = _extends({}, props, {
192
194
  expanded,
193
195
  focused,
@@ -249,24 +251,29 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
249
251
  /* single-selection trees unset aria-selected on un-selected items.
250
252
  *
251
253
  * If the tree does not support multiple selection, aria-selected
252
- * is set to true for the selected node and it is not present on any other node in the tree.
254
+ * is set to true for the selected item and it is not present on any other item in the tree.
253
255
  * Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
254
256
  */
255
257
  ariaSelected = true;
256
258
  }
257
259
  function handleFocus(event) {
258
- // DOM focus stays on the tree which manages focus with aria-activedescendant
259
- if (event.target === event.currentTarget) {
260
- instance.focusRoot();
261
- }
262
260
  const canBeFocused = !disabled || disabledItemsFocusable;
263
261
  if (!focused && canBeFocused && event.currentTarget === event.target) {
264
- instance.focusItem(event, nodeId);
262
+ instance.focusItem(event, itemId);
265
263
  }
266
264
  }
267
- const idAttribute = instance.getTreeItemId(nodeId, id);
265
+ function handleBlur(event) {
266
+ onBlur?.(event);
267
+ instance.removeFocusedItem();
268
+ }
269
+ const handleKeyDown = event => {
270
+ onKeyDown?.(event);
271
+ instance.handleItemKeyDown(event, itemId);
272
+ };
273
+ const idAttribute = instance.getTreeItemId(itemId, id);
274
+ const tabIndex = instance.canItemBeTabbed(itemId) ? 0 : -1;
268
275
  return /*#__PURE__*/_jsx(TreeItem2Provider, {
269
- nodeId: nodeId,
276
+ itemId: itemId,
270
277
  children: /*#__PURE__*/_jsxs(TreeItemRoot, _extends({
271
278
  className: clsx(classes.root, className),
272
279
  role: "treeitem",
@@ -274,10 +281,12 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
274
281
  "aria-selected": ariaSelected,
275
282
  "aria-disabled": disabled || undefined,
276
283
  id: idAttribute,
277
- tabIndex: -1
284
+ tabIndex: tabIndex
278
285
  }, other, {
279
286
  ownerState: ownerState,
280
287
  onFocus: handleFocus,
288
+ onBlur: handleBlur,
289
+ onKeyDown: handleKeyDown,
281
290
  ref: handleRootRef,
282
291
  children: [/*#__PURE__*/_jsx(StyledTreeItemContent, _extends({
283
292
  as: ContentComponent,
@@ -291,7 +300,7 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
291
300
  label: classes.label
292
301
  },
293
302
  label: label,
294
- nodeId: nodeId,
303
+ itemId: itemId,
295
304
  onClick: onClick,
296
305
  onMouseDown: onMouseDown,
297
306
  icon: icon,
@@ -323,7 +332,7 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
323
332
  classes: PropTypes.object,
324
333
  className: PropTypes.string,
325
334
  /**
326
- * The component used for the content node.
335
+ * The component used to render the content of the item.
327
336
  * @default TreeItemContent
328
337
  */
329
338
  ContentComponent: elementTypeAcceptingRef,
@@ -337,13 +346,13 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
337
346
  */
338
347
  disabled: PropTypes.bool,
339
348
  /**
340
- * The tree item label.
349
+ * The id of the item.
341
350
  */
342
- label: PropTypes.node,
351
+ itemId: PropTypes.string.isRequired,
343
352
  /**
344
- * The id of the node.
353
+ * The tree item label.
345
354
  */
346
- nodeId: PropTypes.string.isRequired,
355
+ label: PropTypes.node,
347
356
  /**
348
357
  * This prop isn't supported.
349
358
  * Use the `onItemFocus` callback on the tree if you need to monitor a item's focus.
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "nodeId", "onClick", "onMouseDown"];
3
+ const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "itemId", "onClick", "onMouseDown"];
4
4
  import * as React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import clsx from 'clsx';
@@ -18,7 +18,7 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
18
18
  expansionIcon,
19
19
  icon: iconProp,
20
20
  label,
21
- nodeId,
21
+ itemId,
22
22
  onClick,
23
23
  onMouseDown
24
24
  } = props,
@@ -31,7 +31,7 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
31
31
  handleExpansion,
32
32
  handleSelection,
33
33
  preventSelection
34
- } = useTreeItemState(nodeId);
34
+ } = useTreeItemState(itemId);
35
35
  const icon = iconProp || expansionIcon || displayIcon;
36
36
  const handleMouseDown = event => {
37
37
  preventSelection(event);
@@ -75,24 +75,24 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
75
75
  classes: PropTypes.object.isRequired,
76
76
  className: PropTypes.string,
77
77
  /**
78
- * The icon to display next to the tree node's label. Either a parent or end icon.
78
+ * The icon to display next to the tree item's label. Either a parent or end icon.
79
79
  */
80
80
  displayIcon: PropTypes.node,
81
81
  /**
82
- * The icon to display next to the tree node's label. Either an expansion or collapse icon.
82
+ * The icon to display next to the tree item's label. Either an expansion or collapse icon.
83
83
  */
84
84
  expansionIcon: PropTypes.node,
85
85
  /**
86
- * The icon to display next to the tree node's label.
86
+ * The icon to display next to the tree item's label.
87
87
  */
88
88
  icon: PropTypes.node,
89
89
  /**
90
- * The tree node label.
90
+ * The id of the item.
91
91
  */
92
- label: PropTypes.node,
92
+ itemId: PropTypes.string.isRequired,
93
93
  /**
94
- * The id of the node.
94
+ * The tree item label.
95
95
  */
96
- nodeId: PropTypes.string.isRequired
96
+ label: PropTypes.node
97
97
  } : void 0;
98
98
  export { TreeItemContent };