@mui/x-tree-view 7.0.0-beta.5 → 7.0.0-beta.7

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 (136) hide show
  1. package/CHANGELOG.md +252 -50
  2. package/RichTreeView/RichTreeView.js +23 -22
  3. package/RichTreeView/RichTreeView.types.d.ts +2 -1
  4. package/SimpleTreeView/SimpleTreeView.js +23 -22
  5. package/TreeItem/TreeItem.js +79 -79
  6. package/TreeItem/TreeItem.types.d.ts +17 -19
  7. package/TreeItem/treeItemClasses.d.ts +1 -1
  8. package/TreeItem/treeItemClasses.js +1 -1
  9. package/TreeItem/useTreeItemState.js +2 -2
  10. package/TreeItem2/TreeItem2.d.ts +18 -0
  11. package/TreeItem2/TreeItem2.js +301 -0
  12. package/TreeItem2/TreeItem2.types.d.ts +64 -0
  13. package/TreeItem2/TreeItem2.types.js +1 -0
  14. package/TreeItem2/index.d.ts +2 -0
  15. package/TreeItem2/index.js +1 -0
  16. package/TreeItem2/package.json +6 -0
  17. package/TreeItem2Icon/TreeItem2Icon.d.ts +7 -0
  18. package/TreeItem2Icon/TreeItem2Icon.js +68 -0
  19. package/TreeItem2Icon/TreeItem2Icon.types.d.ts +40 -0
  20. package/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
  21. package/TreeItem2Icon/index.d.ts +2 -0
  22. package/TreeItem2Icon/index.js +1 -0
  23. package/TreeItem2Icon/package.json +6 -0
  24. package/TreeItem2Provider/TreeItem2Provider.d.ts +7 -0
  25. package/TreeItem2Provider/TreeItem2Provider.js +24 -0
  26. package/TreeItem2Provider/TreeItem2Provider.types.d.ts +6 -0
  27. package/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
  28. package/TreeItem2Provider/index.d.ts +2 -0
  29. package/TreeItem2Provider/index.js +1 -0
  30. package/TreeItem2Provider/package.json +6 -0
  31. package/TreeView/TreeView.js +23 -22
  32. package/hooks/index.d.ts +1 -0
  33. package/hooks/index.js +2 -1
  34. package/hooks/useTreeItem2Utils/index.d.ts +1 -0
  35. package/hooks/useTreeItem2Utils/index.js +1 -0
  36. package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +15 -0
  37. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
  38. package/hooks/useTreeViewApiRef.d.ts +2 -2
  39. package/index.d.ts +5 -1
  40. package/index.js +9 -2
  41. package/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
  42. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +4 -2
  43. package/internals/hooks/useLazyRef.d.ts +1 -2
  44. package/internals/hooks/useLazyRef.js +1 -11
  45. package/internals/hooks/useOnMount.d.ts +1 -2
  46. package/internals/hooks/useOnMount.js +1 -7
  47. package/internals/hooks/useTimeout.d.ts +1 -11
  48. package/internals/hooks/useTimeout.js +1 -36
  49. package/internals/models/helpers.d.ts +1 -0
  50. package/internals/models/plugin.d.ts +19 -16
  51. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +25 -25
  52. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +11 -11
  53. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
  54. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +5 -6
  55. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +37 -23
  56. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
  57. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +31 -18
  58. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +16 -6
  59. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
  60. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +11 -11
  61. package/internals/useTreeView/useTreeView.js +27 -25
  62. package/modern/RichTreeView/RichTreeView.js +23 -22
  63. package/modern/SimpleTreeView/SimpleTreeView.js +23 -22
  64. package/modern/TreeItem/TreeItem.js +78 -78
  65. package/modern/TreeItem/treeItemClasses.js +1 -1
  66. package/modern/TreeItem/useTreeItemState.js +2 -2
  67. package/modern/TreeItem2/TreeItem2.js +300 -0
  68. package/modern/TreeItem2/TreeItem2.types.js +1 -0
  69. package/modern/TreeItem2/index.js +1 -0
  70. package/modern/TreeItem2Icon/TreeItem2Icon.js +67 -0
  71. package/modern/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
  72. package/modern/TreeItem2Icon/index.js +1 -0
  73. package/modern/TreeItem2Provider/TreeItem2Provider.js +24 -0
  74. package/modern/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
  75. package/modern/TreeItem2Provider/index.js +1 -0
  76. package/modern/TreeView/TreeView.js +23 -22
  77. package/modern/hooks/index.js +2 -1
  78. package/modern/hooks/useTreeItem2Utils/index.js +1 -0
  79. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
  80. package/modern/index.js +9 -2
  81. package/modern/internals/hooks/useLazyRef.js +1 -11
  82. package/modern/internals/hooks/useOnMount.js +1 -7
  83. package/modern/internals/hooks/useTimeout.js +1 -36
  84. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +24 -24
  85. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
  86. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +36 -22
  87. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
  88. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +31 -18
  89. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
  90. package/modern/internals/useTreeView/useTreeView.js +27 -25
  91. package/modern/useTreeItem2/index.js +1 -0
  92. package/modern/useTreeItem2/useTreeItem2.js +135 -0
  93. package/modern/useTreeItem2/useTreeItem2.types.js +1 -0
  94. package/node/RichTreeView/RichTreeView.js +23 -22
  95. package/node/SimpleTreeView/SimpleTreeView.js +23 -22
  96. package/node/TreeItem/TreeItem.js +78 -78
  97. package/node/TreeItem/treeItemClasses.js +1 -1
  98. package/node/TreeItem/useTreeItemState.js +2 -2
  99. package/node/TreeItem2/TreeItem2.js +308 -0
  100. package/node/TreeItem2/TreeItem2.types.js +5 -0
  101. package/node/TreeItem2/index.js +42 -0
  102. package/node/TreeItem2Icon/TreeItem2Icon.js +75 -0
  103. package/node/TreeItem2Icon/TreeItem2Icon.types.js +5 -0
  104. package/node/TreeItem2Icon/index.js +12 -0
  105. package/node/TreeItem2Provider/TreeItem2Provider.js +30 -0
  106. package/node/TreeItem2Provider/TreeItem2Provider.types.js +5 -0
  107. package/node/TreeItem2Provider/index.js +12 -0
  108. package/node/TreeView/TreeView.js +23 -22
  109. package/node/hooks/index.js +8 -1
  110. package/node/hooks/useTreeItem2Utils/index.js +12 -0
  111. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +68 -0
  112. package/node/index.js +61 -13
  113. package/node/internals/hooks/useLazyRef.js +7 -13
  114. package/node/internals/hooks/useOnMount.js +8 -10
  115. package/node/internals/hooks/useTimeout.js +7 -37
  116. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +24 -24
  117. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
  118. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +36 -22
  119. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
  120. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +30 -17
  121. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
  122. package/node/internals/useTreeView/useTreeView.js +27 -25
  123. package/node/useTreeItem2/index.js +12 -0
  124. package/node/useTreeItem2/useTreeItem2.js +143 -0
  125. package/node/useTreeItem2/useTreeItem2.types.js +5 -0
  126. package/package.json +2 -2
  127. package/themeAugmentation/components.d.ts +5 -0
  128. package/themeAugmentation/overrides.d.ts +1 -0
  129. package/themeAugmentation/props.d.ts +2 -0
  130. package/useTreeItem2/index.d.ts +2 -0
  131. package/useTreeItem2/index.js +1 -0
  132. package/useTreeItem2/package.json +6 -0
  133. package/useTreeItem2/useTreeItem2.d.ts +2 -0
  134. package/useTreeItem2/useTreeItem2.js +138 -0
  135. package/useTreeItem2/useTreeItem2.types.d.ts +113 -0
  136. package/useTreeItem2/useTreeItem2.types.js +1 -0
@@ -12,13 +12,14 @@ var _useTreeView = require("../../useTreeView/useTreeView.utils");
12
12
  var _publishTreeViewEvent = require("../../utils/publishTreeViewEvent");
13
13
  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); }
14
14
  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; }
15
- const updateState = ({
15
+ const updateNodesState = ({
16
16
  items,
17
17
  isItemDisabled,
18
18
  getItemLabel,
19
19
  getItemId
20
20
  }) => {
21
21
  const nodeMap = {};
22
+ const itemMap = {};
22
23
  const processItem = (item, index, parentId) => {
23
24
  const id = getItemId ? getItemId(item) : item.id;
24
25
  if (id == null) {
@@ -36,10 +37,11 @@ const updateState = ({
36
37
  label,
37
38
  index,
38
39
  parentId,
39
- idAttribute: id,
40
+ idAttribute: undefined,
40
41
  expandable: !!item.children?.length,
41
42
  disabled: isItemDisabled ? isItemDisabled(item) : false
42
43
  };
44
+ itemMap[id] = item;
43
45
  return {
44
46
  id,
45
47
  children: item.children?.map((child, childIndex) => processItem(child, childIndex, id))
@@ -48,16 +50,19 @@ const updateState = ({
48
50
  const nodeTree = items.map((item, itemIndex) => processItem(item, itemIndex, null));
49
51
  return {
50
52
  nodeMap,
51
- nodeTree
53
+ nodeTree,
54
+ itemMap
52
55
  };
53
56
  };
54
57
  const useTreeViewNodes = ({
55
58
  instance,
59
+ publicAPI,
56
60
  params,
57
61
  state,
58
62
  setState
59
63
  }) => {
60
- const getNode = React.useCallback(nodeId => state.nodeMap[nodeId], [state.nodeMap]);
64
+ const getNode = React.useCallback(nodeId => state.nodes.nodeMap[nodeId], [state.nodes.nodeMap]);
65
+ const getItem = React.useCallback(nodeId => state.nodes.itemMap[nodeId], [state.nodes.itemMap]);
61
66
  const isNodeDisabled = React.useCallback(nodeId => {
62
67
  if (nodeId == null) {
63
68
  return false;
@@ -79,7 +84,7 @@ const useTreeViewNodes = ({
79
84
  }
80
85
  return false;
81
86
  }, [instance]);
82
- const getChildrenIds = (0, _useEventCallback.default)(nodeId => Object.values(state.nodeMap).filter(node => node.parentId === nodeId).sort((a, b) => a.index - b.index).map(child => child.id));
87
+ const getChildrenIds = (0, _useEventCallback.default)(nodeId => Object.values(state.nodes.nodeMap).filter(node => node.parentId === nodeId).sort((a, b) => a.index - b.index).map(child => child.id));
83
88
  const getNavigableChildrenIds = nodeId => {
84
89
  let childrenIds = instance.getChildrenIds(nodeId);
85
90
  if (!params.disabledItemsFocusable) {
@@ -89,28 +94,30 @@ const useTreeViewNodes = ({
89
94
  };
90
95
  React.useEffect(() => {
91
96
  setState(prevState => {
92
- const newState = updateState({
97
+ const newState = updateNodesState({
93
98
  items: params.items,
94
99
  isItemDisabled: params.isItemDisabled,
95
100
  getItemId: params.getItemId,
96
101
  getItemLabel: params.getItemLabel
97
102
  });
98
- Object.values(prevState.nodeMap).forEach(node => {
103
+ Object.values(prevState.nodes.nodeMap).forEach(node => {
99
104
  if (!newState.nodeMap[node.id]) {
100
105
  (0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
101
106
  id: node.id
102
107
  });
103
108
  }
104
109
  });
105
- return (0, _extends2.default)({}, prevState, newState);
110
+ return (0, _extends2.default)({}, prevState, {
111
+ nodes: newState
112
+ });
106
113
  });
107
114
  }, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
108
- const getNodesToRender = (0, _useEventCallback.default)(() => {
115
+ const getNodesToRender = () => {
109
116
  const getPropsFromNodeId = ({
110
117
  id,
111
118
  children
112
119
  }) => {
113
- const node = state.nodeMap[id];
120
+ const node = state.nodes.nodeMap[id];
114
121
  return {
115
122
  label: node.label,
116
123
  nodeId: node.id,
@@ -118,15 +125,19 @@ const useTreeViewNodes = ({
118
125
  children: children?.map(getPropsFromNodeId)
119
126
  };
120
127
  };
121
- return state.nodeTree.map(getPropsFromNodeId);
122
- });
128
+ return state.nodes.nodeTree.map(getPropsFromNodeId);
129
+ };
123
130
  (0, _useTreeView.populateInstance)(instance, {
124
131
  getNode,
132
+ getItem,
125
133
  getNodesToRender,
126
134
  getChildrenIds,
127
135
  getNavigableChildrenIds,
128
136
  isNodeDisabled
129
137
  });
138
+ (0, _useTreeView.populatePublicAPI)(publicAPI, {
139
+ getItem
140
+ });
130
141
  return {
131
142
  contextValue: {
132
143
  disabledItemsFocusable: params.disabledItemsFocusable
@@ -134,11 +145,13 @@ const useTreeViewNodes = ({
134
145
  };
135
146
  };
136
147
  exports.useTreeViewNodes = useTreeViewNodes;
137
- useTreeViewNodes.getInitialState = params => updateState({
138
- items: params.items,
139
- isItemDisabled: params.isItemDisabled,
140
- getItemId: params.getItemId,
141
- getItemLabel: params.getItemLabel
148
+ useTreeViewNodes.getInitialState = params => ({
149
+ nodes: updateNodesState({
150
+ items: params.items,
151
+ isItemDisabled: params.isItemDisabled,
152
+ getItemId: params.getItemId,
153
+ getItemLabel: params.getItemLabel
154
+ })
142
155
  });
143
156
  useTreeViewNodes.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
144
157
  disabledItemsFocusable: params.disabledItemsFocusable ?? false
@@ -19,49 +19,49 @@ const useTreeViewSelection = ({
19
19
  const lastSelectedNode = React.useRef(null);
20
20
  const lastSelectionWasRange = React.useRef(false);
21
21
  const currentRangeSelection = React.useRef([]);
22
- const setSelectedNodes = (event, newSelectedNodes) => {
23
- if (params.onNodeSelectionToggle) {
22
+ const setSelectedItems = (event, newSelectedItems) => {
23
+ if (params.onItemSelectionToggle) {
24
24
  if (params.multiSelect) {
25
- const addedNodes = newSelectedNodes.filter(nodeId => !instance.isNodeSelected(nodeId));
26
- const removedNodes = models.selectedNodes.value.filter(nodeId => !newSelectedNodes.includes(nodeId));
27
- addedNodes.forEach(nodeId => {
28
- params.onNodeSelectionToggle(event, nodeId, true);
25
+ const addedItems = newSelectedItems.filter(itemId => !instance.isNodeSelected(itemId));
26
+ const removedItems = models.selectedItems.value.filter(itemId => !newSelectedItems.includes(itemId));
27
+ addedItems.forEach(itemId => {
28
+ params.onItemSelectionToggle(event, itemId, true);
29
29
  });
30
- removedNodes.forEach(nodeId => {
31
- params.onNodeSelectionToggle(event, nodeId, false);
30
+ removedItems.forEach(itemId => {
31
+ params.onItemSelectionToggle(event, itemId, false);
32
32
  });
33
- } else if (newSelectedNodes !== models.selectedNodes.value) {
34
- if (models.selectedNodes.value != null) {
35
- params.onNodeSelectionToggle(event, models.selectedNodes.value, false);
33
+ } else if (newSelectedItems !== models.selectedItems.value) {
34
+ if (models.selectedItems.value != null) {
35
+ params.onItemSelectionToggle(event, models.selectedItems.value, false);
36
36
  }
37
- if (newSelectedNodes != null) {
38
- params.onNodeSelectionToggle(event, newSelectedNodes, true);
37
+ if (newSelectedItems != null) {
38
+ params.onItemSelectionToggle(event, newSelectedItems, true);
39
39
  }
40
40
  }
41
41
  }
42
- if (params.onSelectedNodesChange) {
43
- params.onSelectedNodesChange(event, newSelectedNodes);
42
+ if (params.onSelectedItemsChange) {
43
+ params.onSelectedItemsChange(event, newSelectedItems);
44
44
  }
45
- models.selectedNodes.setControlledValue(newSelectedNodes);
45
+ models.selectedItems.setControlledValue(newSelectedItems);
46
46
  };
47
- const isNodeSelected = nodeId => Array.isArray(models.selectedNodes.value) ? models.selectedNodes.value.indexOf(nodeId) !== -1 : models.selectedNodes.value === nodeId;
47
+ const isNodeSelected = nodeId => Array.isArray(models.selectedItems.value) ? models.selectedItems.value.indexOf(nodeId) !== -1 : models.selectedItems.value === nodeId;
48
48
  const selectNode = (event, nodeId, multiple = false) => {
49
49
  if (params.disableSelection) {
50
50
  return;
51
51
  }
52
52
  if (multiple) {
53
- if (Array.isArray(models.selectedNodes.value)) {
53
+ if (Array.isArray(models.selectedItems.value)) {
54
54
  let newSelected;
55
- if (models.selectedNodes.value.indexOf(nodeId) !== -1) {
56
- newSelected = models.selectedNodes.value.filter(id => id !== nodeId);
55
+ if (models.selectedItems.value.indexOf(nodeId) !== -1) {
56
+ newSelected = models.selectedItems.value.filter(id => id !== nodeId);
57
57
  } else {
58
- newSelected = [nodeId].concat(models.selectedNodes.value);
58
+ newSelected = [nodeId].concat(models.selectedItems.value);
59
59
  }
60
- setSelectedNodes(event, newSelected);
60
+ setSelectedItems(event, newSelected);
61
61
  }
62
62
  } else {
63
63
  const newSelected = params.multiSelect ? [nodeId] : nodeId;
64
- setSelectedNodes(event, newSelected);
64
+ setSelectedItems(event, newSelected);
65
65
  }
66
66
  lastSelectedNode.current = nodeId;
67
67
  lastSelectionWasRange.current = false;
@@ -78,7 +78,7 @@ const useTreeViewSelection = ({
78
78
  return nodes;
79
79
  };
80
80
  const handleRangeArrowSelect = (event, nodes) => {
81
- let base = models.selectedNodes.value.slice();
81
+ let base = models.selectedItems.value.slice();
82
82
  const {
83
83
  start,
84
84
  next,
@@ -102,10 +102,10 @@ const useTreeViewSelection = ({
102
102
  base.push(next);
103
103
  currentRangeSelection.current.push(current, next);
104
104
  }
105
- setSelectedNodes(event, base);
105
+ setSelectedItems(event, base);
106
106
  };
107
107
  const handleRangeSelect = (event, nodes) => {
108
- let base = models.selectedNodes.value.slice();
108
+ let base = models.selectedItems.value.slice();
109
109
  const {
110
110
  start,
111
111
  end
@@ -119,7 +119,7 @@ const useTreeViewSelection = ({
119
119
  currentRangeSelection.current = range;
120
120
  let newSelected = base.concat(range);
121
121
  newSelected = newSelected.filter((id, i) => newSelected.indexOf(id) === i);
122
- setSelectedNodes(event, newSelected);
122
+ setSelectedItems(event, newSelected);
123
123
  };
124
124
  const selectRange = (event, nodes, stacked = false) => {
125
125
  if (params.disableSelection) {
@@ -184,21 +184,21 @@ const useTreeViewSelection = ({
184
184
  };
185
185
  exports.useTreeViewSelection = useTreeViewSelection;
186
186
  useTreeViewSelection.models = {
187
- selectedNodes: {
188
- getDefaultValue: params => params.defaultSelectedNodes
187
+ selectedItems: {
188
+ getDefaultValue: params => params.defaultSelectedItems
189
189
  }
190
190
  };
191
191
  const DEFAULT_SELECTED_NODES = [];
192
192
  useTreeViewSelection.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
193
193
  disableSelection: params.disableSelection ?? false,
194
194
  multiSelect: params.multiSelect ?? false,
195
- defaultSelectedNodes: params.defaultSelectedNodes ?? (params.multiSelect ? DEFAULT_SELECTED_NODES : null)
195
+ defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ? DEFAULT_SELECTED_NODES : null)
196
196
  });
197
197
  useTreeViewSelection.params = {
198
198
  disableSelection: true,
199
199
  multiSelect: true,
200
- defaultSelectedNodes: true,
201
- selectedNodes: true,
202
- onSelectedNodesChange: true,
203
- onNodeSelectionToggle: true
200
+ defaultSelectedItems: true,
201
+ selectedItems: true,
202
+ onSelectedItemsChange: true,
203
+ onItemSelectionToggle: true
204
204
  };
@@ -48,6 +48,7 @@ const useTreeView = inParams => {
48
48
  });
49
49
  const rootPropsGetters = [];
50
50
  const contextValue = {
51
+ publicAPI,
51
52
  instance: instance
52
53
  };
53
54
  const runPlugin = plugin => {
@@ -70,43 +71,44 @@ const useTreeView = inParams => {
70
71
  }
71
72
  };
72
73
  plugins.forEach(runPlugin);
73
- contextValue.runItemPlugins = ({
74
- props,
75
- ref
76
- }) => {
77
- let finalProps = props;
78
- let finalRef = ref;
79
- const itemWrappers = [];
74
+ contextValue.runItemPlugins = itemPluginProps => {
75
+ let finalRootRef = null;
76
+ let finalContentRef = null;
80
77
  plugins.forEach(plugin => {
81
78
  if (!plugin.itemPlugin) {
82
79
  return;
83
80
  }
84
81
  const itemPluginResponse = plugin.itemPlugin({
85
- props: finalProps,
86
- ref: finalRef
82
+ props: itemPluginProps,
83
+ rootRef: finalRootRef,
84
+ contentRef: finalContentRef
87
85
  });
88
- if (itemPluginResponse?.props) {
89
- finalProps = itemPluginResponse.props;
90
- }
91
- if (itemPluginResponse?.ref) {
92
- finalRef = itemPluginResponse.ref;
86
+ if (itemPluginResponse?.rootRef) {
87
+ finalRootRef = itemPluginResponse.rootRef;
93
88
  }
94
- if (itemPluginResponse?.wrapItem) {
95
- itemWrappers.push(itemPluginResponse.wrapItem);
89
+ if (itemPluginResponse?.contentRef) {
90
+ finalContentRef = itemPluginResponse.contentRef;
96
91
  }
97
92
  });
98
93
  return {
99
- props: finalProps,
100
- ref: finalRef,
101
- wrapItem: children => {
102
- let finalChildren = children;
103
- itemWrappers.forEach(itemWrapper => {
104
- finalChildren = itemWrapper(finalChildren);
105
- });
106
- return finalChildren;
107
- }
94
+ contentRef: finalContentRef,
95
+ rootRef: finalRootRef
108
96
  };
109
97
  };
98
+ const itemWrappers = plugins.map(plugin => plugin.wrapItem).filter(wrapItem => !!wrapItem);
99
+ contextValue.wrapItem = ({
100
+ nodeId,
101
+ children
102
+ }) => {
103
+ let finalChildren = children;
104
+ itemWrappers.forEach(itemWrapper => {
105
+ finalChildren = itemWrapper({
106
+ nodeId,
107
+ children: finalChildren
108
+ });
109
+ });
110
+ return finalChildren;
111
+ };
110
112
  const getRootProps = (otherHandlers = {}) => {
111
113
  const rootProps = (0, _extends2.default)({
112
114
  role: 'tree',
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "unstable_useTreeItem2", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _useTreeItem.useTreeItem2;
10
+ }
11
+ });
12
+ var _useTreeItem = require("./useTreeItem2");
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useTreeItem2 = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _utils = require("@mui/base/utils");
10
+ var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
11
+ var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewContext");
12
+ var _useTreeItem2Utils = require("../hooks/useTreeItem2Utils");
13
+ const useTreeItem2 = parameters => {
14
+ const {
15
+ runItemPlugins,
16
+ selection: {
17
+ multiSelect
18
+ },
19
+ disabledItemsFocusable,
20
+ instance,
21
+ publicAPI
22
+ } = (0, _useTreeViewContext.useTreeViewContext)();
23
+ const {
24
+ id,
25
+ nodeId,
26
+ label,
27
+ children,
28
+ rootRef
29
+ } = parameters;
30
+ const {
31
+ rootRef: pluginRootRef,
32
+ contentRef
33
+ } = runItemPlugins(parameters);
34
+ const {
35
+ interactions,
36
+ status
37
+ } = (0, _useTreeItem2Utils.useTreeItem2Utils)({
38
+ nodeId,
39
+ children
40
+ });
41
+ const idAttribute = instance.getTreeItemId(nodeId, id);
42
+ const handleRootRef = (0, _useForkRef.default)(rootRef, pluginRootRef);
43
+ const createRootHandleFocus = otherHandlers => event => {
44
+ otherHandlers.onFocus?.(event);
45
+ if (event.defaultMuiPrevented) {
46
+ return;
47
+ }
48
+
49
+ // DOM focus stays on the tree which manages focus with aria-activedescendant
50
+ if (event.target === event.currentTarget) {
51
+ instance.focusRoot();
52
+ }
53
+ const canBeFocused = !status.disabled || disabledItemsFocusable;
54
+ if (!status.focused && canBeFocused && event.currentTarget === event.target) {
55
+ instance.focusItem(event, nodeId);
56
+ }
57
+ };
58
+ const createContentHandleClick = otherHandlers => event => {
59
+ otherHandlers.onClick?.(event);
60
+ if (event.defaultMuiPrevented) {
61
+ return;
62
+ }
63
+ interactions.handleExpansion(event);
64
+ interactions.handleSelection(event);
65
+ };
66
+ const createContentHandleMouseDown = otherHandlers => event => {
67
+ otherHandlers.onMouseDown?.(event);
68
+ if (event.defaultMuiPrevented) {
69
+ return;
70
+ }
71
+
72
+ // Prevent text selection
73
+ if (event.shiftKey || event.ctrlKey || event.metaKey || status.disabled) {
74
+ event.preventDefault();
75
+ }
76
+ };
77
+ const getRootProps = (externalProps = {}) => {
78
+ const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
79
+ let ariaSelected;
80
+ if (multiSelect) {
81
+ ariaSelected = status.selected;
82
+ } else if (status.selected) {
83
+ /* single-selection trees unset aria-selected on un-selected items.
84
+ *
85
+ * If the tree does not support multiple selection, aria-selected
86
+ * is set to true for the selected node and it is not present on any other node in the tree.
87
+ * Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
88
+ */
89
+ ariaSelected = true;
90
+ }
91
+ return (0, _extends2.default)({}, externalEventHandlers, {
92
+ ref: handleRootRef,
93
+ role: 'treeitem',
94
+ tabIndex: -1,
95
+ id: idAttribute,
96
+ 'aria-expanded': status.expandable ? status.expanded : undefined,
97
+ 'aria-selected': ariaSelected,
98
+ 'aria-disabled': status.disabled || undefined
99
+ }, externalProps, {
100
+ onFocus: createRootHandleFocus(externalEventHandlers)
101
+ });
102
+ };
103
+ const getContentProps = (externalProps = {}) => {
104
+ const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
105
+ return (0, _extends2.default)({}, externalEventHandlers, externalProps, {
106
+ ref: contentRef,
107
+ onClick: createContentHandleClick(externalEventHandlers),
108
+ onMouseDown: createContentHandleMouseDown(externalEventHandlers),
109
+ status
110
+ });
111
+ };
112
+ const getLabelProps = (externalProps = {}) => {
113
+ const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
114
+ return (0, _extends2.default)({}, externalEventHandlers, {
115
+ children: label
116
+ }, externalProps);
117
+ };
118
+ const getIconContainerProps = (externalProps = {}) => {
119
+ const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
120
+ return (0, _extends2.default)({}, externalEventHandlers, externalProps);
121
+ };
122
+ const getGroupTransitionProps = (externalProps = {}) => {
123
+ const externalEventHandlers = (0, _extends2.default)({}, (0, _utils.extractEventHandlers)(parameters), (0, _utils.extractEventHandlers)(externalProps));
124
+ return (0, _extends2.default)({}, externalEventHandlers, {
125
+ unmountOnExit: true,
126
+ component: 'ul',
127
+ role: 'group',
128
+ in: status.expanded,
129
+ children
130
+ }, externalProps);
131
+ };
132
+ return {
133
+ getRootProps,
134
+ getContentProps,
135
+ getGroupTransitionProps,
136
+ getIconContainerProps,
137
+ getLabelProps,
138
+ rootRef: handleRootRef,
139
+ status,
140
+ publicAPI
141
+ };
142
+ };
143
+ exports.useTreeItem2 = useTreeItem2;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-tree-view",
3
- "version": "7.0.0-beta.5",
3
+ "version": "7.0.0-beta.7",
4
4
  "description": "The community edition of the tree view components (MUI X).",
5
5
  "author": "MUI Team",
6
6
  "main": "./node/index.js",
@@ -32,7 +32,7 @@
32
32
  "directory": "packages/x-tree-view"
33
33
  },
34
34
  "dependencies": {
35
- "@babel/runtime": "^7.23.9",
35
+ "@babel/runtime": "^7.24.0",
36
36
  "@mui/base": "^5.0.0-beta.36",
37
37
  "@mui/system": "^5.15.9",
38
38
  "@mui/utils": "^5.15.9",
@@ -21,6 +21,11 @@ export interface TreeViewComponents<Theme = unknown> {
21
21
  styleOverrides?: ComponentsOverrides<Theme>['MuiTreeItem'];
22
22
  variants?: ComponentsVariants<Theme>['MuiTreeItem'];
23
23
  };
24
+ MuiTreeItem2?: {
25
+ defaultProps?: ComponentsProps['MuiTreeItem2'];
26
+ styleOverrides?: ComponentsOverrides<Theme>['MuiTreeItem2'];
27
+ variants?: ComponentsVariants<Theme>['MuiTreeItem2'];
28
+ };
24
29
  }
25
30
 
26
31
  declare module '@mui/material/styles' {
@@ -9,6 +9,7 @@ export interface TreeViewComponentNameToClassKey {
9
9
  MuiRichTreeView: RichTreeViewClassKey;
10
10
  MuiTreeView: TreeViewClassKey;
11
11
  MuiTreeItem: TreeItemClassKey;
12
+ MuiTreeItem2: TreeItemClassKey;
12
13
  }
13
14
 
14
15
  declare module '@mui/material/styles' {
@@ -2,12 +2,14 @@ import { TreeItemProps } from '../TreeItem';
2
2
  import { TreeViewProps } from '../TreeView';
3
3
  import { SimpleTreeViewProps } from '../SimpleTreeView';
4
4
  import { RichTreeViewProps } from '../RichTreeView';
5
+ import { TreeItem2Props } from '../TreeItem2';
5
6
 
6
7
  export interface TreeViewComponentsPropsList {
7
8
  MuiSimpleTreeView: SimpleTreeViewProps<any>;
8
9
  MuiRichTreeView: RichTreeViewProps<any, any>;
9
10
  MuiTreeView: TreeViewProps<any>;
10
11
  MuiTreeItem: TreeItemProps;
12
+ MuiTreeItem2: TreeItem2Props;
11
13
  }
12
14
 
13
15
  declare module '@mui/material/styles' {
@@ -0,0 +1,2 @@
1
+ export { useTreeItem2 as unstable_useTreeItem2 } from './useTreeItem2';
2
+ export type { UseTreeItem2Parameters, UseTreeItem2ReturnValue, UseTreeItem2Status, UseTreeItem2ContentSlotOwnProps, } from './useTreeItem2.types';
@@ -0,0 +1 @@
1
+ export { useTreeItem2 as unstable_useTreeItem2 } from './useTreeItem2';
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/useTreeItem2/index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -0,0 +1,2 @@
1
+ import { UseTreeItem2Parameters, UseTreeItem2ReturnValue } from './useTreeItem2.types';
2
+ export declare const useTreeItem2: <TPlugins extends [import("../internals").UseTreeViewIdSignature, import("../internals").UseTreeViewNodesSignature, import("../internals").UseTreeViewExpansionSignature, import("../internals").UseTreeViewSelectionSignature, import("../internals").UseTreeViewFocusSignature, import("../internals").UseTreeViewKeyboardNavigationSignature, import("../internals").UseTreeViewIconsSignature] = [import("../internals").UseTreeViewIdSignature, import("../internals").UseTreeViewNodesSignature, import("../internals").UseTreeViewExpansionSignature, import("../internals").UseTreeViewSelectionSignature, import("../internals").UseTreeViewFocusSignature, import("../internals").UseTreeViewKeyboardNavigationSignature, import("../internals").UseTreeViewIconsSignature]>(parameters: UseTreeItem2Parameters) => UseTreeItem2ReturnValue<TPlugins>;