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

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 (32) hide show
  1. package/CHANGELOG.md +135 -49
  2. package/RichTreeView/RichTreeView.js +2 -1
  3. package/SimpleTreeView/SimpleTreeView.js +2 -1
  4. package/TreeItem/TreeItem.js +24 -28
  5. package/TreeItem/TreeItem.types.d.ts +7 -11
  6. package/TreeItem/treeItemClasses.d.ts +1 -1
  7. package/TreeItem/treeItemClasses.js +1 -1
  8. package/TreeView/TreeView.js +2 -1
  9. package/hooks/useTreeViewApiRef.d.ts +2 -2
  10. package/index.js +1 -1
  11. package/internals/models/helpers.d.ts +1 -0
  12. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +1 -2
  13. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +20 -6
  14. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +29 -16
  15. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +16 -6
  16. package/modern/RichTreeView/RichTreeView.js +2 -1
  17. package/modern/SimpleTreeView/SimpleTreeView.js +2 -1
  18. package/modern/TreeItem/TreeItem.js +23 -27
  19. package/modern/TreeItem/treeItemClasses.js +1 -1
  20. package/modern/TreeView/TreeView.js +2 -1
  21. package/modern/index.js +1 -1
  22. package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +20 -6
  23. package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +29 -16
  24. package/node/RichTreeView/RichTreeView.js +2 -1
  25. package/node/SimpleTreeView/SimpleTreeView.js +2 -1
  26. package/node/TreeItem/TreeItem.js +23 -27
  27. package/node/TreeItem/treeItemClasses.js +1 -1
  28. package/node/TreeView/TreeView.js +2 -1
  29. package/node/index.js +1 -1
  30. package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +20 -6
  31. package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +28 -15
  32. package/package.json +2 -2
@@ -21,7 +21,7 @@ var _treeItemClasses = require("./treeItemClasses");
21
21
  var _useTreeViewContext = require("../internals/TreeViewProvider/useTreeViewContext");
22
22
  var _icons = require("../icons");
23
23
  var _jsxRuntime = require("react/jsx-runtime");
24
- const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "nodeId", "id", "label", "onClick", "onMouseDown", "TransitionComponent", "TransitionProps"],
24
+ const _excluded = ["children", "className", "slots", "slotProps", "ContentComponent", "ContentProps", "nodeId", "id", "label", "onClick", "onMouseDown"],
25
25
  _excluded2 = ["ownerState"],
26
26
  _excluded3 = ["ownerState"],
27
27
  _excluded4 = ["ownerState"];
@@ -40,7 +40,7 @@ const useUtilityClasses = ownerState => {
40
40
  disabled: ['disabled'],
41
41
  iconContainer: ['iconContainer'],
42
42
  label: ['label'],
43
- group: ['group']
43
+ groupTransition: ['groupTransition']
44
44
  };
45
45
  return (0, _base.unstable_composeClasses)(slots, _treeItemClasses.getTreeItemUtilityClass, classes);
46
46
  };
@@ -124,8 +124,8 @@ const StyledTreeItemContent = (0, _styles.styled)(_TreeItemContent.TreeItemConte
124
124
  }));
125
125
  const TreeItemGroup = (0, _styles.styled)(_Collapse.default, {
126
126
  name: 'MuiTreeItem',
127
- slot: 'Group',
128
- overridesResolver: (props, styles) => styles.group
127
+ slot: 'GroupTransition',
128
+ overridesResolver: (props, styles) => styles.groupTransition
129
129
  })({
130
130
  margin: 0,
131
131
  padding: 0,
@@ -175,16 +175,15 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
175
175
  id,
176
176
  label,
177
177
  onClick,
178
- onMouseDown,
179
- TransitionComponent = _Collapse.default,
180
- TransitionProps
178
+ onMouseDown
181
179
  } = props,
182
180
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
183
181
  const slots = {
184
182
  expandIcon: inSlots?.expandIcon ?? contextIcons.slots.expandIcon ?? _icons.TreeViewExpandIcon,
185
183
  collapseIcon: inSlots?.collapseIcon ?? contextIcons.slots.collapseIcon ?? _icons.TreeViewCollapseIcon,
186
184
  endIcon: inSlots?.endIcon ?? contextIcons.slots.endIcon,
187
- icon: inSlots?.icon
185
+ icon: inSlots?.icon,
186
+ groupTransition: inSlots?.groupTransition
188
187
  };
189
188
  const isExpandable = reactChildren => {
190
189
  if (Array.isArray(reactChildren)) {
@@ -204,6 +203,19 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
204
203
  disabled
205
204
  });
206
205
  const classes = useUtilityClasses(ownerState);
206
+ const GroupTransition = slots.groupTransition ?? undefined;
207
+ const groupTransitionProps = (0, _utils.useSlotProps)({
208
+ elementType: GroupTransition,
209
+ ownerState: {},
210
+ externalSlotProps: inSlotProps?.groupTransition,
211
+ additionalProps: {
212
+ unmountOnExit: true,
213
+ in: expanded,
214
+ component: 'ul',
215
+ role: 'group'
216
+ },
217
+ className: classes.groupTransition
218
+ });
207
219
  const ExpansionIcon = expanded ? slots.collapseIcon : slots.expandIcon;
208
220
  const _useSlotProps = (0, _utils.useSlotProps)({
209
221
  elementType: ExpansionIcon,
@@ -293,13 +305,8 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
293
305
  displayIcon: displayIcon,
294
306
  ownerState: ownerState
295
307
  }, ContentProps)), children && /*#__PURE__*/(0, _jsxRuntime.jsx)(TreeItemGroup, (0, _extends2.default)({
296
- as: TransitionComponent,
297
- unmountOnExit: true,
298
- className: classes.group,
299
- in: expanded,
300
- component: "ul",
301
- role: "group"
302
- }, TransitionProps, {
308
+ as: GroupTransition
309
+ }, groupTransitionProps, {
303
310
  children: children
304
311
  }))]
305
312
  }));
@@ -359,16 +366,5 @@ TreeItem.propTypes = {
359
366
  /**
360
367
  * The system prop that allows defining system overrides as well as additional CSS styles.
361
368
  */
362
- sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object]),
363
- /**
364
- * The component used for the transition.
365
- * [Follow this guide](/material-ui/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.
366
- * @default Collapse
367
- */
368
- TransitionComponent: _propTypes.default.elementType,
369
- /**
370
- * Props applied to the transition element.
371
- * By default, the element is based on this [`Transition`](https://reactcommunity.org/react-transition-group/transition/) component.
372
- */
373
- TransitionProps: _propTypes.default.object
369
+ sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object])
374
370
  };
@@ -11,4 +11,4 @@ var _generateUtilityClasses = _interopRequireDefault(require("@mui/utils/generat
11
11
  function getTreeItemUtilityClass(slot) {
12
12
  return (0, _generateUtilityClass.default)('MuiTreeItem', slot);
13
13
  }
14
- const treeItemClasses = exports.treeItemClasses = (0, _generateUtilityClasses.default)('MuiTreeItem', ['root', 'group', 'content', 'expanded', 'selected', 'focused', 'disabled', 'iconContainer', 'label']);
14
+ const treeItemClasses = exports.treeItemClasses = (0, _generateUtilityClasses.default)('MuiTreeItem', ['root', 'groupTransition', 'content', 'expanded', 'selected', 'focused', 'disabled', 'iconContainer', 'label']);
@@ -78,7 +78,8 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
78
78
  */
79
79
  apiRef: _propTypes.default.shape({
80
80
  current: _propTypes.default.shape({
81
- focusNode: _propTypes.default.func.isRequired
81
+ focusNode: _propTypes.default.func.isRequired,
82
+ getItem: _propTypes.default.func.isRequired
82
83
  })
83
84
  }),
84
85
  /**
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v7.0.0-beta.5
2
+ * @mui/x-tree-view v7.0.0-beta.6
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -22,22 +22,36 @@ const useTreeViewJSXNodes = ({
22
22
  }) => {
23
23
  const insertJSXNode = (0, _useEventCallback.default)(node => {
24
24
  setState(prevState => {
25
- if (prevState.nodeMap[node.id] != null) {
25
+ if (prevState.nodes.nodeMap[node.id] != null) {
26
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'));
27
27
  }
28
28
  return (0, _extends2.default)({}, prevState, {
29
- nodeMap: (0, _extends2.default)({}, prevState.nodeMap, {
30
- [node.id]: node
29
+ nodes: (0, _extends2.default)({}, prevState.nodes, {
30
+ nodeMap: (0, _extends2.default)({}, prevState.nodes.nodeMap, {
31
+ [node.id]: node
32
+ }),
33
+ // 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
38
+ }
39
+ })
31
40
  })
32
41
  });
33
42
  });
34
43
  });
35
44
  const removeJSXNode = (0, _useEventCallback.default)(nodeId => {
36
45
  setState(prevState => {
37
- const newMap = (0, _extends2.default)({}, prevState.nodeMap);
38
- delete newMap[nodeId];
46
+ const newNodeMap = (0, _extends2.default)({}, prevState.nodes.nodeMap);
47
+ const newItemMap = (0, _extends2.default)({}, prevState.nodes.itemMap);
48
+ delete newNodeMap[nodeId];
49
+ delete newItemMap[nodeId];
39
50
  return (0, _extends2.default)({}, prevState, {
40
- nodeMap: newMap
51
+ nodes: (0, _extends2.default)({}, prevState.nodes, {
52
+ nodeMap: newNodeMap,
53
+ itemMap: newItemMap
54
+ })
41
55
  });
42
56
  });
43
57
  (0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
@@ -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,20 +94,22 @@ 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
115
  const getNodesToRender = (0, _useEventCallback.default)(() => {
@@ -110,7 +117,7 @@ const useTreeViewNodes = ({
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);
128
+ return state.nodes.nodeTree.map(getPropsFromNodeId);
122
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
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.6",
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",