@mui/x-tree-view 7.0.0 → 7.1.1
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 +246 -4
- package/README.md +1 -1
- package/RichTreeView/RichTreeView.d.ts +2 -2
- package/RichTreeView/RichTreeView.js +11 -9
- package/SimpleTreeView/SimpleTreeView.js +4 -2
- package/SimpleTreeView/SimpleTreeView.plugins.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/TreeItem/TreeItem.js +4 -4
- package/TreeItem/treeItemClasses.d.ts +1 -1
- package/TreeItem/useTreeItemState.js +9 -9
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +4 -4
- package/TreeView/TreeView.js +2 -1
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +8 -8
- 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/index.d.ts +18 -8
- package/internals/index.js +11 -0
- 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 +32 -18
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +16 -6
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +35 -33
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +17 -9
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +6 -6
- package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
- 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/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +43 -33
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +104 -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} +26 -25
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.types.d.ts +18 -0
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +40 -44
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +2 -2
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +6 -6
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +7 -7
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/internals/useTreeView/useTreeView.utils.d.ts +5 -5
- package/internals/useTreeView/useTreeView.utils.js +15 -15
- package/internals/useTreeView/useTreeViewModels.js +2 -2
- package/modern/RichTreeView/RichTreeView.js +11 -9
- package/modern/SimpleTreeView/SimpleTreeView.js +4 -2
- package/modern/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/modern/TreeItem/TreeItem.js +4 -4
- package/modern/TreeItem/useTreeItemState.js +9 -9
- package/modern/TreeView/TreeView.js +2 -1
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +8 -8
- package/modern/index.js +1 -1
- package/modern/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/modern/internals/index.js +11 -0
- package/modern/internals/plugins/defaultPlugins.js +2 -2
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +32 -18
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +35 -33
- package/modern/internals/plugins/useTreeViewItems/index.js +1 -0
- package/modern/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +43 -33
- package/modern/internals/plugins/useTreeViewJSXItems/index.js +1 -0
- package/{internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +26 -25
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +40 -44
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/modern/internals/useTreeView/useTreeView.utils.js +15 -15
- package/modern/internals/useTreeView/useTreeViewModels.js +2 -2
- package/node/RichTreeView/RichTreeView.js +11 -9
- package/node/SimpleTreeView/SimpleTreeView.js +4 -2
- package/node/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/node/TreeItem/TreeItem.js +4 -4
- package/node/TreeItem/useTreeItemState.js +9 -9
- package/node/TreeView/TreeView.js +2 -1
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +8 -8
- package/node/index.js +1 -1
- package/node/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/node/internals/index.js +70 -0
- package/node/internals/plugins/defaultPlugins.js +2 -2
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +31 -17
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +35 -33
- package/node/internals/plugins/useTreeViewItems/index.js +12 -0
- package/node/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +45 -35
- package/node/internals/plugins/useTreeViewJSXItems/index.js +12 -0
- package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.js → useTreeViewJSXItems/useTreeViewJSXItems.js} +28 -27
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +39 -43
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +33 -33
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/node/internals/useTreeView/useTreeView.utils.js +20 -20
- package/node/internals/useTreeView/useTreeViewModels.js +2 -2
- package/package.json +2 -2
- package/useTreeItem2/useTreeItem2.d.ts +1 -1
- 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,19 +1,19 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import { populateInstance,
|
|
3
|
+
import { populateInstance, getNextItem, getFirstItem, getLastItem } from '../../useTreeView/useTreeView.utils';
|
|
4
4
|
import { findOrderInTremauxTree } from './useTreeViewSelection.utils';
|
|
5
5
|
export const useTreeViewSelection = ({
|
|
6
6
|
instance,
|
|
7
7
|
params,
|
|
8
8
|
models
|
|
9
9
|
}) => {
|
|
10
|
-
const
|
|
10
|
+
const lastSelectedItem = React.useRef(null);
|
|
11
11
|
const lastSelectionWasRange = React.useRef(false);
|
|
12
12
|
const currentRangeSelection = React.useRef([]);
|
|
13
13
|
const setSelectedItems = (event, newSelectedItems) => {
|
|
14
14
|
if (params.onItemSelectionToggle) {
|
|
15
15
|
if (params.multiSelect) {
|
|
16
|
-
const addedItems = newSelectedItems.filter(itemId => !instance.
|
|
16
|
+
const addedItems = newSelectedItems.filter(itemId => !instance.isItemSelected(itemId));
|
|
17
17
|
const removedItems = models.selectedItems.value.filter(itemId => !newSelectedItems.includes(itemId));
|
|
18
18
|
addedItems.forEach(itemId => {
|
|
19
19
|
params.onItemSelectionToggle(event, itemId, true);
|
|
@@ -35,8 +35,8 @@ export const useTreeViewSelection = ({
|
|
|
35
35
|
}
|
|
36
36
|
models.selectedItems.setControlledValue(newSelectedItems);
|
|
37
37
|
};
|
|
38
|
-
const
|
|
39
|
-
const
|
|
38
|
+
const isItemSelected = itemId => Array.isArray(models.selectedItems.value) ? models.selectedItems.value.indexOf(itemId) !== -1 : models.selectedItems.value === itemId;
|
|
39
|
+
const selectItem = (event, itemId, multiple = false) => {
|
|
40
40
|
if (params.disableSelection) {
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
@@ -54,27 +54,27 @@ export const useTreeViewSelection = ({
|
|
|
54
54
|
const newSelected = params.multiSelect ? [itemId] : itemId;
|
|
55
55
|
setSelectedItems(event, newSelected);
|
|
56
56
|
}
|
|
57
|
-
|
|
57
|
+
lastSelectedItem.current = itemId;
|
|
58
58
|
lastSelectionWasRange.current = false;
|
|
59
59
|
currentRangeSelection.current = [];
|
|
60
60
|
};
|
|
61
|
-
const
|
|
62
|
-
const [first, last] = findOrderInTremauxTree(instance,
|
|
63
|
-
const
|
|
61
|
+
const getItemsInRange = (itemAId, itemBId) => {
|
|
62
|
+
const [first, last] = findOrderInTremauxTree(instance, itemAId, itemBId);
|
|
63
|
+
const items = [first];
|
|
64
64
|
let current = first;
|
|
65
65
|
while (current !== last) {
|
|
66
|
-
current =
|
|
67
|
-
|
|
66
|
+
current = getNextItem(instance, current);
|
|
67
|
+
items.push(current);
|
|
68
68
|
}
|
|
69
|
-
return
|
|
69
|
+
return items;
|
|
70
70
|
};
|
|
71
|
-
const handleRangeArrowSelect = (event,
|
|
71
|
+
const handleRangeArrowSelect = (event, items) => {
|
|
72
72
|
let base = models.selectedItems.value.slice();
|
|
73
73
|
const {
|
|
74
74
|
start,
|
|
75
75
|
next,
|
|
76
76
|
current
|
|
77
|
-
} =
|
|
77
|
+
} = items;
|
|
78
78
|
if (!next || !current) {
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
@@ -95,32 +95,32 @@ export const useTreeViewSelection = ({
|
|
|
95
95
|
}
|
|
96
96
|
setSelectedItems(event, base);
|
|
97
97
|
};
|
|
98
|
-
const handleRangeSelect = (event,
|
|
98
|
+
const handleRangeSelect = (event, items) => {
|
|
99
99
|
let base = models.selectedItems.value.slice();
|
|
100
100
|
const {
|
|
101
101
|
start,
|
|
102
102
|
end
|
|
103
|
-
} =
|
|
104
|
-
// If last selection was a range selection ignore
|
|
103
|
+
} = items;
|
|
104
|
+
// If last selection was a range selection ignore items that were selected.
|
|
105
105
|
if (lastSelectionWasRange.current) {
|
|
106
106
|
base = base.filter(id => currentRangeSelection.current.indexOf(id) === -1);
|
|
107
107
|
}
|
|
108
|
-
let range =
|
|
109
|
-
range = range.filter(
|
|
108
|
+
let range = getItemsInRange(start, end);
|
|
109
|
+
range = range.filter(item => !instance.isItemDisabled(item));
|
|
110
110
|
currentRangeSelection.current = range;
|
|
111
111
|
let newSelected = base.concat(range);
|
|
112
112
|
newSelected = newSelected.filter((id, i) => newSelected.indexOf(id) === i);
|
|
113
113
|
setSelectedItems(event, newSelected);
|
|
114
114
|
};
|
|
115
|
-
const selectRange = (event,
|
|
115
|
+
const selectRange = (event, items, stacked = false) => {
|
|
116
116
|
if (params.disableSelection) {
|
|
117
117
|
return;
|
|
118
118
|
}
|
|
119
119
|
const {
|
|
120
|
-
start =
|
|
120
|
+
start = lastSelectedItem.current,
|
|
121
121
|
end,
|
|
122
122
|
current
|
|
123
|
-
} =
|
|
123
|
+
} = items;
|
|
124
124
|
if (stacked) {
|
|
125
125
|
handleRangeArrowSelect(event, {
|
|
126
126
|
start,
|
|
@@ -136,28 +136,28 @@ export const useTreeViewSelection = ({
|
|
|
136
136
|
lastSelectionWasRange.current = true;
|
|
137
137
|
};
|
|
138
138
|
const rangeSelectToFirst = (event, itemId) => {
|
|
139
|
-
if (!
|
|
140
|
-
|
|
139
|
+
if (!lastSelectedItem.current) {
|
|
140
|
+
lastSelectedItem.current = itemId;
|
|
141
141
|
}
|
|
142
|
-
const start = lastSelectionWasRange.current ?
|
|
142
|
+
const start = lastSelectionWasRange.current ? lastSelectedItem.current : itemId;
|
|
143
143
|
instance.selectRange(event, {
|
|
144
144
|
start,
|
|
145
|
-
end:
|
|
145
|
+
end: getFirstItem(instance)
|
|
146
146
|
});
|
|
147
147
|
};
|
|
148
148
|
const rangeSelectToLast = (event, itemId) => {
|
|
149
|
-
if (!
|
|
150
|
-
|
|
149
|
+
if (!lastSelectedItem.current) {
|
|
150
|
+
lastSelectedItem.current = itemId;
|
|
151
151
|
}
|
|
152
|
-
const start = lastSelectionWasRange.current ?
|
|
152
|
+
const start = lastSelectionWasRange.current ? lastSelectedItem.current : itemId;
|
|
153
153
|
instance.selectRange(event, {
|
|
154
154
|
start,
|
|
155
|
-
end:
|
|
155
|
+
end: getLastItem(instance)
|
|
156
156
|
});
|
|
157
157
|
};
|
|
158
158
|
populateInstance(instance, {
|
|
159
|
-
|
|
160
|
-
|
|
159
|
+
isItemSelected,
|
|
160
|
+
selectItem,
|
|
161
161
|
selectRange,
|
|
162
162
|
rangeSelectToLast,
|
|
163
163
|
rangeSelectToFirst
|
|
@@ -178,11 +178,11 @@ useTreeViewSelection.models = {
|
|
|
178
178
|
getDefaultValue: params => params.defaultSelectedItems
|
|
179
179
|
}
|
|
180
180
|
};
|
|
181
|
-
const
|
|
181
|
+
const DEFAULT_SELECTED_ITEMS = [];
|
|
182
182
|
useTreeViewSelection.getDefaultizedParams = params => _extends({}, params, {
|
|
183
183
|
disableSelection: params.disableSelection ?? false,
|
|
184
184
|
multiSelect: params.multiSelect ?? false,
|
|
185
|
-
defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ?
|
|
185
|
+
defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ? DEFAULT_SELECTED_ITEMS : null)
|
|
186
186
|
});
|
|
187
187
|
useTreeViewSelection.params = {
|
|
188
188
|
disableSelection: true,
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* This is used to determine the start and end of a selection range so
|
|
3
|
-
* we can get the
|
|
3
|
+
* we can get the items between the two border items.
|
|
4
4
|
*
|
|
5
|
-
* It finds the
|
|
5
|
+
* It finds the items' common ancestor using
|
|
6
6
|
* a naive implementation of a lowest common ancestor algorithm
|
|
7
7
|
* (https://en.wikipedia.org/wiki/Lowest_common_ancestor).
|
|
8
|
-
* Then compares the ancestor's 2 children that are ancestors of
|
|
9
|
-
* so we can compare their indexes to work out which
|
|
8
|
+
* Then compares the ancestor's 2 children that are ancestors of itemA and ItemB
|
|
9
|
+
* so we can compare their indexes to work out which item comes first in a depth first search.
|
|
10
10
|
* (https://en.wikipedia.org/wiki/Depth-first_search)
|
|
11
11
|
*
|
|
12
|
-
* Another way to put it is which
|
|
12
|
+
* Another way to put it is which item is shallower in a trémaux tree
|
|
13
13
|
* https://en.wikipedia.org/wiki/Tr%C3%A9maux_tree
|
|
14
14
|
*/
|
|
15
15
|
export const findOrderInTremauxTree = (instance, nodeAId, nodeBId) => {
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
export const
|
|
2
|
-
const
|
|
3
|
-
const siblings = instance.getNavigableChildrenIds(
|
|
1
|
+
export const getPreviousItem = (instance, itemId) => {
|
|
2
|
+
const node = instance.getNode(itemId);
|
|
3
|
+
const siblings = instance.getNavigableChildrenIds(node.parentId);
|
|
4
4
|
const itemIndex = siblings.indexOf(itemId);
|
|
5
5
|
if (itemIndex === 0) {
|
|
6
|
-
return
|
|
6
|
+
return node.parentId;
|
|
7
7
|
}
|
|
8
8
|
let currentItem = siblings[itemIndex - 1];
|
|
9
|
-
while (instance.
|
|
9
|
+
while (instance.isItemExpanded(currentItem) && instance.getNavigableChildrenIds(currentItem).length > 0) {
|
|
10
10
|
currentItem = instance.getNavigableChildrenIds(currentItem).pop();
|
|
11
11
|
}
|
|
12
12
|
return currentItem;
|
|
13
13
|
};
|
|
14
|
-
export const
|
|
14
|
+
export const getNextItem = (instance, itemId) => {
|
|
15
15
|
// If expanded get first child
|
|
16
|
-
if (instance.
|
|
16
|
+
if (instance.isItemExpanded(itemId) && instance.getNavigableChildrenIds(itemId).length > 0) {
|
|
17
17
|
return instance.getNavigableChildrenIds(itemId)[0];
|
|
18
18
|
}
|
|
19
|
-
let
|
|
20
|
-
while (
|
|
19
|
+
let node = instance.getNode(itemId);
|
|
20
|
+
while (node != null) {
|
|
21
21
|
// Try to get next sibling
|
|
22
|
-
const siblings = instance.getNavigableChildrenIds(
|
|
23
|
-
const nextSibling = siblings[siblings.indexOf(
|
|
22
|
+
const siblings = instance.getNavigableChildrenIds(node.parentId);
|
|
23
|
+
const nextSibling = siblings[siblings.indexOf(node.id) + 1];
|
|
24
24
|
if (nextSibling) {
|
|
25
25
|
return nextSibling;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
// If the sibling does not exist, go up a level to the parent and try again.
|
|
29
|
-
|
|
29
|
+
node = instance.getNode(node.parentId);
|
|
30
30
|
}
|
|
31
31
|
return null;
|
|
32
32
|
};
|
|
33
|
-
export const
|
|
33
|
+
export const getLastItem = instance => {
|
|
34
34
|
let lastItem = instance.getNavigableChildrenIds(null).pop();
|
|
35
|
-
while (instance.
|
|
35
|
+
while (instance.isItemExpanded(lastItem)) {
|
|
36
36
|
lastItem = instance.getNavigableChildrenIds(lastItem).pop();
|
|
37
37
|
}
|
|
38
38
|
return lastItem;
|
|
39
39
|
};
|
|
40
|
-
export const
|
|
40
|
+
export const getFirstItem = instance => instance.getNavigableChildrenIds(null)[0];
|
|
41
41
|
export const populateInstance = (instance, methods) => {
|
|
42
42
|
Object.assign(instance, methods);
|
|
43
43
|
};
|
|
@@ -22,7 +22,7 @@ export const useTreeViewModels = (plugins, props) => {
|
|
|
22
22
|
return initialState;
|
|
23
23
|
});
|
|
24
24
|
const models = Object.fromEntries(Object.entries(modelsRef.current).map(([modelName, model]) => {
|
|
25
|
-
const value =
|
|
25
|
+
const value = props[modelName] ?? modelsState[modelName];
|
|
26
26
|
return [modelName, {
|
|
27
27
|
value,
|
|
28
28
|
setControlledValue: newValue => {
|
|
@@ -53,7 +53,7 @@ export const useTreeViewModels = (plugins, props) => {
|
|
|
53
53
|
if (!model.isControlled && defaultValue !== newDefaultValue) {
|
|
54
54
|
console.error([`MUI X: A component is changing the default ${modelName} state of an uncontrolled TreeView after being initialized. ` + `To suppress this warning opt to use a controlled TreeView.`].join('\n'));
|
|
55
55
|
}
|
|
56
|
-
}, [JSON.stringify(
|
|
56
|
+
}, [JSON.stringify(newDefaultValue)]);
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
59
|
/* eslint-enable react-hooks/rules-of-hooks, react-hooks/exhaustive-deps */
|
|
@@ -38,7 +38,8 @@ const RichTreeViewRoot = exports.RichTreeViewRoot = (0, _styles.styled)('ul', {
|
|
|
38
38
|
padding: 0,
|
|
39
39
|
margin: 0,
|
|
40
40
|
listStyle: 'none',
|
|
41
|
-
outline: 0
|
|
41
|
+
outline: 0,
|
|
42
|
+
position: 'relative'
|
|
42
43
|
});
|
|
43
44
|
function WrappedTreeItem({
|
|
44
45
|
slots,
|
|
@@ -113,8 +114,8 @@ const RichTreeView = exports.RichTreeView = /*#__PURE__*/React.forwardRef(functi
|
|
|
113
114
|
getSlotProps: getRootProps,
|
|
114
115
|
ownerState: props
|
|
115
116
|
});
|
|
116
|
-
const
|
|
117
|
-
const
|
|
117
|
+
const itemsToRender = instance.getItemsToRender();
|
|
118
|
+
const renderItem = ({
|
|
118
119
|
label,
|
|
119
120
|
itemId,
|
|
120
121
|
id,
|
|
@@ -126,13 +127,13 @@ const RichTreeView = exports.RichTreeView = /*#__PURE__*/React.forwardRef(functi
|
|
|
126
127
|
label: label,
|
|
127
128
|
id: id,
|
|
128
129
|
itemId: itemId,
|
|
129
|
-
children: children?.map(
|
|
130
|
+
children: children?.map(renderItem)
|
|
130
131
|
}, itemId);
|
|
131
132
|
};
|
|
132
133
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeViewProvider.TreeViewProvider, {
|
|
133
134
|
value: contextValue,
|
|
134
135
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Root, (0, _extends2.default)({}, rootProps, {
|
|
135
|
-
children:
|
|
136
|
+
children: itemsToRender.map(renderItem)
|
|
136
137
|
}))
|
|
137
138
|
});
|
|
138
139
|
});
|
|
@@ -147,7 +148,8 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
147
148
|
apiRef: _propTypes.default.shape({
|
|
148
149
|
current: _propTypes.default.shape({
|
|
149
150
|
focusItem: _propTypes.default.func.isRequired,
|
|
150
|
-
getItem: _propTypes.default.func.isRequired
|
|
151
|
+
getItem: _propTypes.default.func.isRequired,
|
|
152
|
+
setItemExpansion: _propTypes.default.func.isRequired
|
|
151
153
|
})
|
|
152
154
|
}),
|
|
153
155
|
/**
|
|
@@ -183,12 +185,12 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
183
185
|
*/
|
|
184
186
|
expandedItems: _propTypes.default.arrayOf(_propTypes.default.string),
|
|
185
187
|
/**
|
|
186
|
-
* Used to determine the
|
|
188
|
+
* Used to determine the id of a given item.
|
|
187
189
|
*
|
|
188
190
|
* @template R
|
|
189
191
|
* @param {R} item The item to check.
|
|
190
192
|
* @returns {string} The id of the item.
|
|
191
|
-
* @default
|
|
193
|
+
* @default (item) => item.id
|
|
192
194
|
*/
|
|
193
195
|
getItemId: _propTypes.default.func,
|
|
194
196
|
/**
|
|
@@ -197,7 +199,7 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
197
199
|
* @template R
|
|
198
200
|
* @param {R} item The item to check.
|
|
199
201
|
* @returns {string} The label of the item.
|
|
200
|
-
* @default
|
|
202
|
+
* @default (item) => item.label
|
|
201
203
|
*/
|
|
202
204
|
getItemLabel: _propTypes.default.func,
|
|
203
205
|
/**
|
|
@@ -37,7 +37,8 @@ const SimpleTreeViewRoot = exports.SimpleTreeViewRoot = (0, _styles.styled)('ul'
|
|
|
37
37
|
padding: 0,
|
|
38
38
|
margin: 0,
|
|
39
39
|
listStyle: 'none',
|
|
40
|
-
outline: 0
|
|
40
|
+
outline: 0,
|
|
41
|
+
position: 'relative'
|
|
41
42
|
});
|
|
42
43
|
const EMPTY_ITEMS = [];
|
|
43
44
|
const itemsPropWarning = (0, _warning.buildWarning)(['MUI X: The `SimpleTreeView` component does not support the `items` prop.', 'If you want to add items, you need to pass them as JSX children.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/simple-tree-view/items/']);
|
|
@@ -105,7 +106,8 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
105
106
|
apiRef: _propTypes.default.shape({
|
|
106
107
|
current: _propTypes.default.shape({
|
|
107
108
|
focusItem: _propTypes.default.func.isRequired,
|
|
108
|
-
getItem: _propTypes.default.func.isRequired
|
|
109
|
+
getItem: _propTypes.default.func.isRequired,
|
|
110
|
+
setItemExpansion: _propTypes.default.func.isRequired
|
|
109
111
|
})
|
|
110
112
|
}),
|
|
111
113
|
/**
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.SIMPLE_TREE_VIEW_PLUGINS = void 0;
|
|
7
7
|
var _defaultPlugins = require("../internals/plugins/defaultPlugins");
|
|
8
|
-
var
|
|
9
|
-
const SIMPLE_TREE_VIEW_PLUGINS = exports.SIMPLE_TREE_VIEW_PLUGINS = [..._defaultPlugins.DEFAULT_TREE_VIEW_PLUGINS,
|
|
8
|
+
var _useTreeViewJSXItems = require("../internals/plugins/useTreeViewJSXItems");
|
|
9
|
+
const SIMPLE_TREE_VIEW_PLUGINS = exports.SIMPLE_TREE_VIEW_PLUGINS = [..._defaultPlugins.DEFAULT_TREE_VIEW_PLUGINS, _useTreeViewJSXItems.useTreeViewJSXItems];
|
|
10
10
|
|
|
11
11
|
// We can't infer this type from the plugin, otherwise we would lose the generics.
|
|
@@ -194,10 +194,10 @@ const TreeItem = exports.TreeItem = /*#__PURE__*/React.forwardRef(function TreeI
|
|
|
194
194
|
return Boolean(reactChildren);
|
|
195
195
|
};
|
|
196
196
|
const expandable = isExpandable(children);
|
|
197
|
-
const expanded = instance.
|
|
198
|
-
const focused = instance.
|
|
199
|
-
const selected = instance.
|
|
200
|
-
const disabled = instance.
|
|
197
|
+
const expanded = instance.isItemExpanded(itemId);
|
|
198
|
+
const focused = instance.isItemFocused(itemId);
|
|
199
|
+
const selected = instance.isItemSelected(itemId);
|
|
200
|
+
const disabled = instance.isItemDisabled(itemId);
|
|
201
201
|
const ownerState = (0, _extends2.default)({}, props, {
|
|
202
202
|
expanded,
|
|
203
203
|
focused,
|
|
@@ -12,11 +12,11 @@ function useTreeItemState(itemId) {
|
|
|
12
12
|
multiSelect
|
|
13
13
|
}
|
|
14
14
|
} = (0, _useTreeViewContext.useTreeViewContext)();
|
|
15
|
-
const expandable = instance.
|
|
16
|
-
const expanded = instance.
|
|
17
|
-
const focused = instance.
|
|
18
|
-
const selected = instance.
|
|
19
|
-
const disabled = instance.
|
|
15
|
+
const expandable = instance.isItemExpandable(itemId);
|
|
16
|
+
const expanded = instance.isItemExpanded(itemId);
|
|
17
|
+
const focused = instance.isItemFocused(itemId);
|
|
18
|
+
const selected = instance.isItemSelected(itemId);
|
|
19
|
+
const disabled = instance.isItemDisabled(itemId);
|
|
20
20
|
const handleExpansion = event => {
|
|
21
21
|
if (!disabled) {
|
|
22
22
|
if (!focused) {
|
|
@@ -25,8 +25,8 @@ function useTreeItemState(itemId) {
|
|
|
25
25
|
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
26
26
|
|
|
27
27
|
// If already expanded and trying to toggle selection don't close
|
|
28
|
-
if (expandable && !(multiple && instance.
|
|
29
|
-
instance.
|
|
28
|
+
if (expandable && !(multiple && instance.isItemExpanded(itemId))) {
|
|
29
|
+
instance.toggleItemExpansion(event, itemId);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
};
|
|
@@ -42,10 +42,10 @@ function useTreeItemState(itemId) {
|
|
|
42
42
|
end: itemId
|
|
43
43
|
});
|
|
44
44
|
} else {
|
|
45
|
-
instance.
|
|
45
|
+
instance.selectItem(event, itemId, true);
|
|
46
46
|
}
|
|
47
47
|
} else {
|
|
48
|
-
instance.
|
|
48
|
+
instance.selectItem(event, itemId);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
};
|
|
@@ -79,7 +79,8 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
79
79
|
apiRef: _propTypes.default.shape({
|
|
80
80
|
current: _propTypes.default.shape({
|
|
81
81
|
focusItem: _propTypes.default.func.isRequired,
|
|
82
|
-
getItem: _propTypes.default.func.isRequired
|
|
82
|
+
getItem: _propTypes.default.func.isRequired,
|
|
83
|
+
setItemExpansion: _propTypes.default.func.isRequired
|
|
83
84
|
})
|
|
84
85
|
}),
|
|
85
86
|
/**
|
|
@@ -17,10 +17,10 @@ const useTreeItem2Utils = ({
|
|
|
17
17
|
} = (0, _useTreeViewContext.useTreeViewContext)();
|
|
18
18
|
const status = {
|
|
19
19
|
expandable: Boolean(Array.isArray(children) ? children.length : children),
|
|
20
|
-
expanded: instance.
|
|
21
|
-
focused: instance.
|
|
22
|
-
selected: instance.
|
|
23
|
-
disabled: instance.
|
|
20
|
+
expanded: instance.isItemExpanded(itemId),
|
|
21
|
+
focused: instance.isItemFocused(itemId),
|
|
22
|
+
selected: instance.isItemSelected(itemId),
|
|
23
|
+
disabled: instance.isItemDisabled(itemId)
|
|
24
24
|
};
|
|
25
25
|
const handleExpansion = event => {
|
|
26
26
|
if (status.disabled) {
|
|
@@ -32,8 +32,8 @@ const useTreeItem2Utils = ({
|
|
|
32
32
|
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
33
33
|
|
|
34
34
|
// If already expanded and trying to toggle selection don't close
|
|
35
|
-
if (status.expandable && !(multiple && instance.
|
|
36
|
-
instance.
|
|
35
|
+
if (status.expandable && !(multiple && instance.isItemExpanded(itemId))) {
|
|
36
|
+
instance.toggleItemExpansion(event, itemId);
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
39
|
const handleSelection = event => {
|
|
@@ -50,10 +50,10 @@ const useTreeItem2Utils = ({
|
|
|
50
50
|
end: itemId
|
|
51
51
|
});
|
|
52
52
|
} else {
|
|
53
|
-
instance.
|
|
53
|
+
instance.selectItem(event, itemId, true);
|
|
54
54
|
}
|
|
55
55
|
} else {
|
|
56
|
-
instance.
|
|
56
|
+
instance.selectItem(event, itemId);
|
|
57
57
|
}
|
|
58
58
|
};
|
|
59
59
|
const interactions = {
|
package/node/index.js
CHANGED
|
@@ -55,7 +55,7 @@ const noop = () => {};
|
|
|
55
55
|
* We use this for focus management, keyboard navigation, and typeahead
|
|
56
56
|
* functionality for some components.
|
|
57
57
|
*
|
|
58
|
-
* The hook accepts the element
|
|
58
|
+
* The hook accepts the element item
|
|
59
59
|
*
|
|
60
60
|
* Our main goals with this are:
|
|
61
61
|
* 1) maximum composability,
|
package/node/internals/index.js
CHANGED
|
@@ -15,19 +15,89 @@ Object.defineProperty(exports, "TreeViewProvider", {
|
|
|
15
15
|
return _TreeViewProvider.TreeViewProvider;
|
|
16
16
|
}
|
|
17
17
|
});
|
|
18
|
+
Object.defineProperty(exports, "buildWarning", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _warning.buildWarning;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
18
24
|
Object.defineProperty(exports, "extractPluginParamsFromProps", {
|
|
19
25
|
enumerable: true,
|
|
20
26
|
get: function () {
|
|
21
27
|
return _extractPluginParamsFromProps.extractPluginParamsFromProps;
|
|
22
28
|
}
|
|
23
29
|
});
|
|
30
|
+
Object.defineProperty(exports, "unstable_resetCleanupTracking", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () {
|
|
33
|
+
return _useInstanceEventHandler.unstable_resetCleanupTracking;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
24
36
|
Object.defineProperty(exports, "useTreeView", {
|
|
25
37
|
enumerable: true,
|
|
26
38
|
get: function () {
|
|
27
39
|
return _useTreeView.useTreeView;
|
|
28
40
|
}
|
|
29
41
|
});
|
|
42
|
+
Object.defineProperty(exports, "useTreeViewExpansion", {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: function () {
|
|
45
|
+
return _useTreeViewExpansion.useTreeViewExpansion;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
Object.defineProperty(exports, "useTreeViewFocus", {
|
|
49
|
+
enumerable: true,
|
|
50
|
+
get: function () {
|
|
51
|
+
return _useTreeViewFocus.useTreeViewFocus;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
Object.defineProperty(exports, "useTreeViewIcons", {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
get: function () {
|
|
57
|
+
return _useTreeViewIcons.useTreeViewIcons;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
Object.defineProperty(exports, "useTreeViewId", {
|
|
61
|
+
enumerable: true,
|
|
62
|
+
get: function () {
|
|
63
|
+
return _useTreeViewId.useTreeViewId;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
Object.defineProperty(exports, "useTreeViewItems", {
|
|
67
|
+
enumerable: true,
|
|
68
|
+
get: function () {
|
|
69
|
+
return _useTreeViewItems.useTreeViewItems;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
Object.defineProperty(exports, "useTreeViewJSXItems", {
|
|
73
|
+
enumerable: true,
|
|
74
|
+
get: function () {
|
|
75
|
+
return _useTreeViewJSXItems.useTreeViewJSXItems;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
Object.defineProperty(exports, "useTreeViewKeyboardNavigation", {
|
|
79
|
+
enumerable: true,
|
|
80
|
+
get: function () {
|
|
81
|
+
return _useTreeViewKeyboardNavigation.useTreeViewKeyboardNavigation;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
Object.defineProperty(exports, "useTreeViewSelection", {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
get: function () {
|
|
87
|
+
return _useTreeViewSelection.useTreeViewSelection;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
30
90
|
var _useTreeView = require("./useTreeView");
|
|
31
91
|
var _TreeViewProvider = require("./TreeViewProvider");
|
|
92
|
+
var _useInstanceEventHandler = require("./hooks/useInstanceEventHandler");
|
|
32
93
|
var _defaultPlugins = require("./plugins/defaultPlugins");
|
|
94
|
+
var _useTreeViewExpansion = require("./plugins/useTreeViewExpansion");
|
|
95
|
+
var _useTreeViewSelection = require("./plugins/useTreeViewSelection");
|
|
96
|
+
var _useTreeViewFocus = require("./plugins/useTreeViewFocus");
|
|
97
|
+
var _useTreeViewKeyboardNavigation = require("./plugins/useTreeViewKeyboardNavigation");
|
|
98
|
+
var _useTreeViewId = require("./plugins/useTreeViewId");
|
|
99
|
+
var _useTreeViewIcons = require("./plugins/useTreeViewIcons");
|
|
100
|
+
var _useTreeViewItems = require("./plugins/useTreeViewItems");
|
|
101
|
+
var _useTreeViewJSXItems = require("./plugins/useTreeViewJSXItems");
|
|
102
|
+
var _warning = require("./utils/warning");
|
|
33
103
|
var _extractPluginParamsFromProps = require("./utils/extractPluginParamsFromProps");
|
|
@@ -5,12 +5,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.DEFAULT_TREE_VIEW_PLUGINS = void 0;
|
|
7
7
|
var _useTreeViewId = require("./useTreeViewId");
|
|
8
|
-
var
|
|
8
|
+
var _useTreeViewItems = require("./useTreeViewItems");
|
|
9
9
|
var _useTreeViewExpansion = require("./useTreeViewExpansion");
|
|
10
10
|
var _useTreeViewSelection = require("./useTreeViewSelection");
|
|
11
11
|
var _useTreeViewFocus = require("./useTreeViewFocus");
|
|
12
12
|
var _useTreeViewKeyboardNavigation = require("./useTreeViewKeyboardNavigation");
|
|
13
13
|
var _useTreeViewIcons = require("./useTreeViewIcons");
|
|
14
|
-
const DEFAULT_TREE_VIEW_PLUGINS = exports.DEFAULT_TREE_VIEW_PLUGINS = [_useTreeViewId.useTreeViewId,
|
|
14
|
+
const DEFAULT_TREE_VIEW_PLUGINS = exports.DEFAULT_TREE_VIEW_PLUGINS = [_useTreeViewId.useTreeViewId, _useTreeViewItems.useTreeViewItems, _useTreeViewExpansion.useTreeViewExpansion, _useTreeViewSelection.useTreeViewSelection, _useTreeViewFocus.useTreeViewFocus, _useTreeViewKeyboardNavigation.useTreeViewKeyboardNavigation, _useTreeViewIcons.useTreeViewIcons];
|
|
15
15
|
|
|
16
16
|
// We can't infer this type from the plugin, otherwise we would lose the generics.
|