@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.
- package/CHANGELOG.md +266 -12
- package/README.md +1 -1
- package/RichTreeView/RichTreeView.js +15 -17
- package/RichTreeView/RichTreeView.types.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.js +3 -4
- package/SimpleTreeView/SimpleTreeView.plugins.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/TreeItem/TreeItem.js +43 -35
- package/TreeItem/TreeItem.types.d.ts +3 -3
- package/TreeItem/TreeItemContent.d.ts +7 -7
- package/TreeItem/TreeItemContent.js +10 -10
- package/TreeItem/treeItemClasses.d.ts +1 -1
- package/TreeItem/useTreeItemState.d.ts +1 -1
- package/TreeItem/useTreeItemState.js +13 -13
- package/TreeItem2/TreeItem2.js +16 -17
- package/TreeItem2Icon/TreeItem2Icon.js +5 -6
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +4 -4
- package/TreeItem2Provider/TreeItem2Provider.js +3 -3
- package/TreeItem2Provider/TreeItem2Provider.types.d.ts +1 -1
- package/TreeView/TreeView.d.ts +1 -1
- package/TreeView/TreeView.js +1 -1
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +2 -2
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
- package/hooks/useTreeViewApiRef.d.ts +1 -1
- package/index.js +1 -1
- package/internals/TreeViewProvider/DescendantProvider.d.ts +1 -1
- package/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/internals/hooks/useInstanceEventHandler.js +5 -10
- package/internals/index.d.ts +2 -2
- package/internals/models/plugin.d.ts +1 -1
- package/internals/plugins/defaultPlugins.d.ts +3 -3
- package/internals/plugins/defaultPlugins.js +2 -2
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +17 -24
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +6 -6
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +76 -58
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +9 -8
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +6 -6
- package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +2 -2
- package/internals/plugins/useTreeViewItems/index.d.ts +2 -0
- package/internals/plugins/useTreeViewItems/index.js +1 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.d.ts +3 -0
- package/{modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js → internals/plugins/useTreeViewItems/useTreeViewItems.js} +42 -33
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +99 -0
- package/internals/plugins/useTreeViewJSXItems/index.d.ts +2 -0
- package/internals/plugins/useTreeViewJSXItems/index.js +1 -0
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.d.ts +3 -0
- package/{modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +41 -40
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.types.d.ts +18 -0
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +85 -96
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +6 -3
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +44 -47
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +8 -8
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +7 -7
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/internals/useTreeView/useTreeView.js +5 -6
- package/internals/useTreeView/useTreeView.utils.d.ts +5 -5
- package/internals/useTreeView/useTreeView.utils.js +18 -18
- package/internals/utils/extractPluginParamsFromProps.js +2 -2
- package/internals/utils/utils.js +1 -0
- package/modern/RichTreeView/RichTreeView.js +11 -11
- package/modern/SimpleTreeView/SimpleTreeView.js +1 -1
- package/modern/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/modern/TreeItem/TreeItem.js +31 -22
- package/modern/TreeItem/TreeItemContent.js +10 -10
- package/modern/TreeItem/useTreeItemState.js +13 -13
- package/modern/TreeItem2/TreeItem2.js +11 -11
- package/modern/TreeItem2Provider/TreeItem2Provider.js +3 -3
- package/modern/TreeView/TreeView.js +1 -1
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
- package/modern/index.js +1 -1
- package/modern/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/modern/internals/plugins/defaultPlugins.js +2 -2
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +14 -14
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +74 -53
- package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/modern/internals/plugins/useTreeViewItems/index.js +1 -0
- package/{internals/plugins/useTreeViewNodes/useTreeViewNodes.js → modern/internals/plugins/useTreeViewItems/useTreeViewItems.js} +46 -41
- package/modern/internals/plugins/useTreeViewJSXItems/index.js +1 -0
- package/{internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +41 -41
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +85 -94
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +40 -40
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/modern/internals/useTreeView/useTreeView.js +3 -4
- package/modern/internals/useTreeView/useTreeView.utils.js +18 -18
- package/modern/internals/utils/utils.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +23 -12
- package/node/RichTreeView/RichTreeView.js +11 -11
- package/node/SimpleTreeView/SimpleTreeView.js +1 -1
- package/node/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/node/TreeItem/TreeItem.js +31 -22
- package/node/TreeItem/TreeItemContent.js +10 -10
- package/node/TreeItem/useTreeItemState.js +13 -13
- package/node/TreeItem2/TreeItem2.js +11 -11
- package/node/TreeItem2Provider/TreeItem2Provider.js +3 -3
- package/node/TreeView/TreeView.js +1 -1
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
- package/node/index.js +1 -1
- package/node/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/node/internals/plugins/defaultPlugins.js +2 -2
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +14 -14
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +74 -53
- package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/node/internals/plugins/useTreeViewItems/index.js +12 -0
- package/node/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +44 -35
- package/node/internals/plugins/useTreeViewJSXItems/index.js +12 -0
- package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.js → useTreeViewJSXItems/useTreeViewJSXItems.js} +43 -42
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +84 -93
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +39 -39
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/node/internals/useTreeView/useTreeView.js +3 -4
- package/node/internals/useTreeView/useTreeView.utils.js +23 -23
- package/node/internals/utils/utils.js +1 -0
- package/node/useTreeItem2/useTreeItem2.js +23 -12
- package/package.json +5 -5
- package/useTreeItem2/useTreeItem2.d.ts +1 -1
- package/useTreeItem2/useTreeItem2.js +26 -18
- package/useTreeItem2/useTreeItem2.types.d.ts +9 -7
- package/internals/plugins/useTreeViewJSXNodes/index.d.ts +0 -2
- package/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.d.ts +0 -3
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +0 -18
- package/internals/plugins/useTreeViewNodes/index.d.ts +0 -2
- package/internals/plugins/useTreeViewNodes/index.js +0 -1
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.d.ts +0 -3
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +0 -88
- package/modern/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
- package/modern/internals/plugins/useTreeViewNodes/index.js +0 -1
- package/node/internals/plugins/useTreeViewJSXNodes/index.js +0 -12
- package/node/internals/plugins/useTreeViewNodes/index.js +0 -12
- /package/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
- /package/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
- /package/modern/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
- /package/modern/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
- /package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
- /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
|
|
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
|
|
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(
|
|
56
|
-
const getItem = React.useCallback(
|
|
57
|
-
const
|
|
58
|
-
if (
|
|
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(
|
|
60
|
+
let node = instance.getNode(itemId);
|
|
62
61
|
|
|
63
|
-
// This can be called before the
|
|
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 =
|
|
79
|
-
const getNavigableChildrenIds =
|
|
80
|
-
let childrenIds = instance.getChildrenIds(
|
|
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(
|
|
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 =
|
|
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.
|
|
95
|
-
if (!newState.nodeMap[
|
|
96
|
-
publishTreeViewEvent(instance, '
|
|
97
|
-
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
|
-
|
|
109
|
+
items: newState
|
|
103
110
|
});
|
|
104
111
|
});
|
|
105
112
|
}, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
|
|
106
|
-
const
|
|
107
|
-
const
|
|
113
|
+
const getItemsToRender = () => {
|
|
114
|
+
const getPropsFromItemId = ({
|
|
108
115
|
id,
|
|
109
116
|
children
|
|
110
117
|
}) => {
|
|
111
|
-
const
|
|
118
|
+
const item = state.items.nodeMap[id];
|
|
112
119
|
return {
|
|
113
|
-
label:
|
|
114
|
-
|
|
115
|
-
id:
|
|
116
|
-
children: children?.map(
|
|
120
|
+
label: item.label,
|
|
121
|
+
itemId: item.id,
|
|
122
|
+
id: item.idAttribute,
|
|
123
|
+
children: children?.map(getPropsFromItemId)
|
|
117
124
|
};
|
|
118
125
|
};
|
|
119
|
-
return state.
|
|
126
|
+
return state.items.nodeTree.map(getPropsFromItemId);
|
|
120
127
|
};
|
|
121
128
|
populateInstance(instance, {
|
|
122
129
|
getNode,
|
|
123
130
|
getItem,
|
|
124
|
-
|
|
131
|
+
getItemsToRender,
|
|
125
132
|
getChildrenIds,
|
|
126
133
|
getNavigableChildrenIds,
|
|
127
|
-
|
|
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
|
-
|
|
139
|
-
|
|
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
|
-
|
|
155
|
+
useTreeViewItems.getDefaultizedParams = params => _extends({}, params, {
|
|
147
156
|
disabledItemsFocusable: params.disabledItemsFocusable ?? false
|
|
148
157
|
});
|
|
149
|
-
|
|
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 @@
|
|
|
1
|
+
export { useTreeViewJSXItems } from './useTreeViewJSXItems';
|
|
@@ -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
|
|
10
|
+
export const useTreeViewJSXItems = ({
|
|
11
11
|
instance,
|
|
12
12
|
setState
|
|
13
13
|
}) => {
|
|
14
|
-
|
|
14
|
+
instance.preventItemUpdates();
|
|
15
|
+
const insertJSXItem = useEventCallback(item => {
|
|
15
16
|
setState(prevState => {
|
|
16
|
-
if (prevState.
|
|
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: "${
|
|
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
|
-
|
|
21
|
-
nodeMap: _extends({}, prevState.
|
|
22
|
-
[
|
|
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.
|
|
26
|
-
[
|
|
27
|
-
id:
|
|
28
|
-
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
|
|
36
|
+
const removeJSXItem = useEventCallback(itemId => {
|
|
36
37
|
setState(prevState => {
|
|
37
|
-
const newNodeMap = _extends({}, prevState.
|
|
38
|
-
const newItemMap = _extends({}, prevState.
|
|
39
|
-
delete newNodeMap[
|
|
40
|
-
delete newItemMap[
|
|
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
|
-
|
|
43
|
+
items: _extends({}, prevState.items, {
|
|
43
44
|
nodeMap: newNodeMap,
|
|
44
45
|
itemMap: newItemMap
|
|
45
46
|
})
|
|
46
47
|
});
|
|
47
48
|
});
|
|
48
|
-
publishTreeViewEvent(instance, '
|
|
49
|
-
id:
|
|
49
|
+
publishTreeViewEvent(instance, 'removeItem', {
|
|
50
|
+
id: itemId
|
|
50
51
|
});
|
|
51
52
|
});
|
|
52
|
-
const mapFirstCharFromJSX = useEventCallback((
|
|
53
|
+
const mapFirstCharFromJSX = useEventCallback((itemId, firstChar) => {
|
|
53
54
|
instance.updateFirstCharMap(firstCharMap => {
|
|
54
|
-
firstCharMap[
|
|
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[
|
|
61
|
+
delete newMap[itemId];
|
|
61
62
|
return newMap;
|
|
62
63
|
});
|
|
63
64
|
};
|
|
64
65
|
});
|
|
65
66
|
populateInstance(instance, {
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
insertJSXItem,
|
|
68
|
+
removeJSXItem,
|
|
68
69
|
mapFirstCharFromJSX
|
|
69
70
|
});
|
|
70
71
|
};
|
|
71
|
-
const
|
|
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
|
-
|
|
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:
|
|
100
|
-
}), [
|
|
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
|
|
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.
|
|
109
|
-
id:
|
|
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.
|
|
117
|
+
return () => instance.removeJSXItem(itemId);
|
|
117
118
|
}
|
|
118
119
|
return undefined;
|
|
119
|
-
}, [instance, parentId, index,
|
|
120
|
+
}, [instance, parentId, index, itemId, expandable, disabled, id]);
|
|
120
121
|
React.useEffect(() => {
|
|
121
122
|
if (label) {
|
|
122
|
-
return instance.mapFirstCharFromJSX(
|
|
123
|
+
return instance.mapFirstCharFromJSX(itemId, (pluginContentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
|
|
123
124
|
}
|
|
124
125
|
return undefined;
|
|
125
|
-
}, [instance,
|
|
126
|
+
}, [instance, itemId, label]);
|
|
126
127
|
return {
|
|
127
128
|
contentRef: handleContentRef,
|
|
128
129
|
rootRef: handleRootRef
|
|
129
130
|
};
|
|
130
131
|
};
|
|
131
|
-
|
|
132
|
-
|
|
132
|
+
useTreeViewJSXItems.itemPlugin = useTreeViewJSXItemsItemPlugin;
|
|
133
|
+
useTreeViewJSXItems.wrapItem = ({
|
|
133
134
|
children,
|
|
134
|
-
|
|
135
|
+
itemId
|
|
135
136
|
}) => /*#__PURE__*/_jsx(DescendantProvider, {
|
|
136
|
-
id:
|
|
137
|
+
id: itemId,
|
|
137
138
|
children: children
|
|
138
139
|
});
|
|
139
|
-
|
|
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
|
+
}>;
|