@mui/x-tree-view 7.0.0-beta.6 → 7.0.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 +311 -12
- package/README.md +1 -1
- package/RichTreeView/RichTreeView.js +34 -36
- package/RichTreeView/RichTreeView.types.d.ts +3 -2
- package/SimpleTreeView/SimpleTreeView.js +25 -26
- package/TreeItem/TreeItem.js +94 -82
- package/TreeItem/TreeItem.types.d.ts +13 -11
- package/TreeItem/TreeItemContent.d.ts +7 -7
- package/TreeItem/TreeItemContent.js +10 -10
- package/TreeItem/useTreeItemState.d.ts +1 -1
- package/TreeItem/useTreeItemState.js +13 -13
- package/TreeItem2/TreeItem2.d.ts +18 -0
- package/TreeItem2/TreeItem2.js +300 -0
- package/TreeItem2/TreeItem2.types.d.ts +64 -0
- package/TreeItem2/TreeItem2.types.js +1 -0
- package/TreeItem2/index.d.ts +2 -0
- package/TreeItem2/index.js +1 -0
- package/TreeItem2/package.json +6 -0
- package/TreeItem2Icon/TreeItem2Icon.d.ts +7 -0
- package/TreeItem2Icon/TreeItem2Icon.js +67 -0
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +40 -0
- package/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/TreeItem2Icon/index.d.ts +2 -0
- package/TreeItem2Icon/index.js +1 -0
- package/TreeItem2Icon/package.json +6 -0
- package/TreeItem2Provider/TreeItem2Provider.d.ts +7 -0
- package/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/TreeItem2Provider/TreeItem2Provider.types.d.ts +6 -0
- package/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/TreeItem2Provider/index.d.ts +2 -0
- package/TreeItem2Provider/index.js +1 -0
- package/TreeItem2Provider/package.json +6 -0
- package/TreeView/TreeView.d.ts +1 -1
- package/TreeView/TreeView.js +23 -23
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +2 -1
- package/hooks/useTreeItem2Utils/index.d.ts +1 -0
- package/hooks/useTreeItem2Utils/index.js +1 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +15 -0
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/index.d.ts +5 -1
- package/index.js +9 -2
- package/internals/TreeViewProvider/TreeViewContext.d.ts +3 -1
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +4 -2
- package/internals/hooks/useInstanceEventHandler.js +5 -10
- package/internals/hooks/useLazyRef.d.ts +1 -2
- package/internals/hooks/useLazyRef.js +1 -11
- package/internals/hooks/useOnMount.d.ts +1 -2
- package/internals/hooks/useOnMount.js +1 -7
- package/internals/hooks/useTimeout.d.ts +1 -11
- package/internals/hooks/useTimeout.js +1 -36
- package/internals/models/plugin.d.ts +19 -16
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +31 -38
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +14 -14
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +67 -51
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +9 -8
- package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -31
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +2 -2
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +75 -80
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +4 -1
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +26 -31
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +11 -11
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +47 -50
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +15 -15
- package/internals/useTreeView/useTreeView.js +28 -27
- package/internals/useTreeView/useTreeView.utils.d.ts +2 -2
- package/internals/useTreeView/useTreeView.utils.js +22 -22
- package/internals/utils/extractPluginParamsFromProps.js +2 -2
- package/internals/utils/utils.js +1 -0
- package/modern/RichTreeView/RichTreeView.js +29 -29
- package/modern/SimpleTreeView/SimpleTreeView.js +23 -23
- package/modern/TreeItem/TreeItem.js +83 -70
- package/modern/TreeItem/TreeItemContent.js +10 -10
- package/modern/TreeItem/useTreeItemState.js +13 -13
- package/modern/TreeItem2/TreeItem2.js +300 -0
- package/modern/TreeItem2/TreeItem2.types.js +1 -0
- package/modern/TreeItem2/index.js +1 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.js +67 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.types.js +1 -0
- package/modern/TreeItem2Icon/index.js +1 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.js +24 -0
- package/modern/TreeItem2Provider/TreeItem2Provider.types.js +1 -0
- package/modern/TreeItem2Provider/index.js +1 -0
- package/modern/TreeView/TreeView.js +23 -23
- package/modern/hooks/index.js +2 -1
- package/modern/hooks/useTreeItem2Utils/index.js +1 -0
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +61 -0
- package/modern/index.js +9 -2
- package/modern/internals/hooks/useLazyRef.js +1 -11
- package/modern/internals/hooks/useOnMount.js +1 -7
- package/modern/internals/hooks/useTimeout.js +1 -36
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
- package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
- package/modern/internals/useTreeView/useTreeView.js +28 -27
- package/modern/internals/useTreeView/useTreeView.utils.js +22 -22
- package/modern/internals/utils/utils.js +1 -0
- package/modern/useTreeItem2/index.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +146 -0
- package/modern/useTreeItem2/useTreeItem2.types.js +1 -0
- package/node/RichTreeView/RichTreeView.js +29 -29
- package/node/SimpleTreeView/SimpleTreeView.js +23 -23
- package/node/TreeItem/TreeItem.js +83 -70
- package/node/TreeItem/TreeItemContent.js +10 -10
- package/node/TreeItem/useTreeItemState.js +13 -13
- package/node/TreeItem2/TreeItem2.js +308 -0
- package/node/TreeItem2/TreeItem2.types.js +5 -0
- package/node/TreeItem2/index.js +42 -0
- package/node/TreeItem2Icon/TreeItem2Icon.js +75 -0
- package/node/TreeItem2Icon/TreeItem2Icon.types.js +5 -0
- package/node/TreeItem2Icon/index.js +12 -0
- package/node/TreeItem2Provider/TreeItem2Provider.js +30 -0
- package/node/TreeItem2Provider/TreeItem2Provider.types.js +5 -0
- package/node/TreeItem2Provider/index.js +12 -0
- package/node/TreeView/TreeView.js +23 -23
- package/node/hooks/index.js +8 -1
- package/node/hooks/useTreeItem2Utils/index.js +12 -0
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +68 -0
- package/node/index.js +61 -13
- package/node/internals/hooks/useLazyRef.js +7 -13
- package/node/internals/hooks/useOnMount.js +8 -10
- package/node/internals/hooks/useTimeout.js +7 -37
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +29 -29
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +65 -46
- package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +30 -30
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +74 -77
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +21 -22
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +43 -43
- package/node/internals/useTreeView/useTreeView.js +28 -27
- package/node/internals/useTreeView/useTreeView.utils.js +22 -22
- package/node/internals/utils/utils.js +1 -0
- package/node/useTreeItem2/index.js +12 -0
- package/node/useTreeItem2/useTreeItem2.js +154 -0
- package/node/useTreeItem2/useTreeItem2.types.js +5 -0
- package/package.json +5 -5
- package/themeAugmentation/components.d.ts +5 -0
- package/themeAugmentation/overrides.d.ts +1 -0
- package/themeAugmentation/props.d.ts +2 -0
- package/useTreeItem2/index.d.ts +2 -0
- package/useTreeItem2/index.js +1 -0
- package/useTreeItem2/package.json +6 -0
- package/useTreeItem2/useTreeItem2.d.ts +2 -0
- package/useTreeItem2/useTreeItem2.js +146 -0
- package/useTreeItem2/useTreeItem2.types.d.ts +115 -0
- package/useTreeItem2/useTreeItem2.types.js +1 -0
|
@@ -10,51 +10,51 @@ export const useTreeViewSelection = ({
|
|
|
10
10
|
const lastSelectedNode = React.useRef(null);
|
|
11
11
|
const lastSelectionWasRange = React.useRef(false);
|
|
12
12
|
const currentRangeSelection = React.useRef([]);
|
|
13
|
-
const
|
|
14
|
-
if (params.
|
|
13
|
+
const setSelectedItems = (event, newSelectedItems) => {
|
|
14
|
+
if (params.onItemSelectionToggle) {
|
|
15
15
|
if (params.multiSelect) {
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
params.
|
|
16
|
+
const addedItems = newSelectedItems.filter(itemId => !instance.isNodeSelected(itemId));
|
|
17
|
+
const removedItems = models.selectedItems.value.filter(itemId => !newSelectedItems.includes(itemId));
|
|
18
|
+
addedItems.forEach(itemId => {
|
|
19
|
+
params.onItemSelectionToggle(event, itemId, true);
|
|
20
20
|
});
|
|
21
|
-
|
|
22
|
-
params.
|
|
21
|
+
removedItems.forEach(itemId => {
|
|
22
|
+
params.onItemSelectionToggle(event, itemId, false);
|
|
23
23
|
});
|
|
24
|
-
} else if (
|
|
25
|
-
if (models.
|
|
26
|
-
params.
|
|
24
|
+
} else if (newSelectedItems !== models.selectedItems.value) {
|
|
25
|
+
if (models.selectedItems.value != null) {
|
|
26
|
+
params.onItemSelectionToggle(event, models.selectedItems.value, false);
|
|
27
27
|
}
|
|
28
|
-
if (
|
|
29
|
-
params.
|
|
28
|
+
if (newSelectedItems != null) {
|
|
29
|
+
params.onItemSelectionToggle(event, newSelectedItems, true);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
if (params.
|
|
34
|
-
params.
|
|
33
|
+
if (params.onSelectedItemsChange) {
|
|
34
|
+
params.onSelectedItemsChange(event, newSelectedItems);
|
|
35
35
|
}
|
|
36
|
-
models.
|
|
36
|
+
models.selectedItems.setControlledValue(newSelectedItems);
|
|
37
37
|
};
|
|
38
|
-
const isNodeSelected =
|
|
39
|
-
const selectNode = (event,
|
|
38
|
+
const isNodeSelected = itemId => Array.isArray(models.selectedItems.value) ? models.selectedItems.value.indexOf(itemId) !== -1 : models.selectedItems.value === itemId;
|
|
39
|
+
const selectNode = (event, itemId, multiple = false) => {
|
|
40
40
|
if (params.disableSelection) {
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
43
|
if (multiple) {
|
|
44
|
-
if (Array.isArray(models.
|
|
44
|
+
if (Array.isArray(models.selectedItems.value)) {
|
|
45
45
|
let newSelected;
|
|
46
|
-
if (models.
|
|
47
|
-
newSelected = models.
|
|
46
|
+
if (models.selectedItems.value.indexOf(itemId) !== -1) {
|
|
47
|
+
newSelected = models.selectedItems.value.filter(id => id !== itemId);
|
|
48
48
|
} else {
|
|
49
|
-
newSelected = [
|
|
49
|
+
newSelected = [itemId].concat(models.selectedItems.value);
|
|
50
50
|
}
|
|
51
|
-
|
|
51
|
+
setSelectedItems(event, newSelected);
|
|
52
52
|
}
|
|
53
53
|
} else {
|
|
54
|
-
const newSelected = params.multiSelect ? [
|
|
55
|
-
|
|
54
|
+
const newSelected = params.multiSelect ? [itemId] : itemId;
|
|
55
|
+
setSelectedItems(event, newSelected);
|
|
56
56
|
}
|
|
57
|
-
lastSelectedNode.current =
|
|
57
|
+
lastSelectedNode.current = itemId;
|
|
58
58
|
lastSelectionWasRange.current = false;
|
|
59
59
|
currentRangeSelection.current = [];
|
|
60
60
|
};
|
|
@@ -69,7 +69,7 @@ export const useTreeViewSelection = ({
|
|
|
69
69
|
return nodes;
|
|
70
70
|
};
|
|
71
71
|
const handleRangeArrowSelect = (event, nodes) => {
|
|
72
|
-
let base = models.
|
|
72
|
+
let base = models.selectedItems.value.slice();
|
|
73
73
|
const {
|
|
74
74
|
start,
|
|
75
75
|
next,
|
|
@@ -93,10 +93,10 @@ export const useTreeViewSelection = ({
|
|
|
93
93
|
base.push(next);
|
|
94
94
|
currentRangeSelection.current.push(current, next);
|
|
95
95
|
}
|
|
96
|
-
|
|
96
|
+
setSelectedItems(event, base);
|
|
97
97
|
};
|
|
98
98
|
const handleRangeSelect = (event, nodes) => {
|
|
99
|
-
let base = models.
|
|
99
|
+
let base = models.selectedItems.value.slice();
|
|
100
100
|
const {
|
|
101
101
|
start,
|
|
102
102
|
end
|
|
@@ -110,7 +110,7 @@ export const useTreeViewSelection = ({
|
|
|
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
115
|
const selectRange = (event, nodes, stacked = false) => {
|
|
116
116
|
if (params.disableSelection) {
|
|
@@ -135,21 +135,21 @@ export const useTreeViewSelection = ({
|
|
|
135
135
|
}
|
|
136
136
|
lastSelectionWasRange.current = true;
|
|
137
137
|
};
|
|
138
|
-
const rangeSelectToFirst = (event,
|
|
138
|
+
const rangeSelectToFirst = (event, itemId) => {
|
|
139
139
|
if (!lastSelectedNode.current) {
|
|
140
|
-
lastSelectedNode.current =
|
|
140
|
+
lastSelectedNode.current = itemId;
|
|
141
141
|
}
|
|
142
|
-
const start = lastSelectionWasRange.current ? lastSelectedNode.current :
|
|
142
|
+
const start = lastSelectionWasRange.current ? lastSelectedNode.current : itemId;
|
|
143
143
|
instance.selectRange(event, {
|
|
144
144
|
start,
|
|
145
145
|
end: getFirstNode(instance)
|
|
146
146
|
});
|
|
147
147
|
};
|
|
148
|
-
const rangeSelectToLast = (event,
|
|
148
|
+
const rangeSelectToLast = (event, itemId) => {
|
|
149
149
|
if (!lastSelectedNode.current) {
|
|
150
|
-
lastSelectedNode.current =
|
|
150
|
+
lastSelectedNode.current = itemId;
|
|
151
151
|
}
|
|
152
|
-
const start = lastSelectionWasRange.current ? lastSelectedNode.current :
|
|
152
|
+
const start = lastSelectionWasRange.current ? lastSelectedNode.current : itemId;
|
|
153
153
|
instance.selectRange(event, {
|
|
154
154
|
start,
|
|
155
155
|
end: getLastNode(instance)
|
|
@@ -174,24 +174,21 @@ export const useTreeViewSelection = ({
|
|
|
174
174
|
};
|
|
175
175
|
};
|
|
176
176
|
useTreeViewSelection.models = {
|
|
177
|
-
|
|
178
|
-
getDefaultValue: params => params.
|
|
177
|
+
selectedItems: {
|
|
178
|
+
getDefaultValue: params => params.defaultSelectedItems
|
|
179
179
|
}
|
|
180
180
|
};
|
|
181
181
|
const DEFAULT_SELECTED_NODES = [];
|
|
182
|
-
useTreeViewSelection.getDefaultizedParams = params => {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
defaultSelectedNodes: (_params$defaultSelect = params.defaultSelectedNodes) != null ? _params$defaultSelect : params.multiSelect ? DEFAULT_SELECTED_NODES : null
|
|
188
|
-
});
|
|
189
|
-
};
|
|
182
|
+
useTreeViewSelection.getDefaultizedParams = params => _extends({}, params, {
|
|
183
|
+
disableSelection: params.disableSelection ?? false,
|
|
184
|
+
multiSelect: params.multiSelect ?? false,
|
|
185
|
+
defaultSelectedItems: params.defaultSelectedItems ?? (params.multiSelect ? DEFAULT_SELECTED_NODES : null)
|
|
186
|
+
});
|
|
190
187
|
useTreeViewSelection.params = {
|
|
191
188
|
disableSelection: true,
|
|
192
189
|
multiSelect: true,
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
190
|
+
defaultSelectedItems: true,
|
|
191
|
+
selectedItems: true,
|
|
192
|
+
onSelectedItemsChange: true,
|
|
193
|
+
onItemSelectionToggle: true
|
|
197
194
|
};
|
|
@@ -3,11 +3,11 @@ import type { DefaultizedProps, TreeViewItemRange, TreeViewPluginSignature } fro
|
|
|
3
3
|
import { UseTreeViewNodesSignature } from '../useTreeViewNodes';
|
|
4
4
|
import { UseTreeViewExpansionSignature } from '../useTreeViewExpansion';
|
|
5
5
|
export interface UseTreeViewSelectionInstance {
|
|
6
|
-
isNodeSelected: (
|
|
7
|
-
selectNode: (event: React.SyntheticEvent,
|
|
6
|
+
isNodeSelected: (itemId: string) => boolean;
|
|
7
|
+
selectNode: (event: React.SyntheticEvent, itemId: string, multiple?: boolean) => void;
|
|
8
8
|
selectRange: (event: React.SyntheticEvent, nodes: TreeViewItemRange, stacked?: boolean) => void;
|
|
9
|
-
rangeSelectToFirst: (event: React.KeyboardEvent
|
|
10
|
-
rangeSelectToLast: (event: React.KeyboardEvent
|
|
9
|
+
rangeSelectToFirst: (event: React.KeyboardEvent, itemId: string) => void;
|
|
10
|
+
rangeSelectToLast: (event: React.KeyboardEvent, itemId: string) => void;
|
|
11
11
|
}
|
|
12
12
|
type TreeViewSelectionValue<Multiple extends boolean | undefined> = Multiple extends true ? string[] : string | null;
|
|
13
13
|
export interface UseTreeViewSelectionParameters<Multiple extends boolean | undefined> {
|
|
@@ -17,16 +17,16 @@ export interface UseTreeViewSelectionParameters<Multiple extends boolean | undef
|
|
|
17
17
|
*/
|
|
18
18
|
disableSelection?: boolean;
|
|
19
19
|
/**
|
|
20
|
-
* Selected
|
|
20
|
+
* Selected item ids. (Uncontrolled)
|
|
21
21
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
22
22
|
* @default []
|
|
23
23
|
*/
|
|
24
|
-
|
|
24
|
+
defaultSelectedItems?: TreeViewSelectionValue<Multiple>;
|
|
25
25
|
/**
|
|
26
|
-
* Selected
|
|
26
|
+
* Selected item ids. (Controlled)
|
|
27
27
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
28
28
|
*/
|
|
29
|
-
|
|
29
|
+
selectedItems?: TreeViewSelectionValue<Multiple>;
|
|
30
30
|
/**
|
|
31
31
|
* If true `ctrl` and `shift` will trigger multiselect.
|
|
32
32
|
* @default false
|
|
@@ -35,19 +35,19 @@ export interface UseTreeViewSelectionParameters<Multiple extends boolean | undef
|
|
|
35
35
|
/**
|
|
36
36
|
* Callback fired when tree items are selected/deselected.
|
|
37
37
|
* @param {React.SyntheticEvent} event The event source of the callback
|
|
38
|
-
* @param {string[] | string}
|
|
38
|
+
* @param {string[] | string} itemIds The ids of the selected items.
|
|
39
39
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
40
40
|
*/
|
|
41
|
-
|
|
41
|
+
onSelectedItemsChange?: (event: React.SyntheticEvent, itemIds: TreeViewSelectionValue<Multiple>) => void;
|
|
42
42
|
/**
|
|
43
43
|
* Callback fired when a tree item is selected or deselected.
|
|
44
44
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
45
|
-
* @param {array}
|
|
46
|
-
* @param {array} isSelected `true` if the
|
|
45
|
+
* @param {array} itemId The itemId of the modified item.
|
|
46
|
+
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
47
47
|
*/
|
|
48
|
-
|
|
48
|
+
onItemSelectionToggle?: (event: React.SyntheticEvent, itemId: string, isSelected: boolean) => void;
|
|
49
49
|
}
|
|
50
|
-
export type UseTreeViewSelectionDefaultizedParameters<Multiple extends boolean> = DefaultizedProps<UseTreeViewSelectionParameters<Multiple>, 'disableSelection' | '
|
|
50
|
+
export type UseTreeViewSelectionDefaultizedParameters<Multiple extends boolean> = DefaultizedProps<UseTreeViewSelectionParameters<Multiple>, 'disableSelection' | 'defaultSelectedItems' | 'multiSelect'>;
|
|
51
51
|
interface UseTreeViewSelectionContextValue {
|
|
52
52
|
selection: Pick<UseTreeViewSelectionDefaultizedParameters<boolean>, 'multiSelect'>;
|
|
53
53
|
}
|
|
@@ -56,7 +56,7 @@ export type UseTreeViewSelectionSignature = TreeViewPluginSignature<{
|
|
|
56
56
|
defaultizedParams: UseTreeViewSelectionDefaultizedParameters<any>;
|
|
57
57
|
instance: UseTreeViewSelectionInstance;
|
|
58
58
|
contextValue: UseTreeViewSelectionContextValue;
|
|
59
|
-
modelNames: '
|
|
59
|
+
modelNames: 'selectedItems';
|
|
60
60
|
dependantPlugins: [
|
|
61
61
|
UseTreeViewNodesSignature,
|
|
62
62
|
UseTreeViewExpansionSignature,
|
|
@@ -38,6 +38,7 @@ export const useTreeView = inParams => {
|
|
|
38
38
|
});
|
|
39
39
|
const rootPropsGetters = [];
|
|
40
40
|
const contextValue = {
|
|
41
|
+
publicAPI,
|
|
41
42
|
instance: instance
|
|
42
43
|
};
|
|
43
44
|
const runPlugin = plugin => {
|
|
@@ -60,47 +61,47 @@ export const useTreeView = inParams => {
|
|
|
60
61
|
}
|
|
61
62
|
};
|
|
62
63
|
plugins.forEach(runPlugin);
|
|
63
|
-
contextValue.runItemPlugins =
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}) => {
|
|
67
|
-
let finalProps = props;
|
|
68
|
-
let finalRef = ref;
|
|
69
|
-
const itemWrappers = [];
|
|
64
|
+
contextValue.runItemPlugins = itemPluginProps => {
|
|
65
|
+
let finalRootRef = null;
|
|
66
|
+
let finalContentRef = null;
|
|
70
67
|
plugins.forEach(plugin => {
|
|
71
68
|
if (!plugin.itemPlugin) {
|
|
72
69
|
return;
|
|
73
70
|
}
|
|
74
71
|
const itemPluginResponse = plugin.itemPlugin({
|
|
75
|
-
props:
|
|
76
|
-
|
|
72
|
+
props: itemPluginProps,
|
|
73
|
+
rootRef: finalRootRef,
|
|
74
|
+
contentRef: finalContentRef
|
|
77
75
|
});
|
|
78
|
-
if (itemPluginResponse
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
if (itemPluginResponse != null && itemPluginResponse.ref) {
|
|
82
|
-
finalRef = itemPluginResponse.ref;
|
|
76
|
+
if (itemPluginResponse?.rootRef) {
|
|
77
|
+
finalRootRef = itemPluginResponse.rootRef;
|
|
83
78
|
}
|
|
84
|
-
if (itemPluginResponse
|
|
85
|
-
|
|
79
|
+
if (itemPluginResponse?.contentRef) {
|
|
80
|
+
finalContentRef = itemPluginResponse.contentRef;
|
|
86
81
|
}
|
|
87
82
|
});
|
|
88
83
|
return {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
wrapItem: children => {
|
|
92
|
-
let finalChildren = children;
|
|
93
|
-
itemWrappers.forEach(itemWrapper => {
|
|
94
|
-
finalChildren = itemWrapper(finalChildren);
|
|
95
|
-
});
|
|
96
|
-
return finalChildren;
|
|
97
|
-
}
|
|
84
|
+
contentRef: finalContentRef,
|
|
85
|
+
rootRef: finalRootRef
|
|
98
86
|
};
|
|
99
87
|
};
|
|
88
|
+
const itemWrappers = plugins.map(plugin => plugin.wrapItem).filter(wrapItem => !!wrapItem);
|
|
89
|
+
contextValue.wrapItem = ({
|
|
90
|
+
itemId,
|
|
91
|
+
children
|
|
92
|
+
}) => {
|
|
93
|
+
let finalChildren = children;
|
|
94
|
+
itemWrappers.forEach(itemWrapper => {
|
|
95
|
+
finalChildren = itemWrapper({
|
|
96
|
+
itemId,
|
|
97
|
+
children: finalChildren
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
return finalChildren;
|
|
101
|
+
};
|
|
100
102
|
const getRootProps = (otherHandlers = {}) => {
|
|
101
103
|
const rootProps = _extends({
|
|
102
|
-
role: 'tree'
|
|
103
|
-
tabIndex: 0
|
|
104
|
+
role: 'tree'
|
|
104
105
|
}, otherHandlers, {
|
|
105
106
|
ref: handleRootRef
|
|
106
107
|
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { TreeViewAnyPluginSignature, TreeViewInstance, TreeViewUsedInstance, TreeViewUsedPublicAPI } from '../models';
|
|
2
2
|
import type { UseTreeViewExpansionSignature } from '../plugins/useTreeViewExpansion';
|
|
3
3
|
import type { UseTreeViewNodesSignature } from '../plugins/useTreeViewNodes';
|
|
4
|
-
export declare const getPreviousNode: (instance: TreeViewInstance<[UseTreeViewNodesSignature, UseTreeViewExpansionSignature]>,
|
|
5
|
-
export declare const getNextNode: (instance: TreeViewInstance<[UseTreeViewExpansionSignature, UseTreeViewNodesSignature]>,
|
|
4
|
+
export declare const getPreviousNode: (instance: TreeViewInstance<[UseTreeViewNodesSignature, UseTreeViewExpansionSignature]>, itemId: string) => string | null;
|
|
5
|
+
export declare const getNextNode: (instance: TreeViewInstance<[UseTreeViewExpansionSignature, UseTreeViewNodesSignature]>, itemId: string) => string | null;
|
|
6
6
|
export declare const getLastNode: (instance: TreeViewInstance<[UseTreeViewExpansionSignature, UseTreeViewNodesSignature]>) => string;
|
|
7
7
|
export declare const getFirstNode: (instance: TreeViewInstance<[UseTreeViewNodesSignature]>) => string;
|
|
8
8
|
export declare const populateInstance: <T extends TreeViewAnyPluginSignature>(instance: TreeViewUsedInstance<T>, methods: T["instance"]) => void;
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
export const getPreviousNode = (instance,
|
|
2
|
-
const
|
|
3
|
-
const siblings = instance.getNavigableChildrenIds(
|
|
4
|
-
const
|
|
5
|
-
if (
|
|
6
|
-
return
|
|
1
|
+
export const getPreviousNode = (instance, itemId) => {
|
|
2
|
+
const item = instance.getNode(itemId);
|
|
3
|
+
const siblings = instance.getNavigableChildrenIds(item.parentId);
|
|
4
|
+
const itemIndex = siblings.indexOf(itemId);
|
|
5
|
+
if (itemIndex === 0) {
|
|
6
|
+
return item.parentId;
|
|
7
7
|
}
|
|
8
|
-
let
|
|
9
|
-
while (instance.isNodeExpanded(
|
|
10
|
-
|
|
8
|
+
let currentItem = siblings[itemIndex - 1];
|
|
9
|
+
while (instance.isNodeExpanded(currentItem) && instance.getNavigableChildrenIds(currentItem).length > 0) {
|
|
10
|
+
currentItem = instance.getNavigableChildrenIds(currentItem).pop();
|
|
11
11
|
}
|
|
12
|
-
return
|
|
12
|
+
return currentItem;
|
|
13
13
|
};
|
|
14
|
-
export const getNextNode = (instance,
|
|
14
|
+
export const getNextNode = (instance, itemId) => {
|
|
15
15
|
// If expanded get first child
|
|
16
|
-
if (instance.isNodeExpanded(
|
|
17
|
-
return instance.getNavigableChildrenIds(
|
|
16
|
+
if (instance.isNodeExpanded(itemId) && instance.getNavigableChildrenIds(itemId).length > 0) {
|
|
17
|
+
return instance.getNavigableChildrenIds(itemId)[0];
|
|
18
18
|
}
|
|
19
|
-
let
|
|
20
|
-
while (
|
|
19
|
+
let item = instance.getNode(itemId);
|
|
20
|
+
while (item != null) {
|
|
21
21
|
// Try to get next sibling
|
|
22
|
-
const siblings = instance.getNavigableChildrenIds(
|
|
23
|
-
const nextSibling = siblings[siblings.indexOf(
|
|
22
|
+
const siblings = instance.getNavigableChildrenIds(item.parentId);
|
|
23
|
+
const nextSibling = siblings[siblings.indexOf(item.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
|
+
item = instance.getNode(item.parentId);
|
|
30
30
|
}
|
|
31
31
|
return null;
|
|
32
32
|
};
|
|
33
33
|
export const getLastNode = instance => {
|
|
34
|
-
let
|
|
35
|
-
while (instance.isNodeExpanded(
|
|
36
|
-
|
|
34
|
+
let lastItem = instance.getNavigableChildrenIds(null).pop();
|
|
35
|
+
while (instance.isNodeExpanded(lastItem)) {
|
|
36
|
+
lastItem = instance.getNavigableChildrenIds(lastItem).pop();
|
|
37
37
|
}
|
|
38
|
-
return
|
|
38
|
+
return lastItem;
|
|
39
39
|
};
|
|
40
40
|
export const getFirstNode = instance => instance.getNavigableChildrenIds(null)[0];
|
|
41
41
|
export const populateInstance = (instance, methods) => {
|
|
@@ -18,8 +18,8 @@ export const extractPluginParamsFromProps = _ref => {
|
|
|
18
18
|
const pluginParams = {
|
|
19
19
|
plugins,
|
|
20
20
|
rootRef,
|
|
21
|
-
slots: slots
|
|
22
|
-
slotProps: slotProps
|
|
21
|
+
slots: slots ?? {},
|
|
22
|
+
slotProps: slotProps ?? {},
|
|
23
23
|
apiRef
|
|
24
24
|
};
|
|
25
25
|
const otherProps = {};
|
package/internals/utils/utils.js
CHANGED
|
@@ -36,7 +36,7 @@ function WrappedTreeItem({
|
|
|
36
36
|
slotProps,
|
|
37
37
|
label,
|
|
38
38
|
id,
|
|
39
|
-
|
|
39
|
+
itemId,
|
|
40
40
|
children
|
|
41
41
|
}) {
|
|
42
42
|
const Item = slots?.item ?? TreeItem;
|
|
@@ -44,12 +44,12 @@ function WrappedTreeItem({
|
|
|
44
44
|
elementType: Item,
|
|
45
45
|
externalSlotProps: slotProps?.item,
|
|
46
46
|
additionalProps: {
|
|
47
|
-
|
|
47
|
+
itemId,
|
|
48
48
|
id,
|
|
49
49
|
label
|
|
50
50
|
},
|
|
51
51
|
ownerState: {
|
|
52
|
-
|
|
52
|
+
itemId,
|
|
53
53
|
label
|
|
54
54
|
}
|
|
55
55
|
});
|
|
@@ -57,7 +57,7 @@ function WrappedTreeItem({
|
|
|
57
57
|
children: children
|
|
58
58
|
}));
|
|
59
59
|
}
|
|
60
|
-
const childrenWarning = buildWarning(['MUI X: The `RichTreeView` component does not support JSX children.', 'If you want to add items, you need to use the `items` prop', 'Check the documentation for more details: https://
|
|
60
|
+
const childrenWarning = buildWarning(['MUI X: The `RichTreeView` component does not support JSX children.', 'If you want to add items, you need to use the `items` prop', 'Check the documentation for more details: https://mui.com/x/react-tree-view/rich-tree-view/items/']);
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
63
|
*
|
|
@@ -107,7 +107,7 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
|
|
|
107
107
|
const nodesToRender = instance.getNodesToRender();
|
|
108
108
|
const renderNode = ({
|
|
109
109
|
label,
|
|
110
|
-
|
|
110
|
+
itemId,
|
|
111
111
|
id,
|
|
112
112
|
children
|
|
113
113
|
}) => {
|
|
@@ -116,9 +116,9 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
|
|
|
116
116
|
slotProps: slotProps,
|
|
117
117
|
label: label,
|
|
118
118
|
id: id,
|
|
119
|
-
|
|
119
|
+
itemId: itemId,
|
|
120
120
|
children: children?.map(renderNode)
|
|
121
|
-
},
|
|
121
|
+
}, itemId);
|
|
122
122
|
};
|
|
123
123
|
return /*#__PURE__*/_jsx(TreeViewProvider, {
|
|
124
124
|
value: contextValue,
|
|
@@ -137,7 +137,7 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
137
137
|
*/
|
|
138
138
|
apiRef: PropTypes.shape({
|
|
139
139
|
current: PropTypes.shape({
|
|
140
|
-
|
|
140
|
+
focusItem: PropTypes.func.isRequired,
|
|
141
141
|
getItem: PropTypes.func.isRequired
|
|
142
142
|
})
|
|
143
143
|
}),
|
|
@@ -147,17 +147,17 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
147
147
|
classes: PropTypes.object,
|
|
148
148
|
className: PropTypes.string,
|
|
149
149
|
/**
|
|
150
|
-
* Expanded
|
|
150
|
+
* Expanded item ids.
|
|
151
151
|
* Used when the item's expansion is not controlled.
|
|
152
152
|
* @default []
|
|
153
153
|
*/
|
|
154
|
-
|
|
154
|
+
defaultExpandedItems: PropTypes.arrayOf(PropTypes.string),
|
|
155
155
|
/**
|
|
156
|
-
* Selected
|
|
156
|
+
* Selected item ids. (Uncontrolled)
|
|
157
157
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
158
158
|
* @default []
|
|
159
159
|
*/
|
|
160
|
-
|
|
160
|
+
defaultSelectedItems: PropTypes.any,
|
|
161
161
|
/**
|
|
162
162
|
* If `true`, will allow focus on disabled items.
|
|
163
163
|
* @default false
|
|
@@ -169,10 +169,10 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
169
169
|
*/
|
|
170
170
|
disableSelection: PropTypes.bool,
|
|
171
171
|
/**
|
|
172
|
-
* Expanded
|
|
172
|
+
* Expanded item ids.
|
|
173
173
|
* Used when the item's expansion is controlled.
|
|
174
174
|
*/
|
|
175
|
-
|
|
175
|
+
expandedItems: PropTypes.arrayOf(PropTypes.string),
|
|
176
176
|
/**
|
|
177
177
|
* Used to determine the string label for a given item.
|
|
178
178
|
*
|
|
@@ -212,42 +212,42 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
212
212
|
/**
|
|
213
213
|
* Callback fired when tree items are expanded/collapsed.
|
|
214
214
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
215
|
-
* @param {array}
|
|
215
|
+
* @param {array} itemIds The ids of the expanded items.
|
|
216
216
|
*/
|
|
217
|
-
|
|
217
|
+
onExpandedItemsChange: PropTypes.func,
|
|
218
218
|
/**
|
|
219
219
|
* Callback fired when a tree item is expanded or collapsed.
|
|
220
220
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
221
|
-
* @param {array}
|
|
222
|
-
* @param {array} isExpanded `true` if the
|
|
221
|
+
* @param {array} itemId The itemId of the modified item.
|
|
222
|
+
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
223
223
|
*/
|
|
224
|
-
|
|
224
|
+
onItemExpansionToggle: PropTypes.func,
|
|
225
225
|
/**
|
|
226
226
|
* Callback fired when tree items are focused.
|
|
227
227
|
* @param {React.SyntheticEvent} event The event source of the callback **Warning**: This is a generic event not a focus event.
|
|
228
|
-
* @param {string}
|
|
229
|
-
* @param {string} value of the focused
|
|
228
|
+
* @param {string} itemId The id of the focused item.
|
|
229
|
+
* @param {string} value of the focused item.
|
|
230
230
|
*/
|
|
231
|
-
|
|
231
|
+
onItemFocus: PropTypes.func,
|
|
232
232
|
/**
|
|
233
233
|
* Callback fired when a tree item is selected or deselected.
|
|
234
234
|
* @param {React.SyntheticEvent} event The event source of the callback.
|
|
235
|
-
* @param {array}
|
|
236
|
-
* @param {array} isSelected `true` if the
|
|
235
|
+
* @param {array} itemId The itemId of the modified item.
|
|
236
|
+
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
237
237
|
*/
|
|
238
|
-
|
|
238
|
+
onItemSelectionToggle: PropTypes.func,
|
|
239
239
|
/**
|
|
240
240
|
* Callback fired when tree items are selected/deselected.
|
|
241
241
|
* @param {React.SyntheticEvent} event The event source of the callback
|
|
242
|
-
* @param {string[] | string}
|
|
242
|
+
* @param {string[] | string} itemIds The ids of the selected items.
|
|
243
243
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
244
244
|
*/
|
|
245
|
-
|
|
245
|
+
onSelectedItemsChange: PropTypes.func,
|
|
246
246
|
/**
|
|
247
|
-
* Selected
|
|
247
|
+
* Selected item ids. (Controlled)
|
|
248
248
|
* When `multiSelect` is true this takes an array of strings; when false (default) a string.
|
|
249
249
|
*/
|
|
250
|
-
|
|
250
|
+
selectedItems: PropTypes.any,
|
|
251
251
|
/**
|
|
252
252
|
* The props used for each component slot.
|
|
253
253
|
* @default {}
|