@mui/x-tree-view 7.0.0-beta.7 → 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 (136) hide show
  1. package/CHANGELOG.md +266 -12
  2. package/README.md +1 -1
  3. package/RichTreeView/RichTreeView.js +15 -17
  4. package/RichTreeView/RichTreeView.types.d.ts +1 -1
  5. package/SimpleTreeView/SimpleTreeView.js +3 -4
  6. package/SimpleTreeView/SimpleTreeView.plugins.d.ts +1 -1
  7. package/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
  8. package/TreeItem/TreeItem.js +43 -35
  9. package/TreeItem/TreeItem.types.d.ts +3 -3
  10. package/TreeItem/TreeItemContent.d.ts +7 -7
  11. package/TreeItem/TreeItemContent.js +10 -10
  12. package/TreeItem/treeItemClasses.d.ts +1 -1
  13. package/TreeItem/useTreeItemState.d.ts +1 -1
  14. package/TreeItem/useTreeItemState.js +13 -13
  15. package/TreeItem2/TreeItem2.js +16 -17
  16. package/TreeItem2Icon/TreeItem2Icon.js +5 -6
  17. package/TreeItem2Icon/TreeItem2Icon.types.d.ts +4 -4
  18. package/TreeItem2Provider/TreeItem2Provider.js +3 -3
  19. package/TreeItem2Provider/TreeItem2Provider.types.d.ts +1 -1
  20. package/TreeView/TreeView.d.ts +1 -1
  21. package/TreeView/TreeView.js +1 -1
  22. package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +2 -2
  23. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
  24. package/hooks/useTreeViewApiRef.d.ts +1 -1
  25. package/index.js +1 -1
  26. package/internals/TreeViewProvider/DescendantProvider.d.ts +1 -1
  27. package/internals/TreeViewProvider/DescendantProvider.js +1 -1
  28. package/internals/hooks/useInstanceEventHandler.js +5 -10
  29. package/internals/index.d.ts +2 -2
  30. package/internals/models/plugin.d.ts +1 -1
  31. package/internals/plugins/defaultPlugins.d.ts +3 -3
  32. package/internals/plugins/defaultPlugins.js +2 -2
  33. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +17 -24
  34. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +6 -6
  35. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +76 -58
  36. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +9 -8
  37. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +6 -6
  38. package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  39. package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +2 -2
  40. package/internals/plugins/useTreeViewItems/index.d.ts +2 -0
  41. package/internals/plugins/useTreeViewItems/index.js +1 -0
  42. package/internals/plugins/useTreeViewItems/useTreeViewItems.d.ts +3 -0
  43. package/{modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js → internals/plugins/useTreeViewItems/useTreeViewItems.js} +42 -33
  44. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +99 -0
  45. package/internals/plugins/useTreeViewJSXItems/index.d.ts +2 -0
  46. package/internals/plugins/useTreeViewJSXItems/index.js +1 -0
  47. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.d.ts +3 -0
  48. package/{modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +41 -40
  49. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.types.d.ts +18 -0
  50. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +85 -96
  51. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +6 -3
  52. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +44 -47
  53. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +8 -8
  54. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +7 -7
  55. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
  56. package/internals/useTreeView/useTreeView.js +5 -6
  57. package/internals/useTreeView/useTreeView.utils.d.ts +5 -5
  58. package/internals/useTreeView/useTreeView.utils.js +18 -18
  59. package/internals/utils/extractPluginParamsFromProps.js +2 -2
  60. package/internals/utils/utils.js +1 -0
  61. package/modern/RichTreeView/RichTreeView.js +11 -11
  62. package/modern/SimpleTreeView/SimpleTreeView.js +1 -1
  63. package/modern/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
  64. package/modern/TreeItem/TreeItem.js +31 -22
  65. package/modern/TreeItem/TreeItemContent.js +10 -10
  66. package/modern/TreeItem/useTreeItemState.js +13 -13
  67. package/modern/TreeItem2/TreeItem2.js +11 -11
  68. package/modern/TreeItem2Provider/TreeItem2Provider.js +3 -3
  69. package/modern/TreeView/TreeView.js +1 -1
  70. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
  71. package/modern/index.js +1 -1
  72. package/modern/internals/TreeViewProvider/DescendantProvider.js +1 -1
  73. package/modern/internals/plugins/defaultPlugins.js +2 -2
  74. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +14 -14
  75. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +74 -53
  76. package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  77. package/modern/internals/plugins/useTreeViewItems/index.js +1 -0
  78. package/{internals/plugins/useTreeViewNodes/useTreeViewNodes.js → modern/internals/plugins/useTreeViewItems/useTreeViewItems.js} +46 -41
  79. package/modern/internals/plugins/useTreeViewJSXItems/index.js +1 -0
  80. package/{internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +41 -41
  81. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +85 -94
  82. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +40 -40
  83. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
  84. package/modern/internals/useTreeView/useTreeView.js +3 -4
  85. package/modern/internals/useTreeView/useTreeView.utils.js +18 -18
  86. package/modern/internals/utils/utils.js +1 -0
  87. package/modern/useTreeItem2/useTreeItem2.js +23 -12
  88. package/node/RichTreeView/RichTreeView.js +11 -11
  89. package/node/SimpleTreeView/SimpleTreeView.js +1 -1
  90. package/node/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
  91. package/node/TreeItem/TreeItem.js +31 -22
  92. package/node/TreeItem/TreeItemContent.js +10 -10
  93. package/node/TreeItem/useTreeItemState.js +13 -13
  94. package/node/TreeItem2/TreeItem2.js +11 -11
  95. package/node/TreeItem2Provider/TreeItem2Provider.js +3 -3
  96. package/node/TreeView/TreeView.js +1 -1
  97. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
  98. package/node/index.js +1 -1
  99. package/node/internals/TreeViewProvider/DescendantProvider.js +1 -1
  100. package/node/internals/plugins/defaultPlugins.js +2 -2
  101. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +14 -14
  102. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +74 -53
  103. package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  104. package/node/internals/plugins/useTreeViewItems/index.js +12 -0
  105. package/node/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +44 -35
  106. package/node/internals/plugins/useTreeViewJSXItems/index.js +12 -0
  107. package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.js → useTreeViewJSXItems/useTreeViewJSXItems.js} +43 -42
  108. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +84 -93
  109. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +39 -39
  110. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
  111. package/node/internals/useTreeView/useTreeView.js +3 -4
  112. package/node/internals/useTreeView/useTreeView.utils.js +23 -23
  113. package/node/internals/utils/utils.js +1 -0
  114. package/node/useTreeItem2/useTreeItem2.js +23 -12
  115. package/package.json +5 -5
  116. package/useTreeItem2/useTreeItem2.d.ts +1 -1
  117. package/useTreeItem2/useTreeItem2.js +26 -18
  118. package/useTreeItem2/useTreeItem2.types.d.ts +9 -7
  119. package/internals/plugins/useTreeViewJSXNodes/index.d.ts +0 -2
  120. package/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
  121. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.d.ts +0 -3
  122. package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +0 -18
  123. package/internals/plugins/useTreeViewNodes/index.d.ts +0 -2
  124. package/internals/plugins/useTreeViewNodes/index.js +0 -1
  125. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.d.ts +0 -3
  126. package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +0 -88
  127. package/modern/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
  128. package/modern/internals/plugins/useTreeViewNodes/index.js +0 -1
  129. package/node/internals/plugins/useTreeViewJSXNodes/index.js +0 -12
  130. package/node/internals/plugins/useTreeViewNodes/index.js +0 -12
  131. /package/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
  132. /package/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
  133. /package/modern/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
  134. /package/modern/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
  135. /package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
  136. /package/node/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
@@ -1,9 +1,8 @@
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
- const updateNodesState = ({
5
+ const updateItemsState = ({
7
6
  items,
8
7
  isItemDisabled,
9
8
  getItemLabel,
@@ -45,22 +44,22 @@ const updateNodesState = ({
45
44
  itemMap
46
45
  };
47
46
  };
48
- export const useTreeViewNodes = ({
47
+ export const useTreeViewItems = ({
49
48
  instance,
50
49
  publicAPI,
51
50
  params,
52
51
  state,
53
52
  setState
54
53
  }) => {
55
- const getNode = React.useCallback(nodeId => state.nodes.nodeMap[nodeId], [state.nodes.nodeMap]);
56
- const getItem = React.useCallback(nodeId => state.nodes.itemMap[nodeId], [state.nodes.itemMap]);
57
- const isNodeDisabled = React.useCallback(nodeId => {
58
- if (nodeId == null) {
54
+ const getNode = React.useCallback(itemId => state.items.nodeMap[itemId], [state.items.nodeMap]);
55
+ const getItem = React.useCallback(itemId => state.items.itemMap[itemId], [state.items.itemMap]);
56
+ const isItemDisabled = React.useCallback(itemId => {
57
+ if (itemId == null) {
59
58
  return false;
60
59
  }
61
- let node = instance.getNode(nodeId);
60
+ let node = instance.getNode(itemId);
62
61
 
63
- // This can be called before the node has been added to the node map.
62
+ // This can be called before the item has been added to the item map.
64
63
  if (!node) {
65
64
  return false;
66
65
  }
@@ -75,56 +74,66 @@ export const useTreeViewNodes = ({
75
74
  }
76
75
  return false;
77
76
  }, [instance]);
78
- 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));
79
- const getNavigableChildrenIds = nodeId => {
80
- let childrenIds = instance.getChildrenIds(nodeId);
77
+ 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]);
78
+ const getNavigableChildrenIds = itemId => {
79
+ let childrenIds = instance.getChildrenIds(itemId);
81
80
  if (!params.disabledItemsFocusable) {
82
- childrenIds = childrenIds.filter(node => !instance.isNodeDisabled(node));
81
+ childrenIds = childrenIds.filter(item => !instance.isItemDisabled(item));
83
82
  }
84
83
  return childrenIds;
85
84
  };
85
+ const areItemUpdatesPreventedRef = React.useRef(false);
86
+ const preventItemUpdates = React.useCallback(() => {
87
+ areItemUpdatesPreventedRef.current = true;
88
+ }, []);
89
+ const areItemUpdatesPrevented = React.useCallback(() => areItemUpdatesPreventedRef.current, []);
86
90
  React.useEffect(() => {
91
+ if (instance.areItemUpdatesPrevented()) {
92
+ return;
93
+ }
87
94
  setState(prevState => {
88
- const newState = updateNodesState({
95
+ const newState = updateItemsState({
89
96
  items: params.items,
90
97
  isItemDisabled: params.isItemDisabled,
91
98
  getItemId: params.getItemId,
92
99
  getItemLabel: params.getItemLabel
93
100
  });
94
- Object.values(prevState.nodes.nodeMap).forEach(node => {
95
- if (!newState.nodeMap[node.id]) {
96
- publishTreeViewEvent(instance, 'removeNode', {
97
- id: node.id
101
+ Object.values(prevState.items.nodeMap).forEach(item => {
102
+ if (!newState.nodeMap[item.id]) {
103
+ publishTreeViewEvent(instance, 'removeItem', {
104
+ id: item.id
98
105
  });
99
106
  }
100
107
  });
101
108
  return _extends({}, prevState, {
102
- nodes: newState
109
+ items: newState
103
110
  });
104
111
  });
105
112
  }, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
106
- const getNodesToRender = () => {
107
- const getPropsFromNodeId = ({
113
+ const getItemsToRender = () => {
114
+ const getPropsFromItemId = ({
108
115
  id,
109
116
  children
110
117
  }) => {
111
- const node = state.nodes.nodeMap[id];
118
+ const item = state.items.nodeMap[id];
112
119
  return {
113
- label: node.label,
114
- nodeId: node.id,
115
- id: node.idAttribute,
116
- children: children?.map(getPropsFromNodeId)
120
+ label: item.label,
121
+ itemId: item.id,
122
+ id: item.idAttribute,
123
+ children: children?.map(getPropsFromItemId)
117
124
  };
118
125
  };
119
- return state.nodes.nodeTree.map(getPropsFromNodeId);
126
+ return state.items.nodeTree.map(getPropsFromItemId);
120
127
  };
121
128
  populateInstance(instance, {
122
129
  getNode,
123
130
  getItem,
124
- getNodesToRender,
131
+ getItemsToRender,
125
132
  getChildrenIds,
126
133
  getNavigableChildrenIds,
127
- isNodeDisabled
134
+ isItemDisabled,
135
+ preventItemUpdates,
136
+ areItemUpdatesPrevented
128
137
  });
129
138
  populatePublicAPI(publicAPI, {
130
139
  getItem
@@ -135,18 +144,18 @@ export const useTreeViewNodes = ({
135
144
  }
136
145
  };
137
146
  };
138
- useTreeViewNodes.getInitialState = params => ({
139
- nodes: updateNodesState({
147
+ useTreeViewItems.getInitialState = params => ({
148
+ items: updateItemsState({
140
149
  items: params.items,
141
150
  isItemDisabled: params.isItemDisabled,
142
151
  getItemId: params.getItemId,
143
152
  getItemLabel: params.getItemLabel
144
153
  })
145
154
  });
146
- useTreeViewNodes.getDefaultizedParams = params => _extends({}, params, {
155
+ useTreeViewItems.getDefaultizedParams = params => _extends({}, params, {
147
156
  disabledItemsFocusable: params.disabledItemsFocusable ?? false
148
157
  });
149
- useTreeViewNodes.params = {
158
+ useTreeViewItems.params = {
150
159
  disabledItemsFocusable: true,
151
160
  items: true,
152
161
  isItemDisabled: true,
@@ -0,0 +1,99 @@
1
+ import { TreeViewNode, DefaultizedProps, TreeViewPluginSignature } from '../../models';
2
+ import { TreeViewItemId } from '../../../models';
3
+ interface TreeViewItemProps {
4
+ label: string;
5
+ itemId: string;
6
+ id: string | undefined;
7
+ children?: TreeViewItemProps[];
8
+ }
9
+ export interface UseTreeViewItemsInstance<R extends {}> {
10
+ getNode: (itemId: string) => TreeViewNode;
11
+ getItem: (itemId: string) => R;
12
+ getItemsToRender: () => TreeViewItemProps[];
13
+ getChildrenIds: (itemId: string | null) => string[];
14
+ getNavigableChildrenIds: (itemId: string | null) => string[];
15
+ isItemDisabled: (itemId: string | null) => itemId is string;
16
+ /**
17
+ * Freeze any future update to the state based on the `items` prop.
18
+ * This is useful when `useTreeViewJSXNodes` is used to avoid having conflicting sources of truth.
19
+ */
20
+ preventItemUpdates: () => void;
21
+ /**
22
+ * Check if the updates to the state based on the `items` prop are prevented.
23
+ * This is useful when `useTreeViewJSXNodes` is used to avoid having conflicting sources of truth.
24
+ * @returns {boolean} `true` if the updates to the state based on the `items` prop are prevented.
25
+ */
26
+ areItemUpdatesPrevented: () => boolean;
27
+ }
28
+ export interface UseTreeViewItemsPublicAPI<R extends {}> extends Pick<UseTreeViewItemsInstance<R>, 'getItem'> {
29
+ }
30
+ export interface UseTreeViewItemsParameters<R extends {}> {
31
+ /**
32
+ * If `true`, will allow focus on disabled items.
33
+ * @default false
34
+ */
35
+ disabledItemsFocusable?: boolean;
36
+ items: readonly R[];
37
+ /**
38
+ * Used to determine if a given item should be disabled.
39
+ * @template R
40
+ * @param {R} item The item to check.
41
+ * @returns {boolean} `true` if the item should be disabled.
42
+ */
43
+ isItemDisabled?: (item: R) => boolean;
44
+ /**
45
+ * Used to determine the string label for a given item.
46
+ *
47
+ * @template R
48
+ * @param {R} item The item to check.
49
+ * @returns {string} The label of the item.
50
+ * @default `(item) => item.label`
51
+ */
52
+ getItemLabel?: (item: R) => string;
53
+ /**
54
+ * Used to determine the string label for a given item.
55
+ *
56
+ * @template R
57
+ * @param {R} item The item to check.
58
+ * @returns {string} The id of the item.
59
+ * @default `(item) => item.id`
60
+ */
61
+ getItemId?: (item: R) => TreeViewItemId;
62
+ }
63
+ export type UseTreeViewItemsDefaultizedParameters<R extends {}> = DefaultizedProps<UseTreeViewItemsParameters<R>, 'disabledItemsFocusable'>;
64
+ interface UseTreeViewItemsEventLookup {
65
+ removeItem: {
66
+ params: {
67
+ id: string;
68
+ };
69
+ };
70
+ }
71
+ export interface TreeViewItemIdAndChildren {
72
+ id: TreeViewItemId;
73
+ children?: TreeViewItemIdAndChildren[];
74
+ }
75
+ export interface UseTreeViewItemsState<R extends {}> {
76
+ items: {
77
+ nodeTree: TreeViewItemIdAndChildren[];
78
+ nodeMap: TreeViewNodeMap;
79
+ itemMap: TreeViewItemMap<R>;
80
+ };
81
+ }
82
+ interface UseTreeViewItemsContextValue extends Pick<UseTreeViewItemsDefaultizedParameters<any>, 'disabledItemsFocusable'> {
83
+ }
84
+ export type UseTreeViewItemsSignature = TreeViewPluginSignature<{
85
+ params: UseTreeViewItemsParameters<any>;
86
+ defaultizedParams: UseTreeViewItemsDefaultizedParameters<any>;
87
+ instance: UseTreeViewItemsInstance<any>;
88
+ publicAPI: UseTreeViewItemsPublicAPI<any>;
89
+ events: UseTreeViewItemsEventLookup;
90
+ state: UseTreeViewItemsState<any>;
91
+ contextValue: UseTreeViewItemsContextValue;
92
+ }>;
93
+ export type TreeViewNodeMap = {
94
+ [itemId: string]: TreeViewNode;
95
+ };
96
+ export type TreeViewItemMap<R extends {}> = {
97
+ [itemId: string]: R;
98
+ };
99
+ export {};
@@ -0,0 +1,2 @@
1
+ export { useTreeViewJSXItems } from './useTreeViewJSXItems';
2
+ export type { UseTreeViewJSXItemsSignature, UseTreeViewItemsParameters, UseTreeViewItemsDefaultizedParameters, } from './useTreeViewJSXItems.types';
@@ -0,0 +1 @@
1
+ export { useTreeViewJSXItems } from './useTreeViewJSXItems';
@@ -0,0 +1,3 @@
1
+ import { TreeViewPlugin } from '../../models';
2
+ import { UseTreeViewJSXItemsSignature } from './useTreeViewJSXItems.types';
3
+ export declare const useTreeViewJSXItems: TreeViewPlugin<UseTreeViewJSXItemsSignature>;
@@ -7,68 +7,69 @@ import { publishTreeViewEvent } from '../../utils/publishTreeViewEvent';
7
7
  import { useTreeViewContext } from '../../TreeViewProvider/useTreeViewContext';
8
8
  import { DescendantProvider, useDescendant } from '../../TreeViewProvider/DescendantProvider';
9
9
  import { jsx as _jsx } from "react/jsx-runtime";
10
- export const useTreeViewJSXNodes = ({
10
+ export const useTreeViewJSXItems = ({
11
11
  instance,
12
12
  setState
13
13
  }) => {
14
- const insertJSXNode = useEventCallback(node => {
14
+ instance.preventItemUpdates();
15
+ const insertJSXItem = useEventCallback(item => {
15
16
  setState(prevState => {
16
- if (prevState.nodes.nodeMap[node.id] != null) {
17
- 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'));
17
+ if (prevState.items.nodeMap[item.id] != null) {
18
+ 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'));
18
19
  }
19
20
  return _extends({}, prevState, {
20
- nodes: _extends({}, prevState.nodes, {
21
- nodeMap: _extends({}, prevState.nodes.nodeMap, {
22
- [node.id]: node
21
+ items: _extends({}, prevState.items, {
22
+ nodeMap: _extends({}, prevState.items.nodeMap, {
23
+ [item.id]: item
23
24
  }),
24
25
  // For `SimpleTreeView`, we don't have a proper `item` object, so we create a very basic one.
25
- itemMap: _extends({}, prevState.nodes.itemMap, {
26
- [node.id]: {
27
- id: node.id,
28
- label: node.label
26
+ itemMap: _extends({}, prevState.items.itemMap, {
27
+ [item.id]: {
28
+ id: item.id,
29
+ label: item.label
29
30
  }
30
31
  })
31
32
  })
32
33
  });
33
34
  });
34
35
  });
35
- const removeJSXNode = useEventCallback(nodeId => {
36
+ const removeJSXItem = useEventCallback(itemId => {
36
37
  setState(prevState => {
37
- const newNodeMap = _extends({}, prevState.nodes.nodeMap);
38
- const newItemMap = _extends({}, prevState.nodes.itemMap);
39
- delete newNodeMap[nodeId];
40
- delete newItemMap[nodeId];
38
+ const newNodeMap = _extends({}, prevState.items.nodeMap);
39
+ const newItemMap = _extends({}, prevState.items.itemMap);
40
+ delete newNodeMap[itemId];
41
+ delete newItemMap[itemId];
41
42
  return _extends({}, prevState, {
42
- nodes: _extends({}, prevState.nodes, {
43
+ items: _extends({}, prevState.items, {
43
44
  nodeMap: newNodeMap,
44
45
  itemMap: newItemMap
45
46
  })
46
47
  });
47
48
  });
48
- publishTreeViewEvent(instance, 'removeNode', {
49
- id: nodeId
49
+ publishTreeViewEvent(instance, 'removeItem', {
50
+ id: itemId
50
51
  });
51
52
  });
52
- const mapFirstCharFromJSX = useEventCallback((nodeId, firstChar) => {
53
+ const mapFirstCharFromJSX = useEventCallback((itemId, firstChar) => {
53
54
  instance.updateFirstCharMap(firstCharMap => {
54
- firstCharMap[nodeId] = firstChar;
55
+ firstCharMap[itemId] = firstChar;
55
56
  return firstCharMap;
56
57
  });
57
58
  return () => {
58
59
  instance.updateFirstCharMap(firstCharMap => {
59
60
  const newMap = _extends({}, firstCharMap);
60
- delete newMap[nodeId];
61
+ delete newMap[itemId];
61
62
  return newMap;
62
63
  });
63
64
  };
64
65
  });
65
66
  populateInstance(instance, {
66
- insertJSXNode,
67
- removeJSXNode,
67
+ insertJSXItem,
68
+ removeJSXItem,
68
69
  mapFirstCharFromJSX
69
70
  });
70
71
  };
71
- const useTreeViewJSXNodesItemPlugin = ({
72
+ const useTreeViewJSXItemsItemPlugin = ({
72
73
  props,
73
74
  rootRef,
74
75
  contentRef
@@ -77,7 +78,7 @@ const useTreeViewJSXNodesItemPlugin = ({
77
78
  children,
78
79
  disabled = false,
79
80
  label,
80
- nodeId,
81
+ itemId,
81
82
  id
82
83
  } = props;
83
84
  const {
@@ -96,44 +97,44 @@ const useTreeViewJSXNodesItemPlugin = ({
96
97
  const handleContentRef = useForkRef(pluginContentRef, contentRef);
97
98
  const descendant = React.useMemo(() => ({
98
99
  element: treeItemElement,
99
- id: nodeId
100
- }), [nodeId, treeItemElement]);
100
+ id: itemId
101
+ }), [itemId, treeItemElement]);
101
102
  const {
102
103
  index,
103
104
  parentId
104
105
  } = useDescendant(descendant);
105
106
  React.useEffect(() => {
106
- // On the first render a node's index will be -1. We want to wait for the real index.
107
+ // On the first render a item's index will be -1. We want to wait for the real index.
107
108
  if (index !== -1) {
108
- instance.insertJSXNode({
109
- id: nodeId,
109
+ instance.insertJSXItem({
110
+ id: itemId,
110
111
  idAttribute: id,
111
112
  index,
112
113
  parentId,
113
114
  expandable,
114
115
  disabled
115
116
  });
116
- return () => instance.removeJSXNode(nodeId);
117
+ return () => instance.removeJSXItem(itemId);
117
118
  }
118
119
  return undefined;
119
- }, [instance, parentId, index, nodeId, expandable, disabled, id]);
120
+ }, [instance, parentId, index, itemId, expandable, disabled, id]);
120
121
  React.useEffect(() => {
121
122
  if (label) {
122
- return instance.mapFirstCharFromJSX(nodeId, (pluginContentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
123
+ return instance.mapFirstCharFromJSX(itemId, (pluginContentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
123
124
  }
124
125
  return undefined;
125
- }, [instance, nodeId, label]);
126
+ }, [instance, itemId, label]);
126
127
  return {
127
128
  contentRef: handleContentRef,
128
129
  rootRef: handleRootRef
129
130
  };
130
131
  };
131
- useTreeViewJSXNodes.itemPlugin = useTreeViewJSXNodesItemPlugin;
132
- useTreeViewJSXNodes.wrapItem = ({
132
+ useTreeViewJSXItems.itemPlugin = useTreeViewJSXItemsItemPlugin;
133
+ useTreeViewJSXItems.wrapItem = ({
133
134
  children,
134
- nodeId
135
+ itemId
135
136
  }) => /*#__PURE__*/_jsx(DescendantProvider, {
136
- id: nodeId,
137
+ id: itemId,
137
138
  children: children
138
139
  });
139
- useTreeViewJSXNodes.params = {};
140
+ useTreeViewJSXItems.params = {};
@@ -0,0 +1,18 @@
1
+ import { TreeViewNode, TreeViewPluginSignature } from '../../models';
2
+ import { UseTreeViewItemsSignature } from '../useTreeViewItems';
3
+ import { UseTreeViewKeyboardNavigationSignature } from '../useTreeViewKeyboardNavigation';
4
+ export interface UseTreeViewItemsInstance {
5
+ insertJSXItem: (item: TreeViewNode) => void;
6
+ removeJSXItem: (itemId: string) => void;
7
+ mapFirstCharFromJSX: (itemId: string, firstChar: string) => () => void;
8
+ }
9
+ export interface UseTreeViewItemsParameters {
10
+ }
11
+ export interface UseTreeViewItemsDefaultizedParameters {
12
+ }
13
+ export type UseTreeViewJSXItemsSignature = TreeViewPluginSignature<{
14
+ params: UseTreeViewItemsParameters;
15
+ defaultizedParams: UseTreeViewItemsDefaultizedParameters;
16
+ instance: UseTreeViewItemsInstance;
17
+ dependantPlugins: [UseTreeViewItemsSignature, UseTreeViewKeyboardNavigationSignature];
18
+ }>;