@mui/x-tree-view 7.0.0-beta.5 → 7.0.0-beta.7
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 +252 -50
- package/RichTreeView/RichTreeView.js +23 -22
- package/RichTreeView/RichTreeView.types.d.ts +2 -1
- package/SimpleTreeView/SimpleTreeView.js +23 -22
- package/TreeItem/TreeItem.js +79 -79
- package/TreeItem/TreeItem.types.d.ts +17 -19
- package/TreeItem/treeItemClasses.d.ts +1 -1
- package/TreeItem/treeItemClasses.js +1 -1
- package/TreeItem/useTreeItemState.js +2 -2
- package/TreeItem2/TreeItem2.d.ts +18 -0
- package/TreeItem2/TreeItem2.js +301 -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 +68 -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.js +23 -22
- 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/hooks/useTreeViewApiRef.d.ts +2 -2
- 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/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/helpers.d.ts +1 -0
- package/internals/models/plugin.d.ts +19 -16
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +25 -25
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +11 -11
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +5 -6
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +37 -23
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +31 -18
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +16 -6
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +11 -11
- package/internals/useTreeView/useTreeView.js +27 -25
- package/modern/RichTreeView/RichTreeView.js +23 -22
- package/modern/SimpleTreeView/SimpleTreeView.js +23 -22
- package/modern/TreeItem/TreeItem.js +78 -78
- package/modern/TreeItem/treeItemClasses.js +1 -1
- package/modern/TreeItem/useTreeItemState.js +2 -2
- 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 -22
- 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 +24 -24
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +36 -22
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +31 -18
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/modern/internals/useTreeView/useTreeView.js +27 -25
- package/modern/useTreeItem2/index.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +135 -0
- package/modern/useTreeItem2/useTreeItem2.types.js +1 -0
- package/node/RichTreeView/RichTreeView.js +23 -22
- package/node/SimpleTreeView/SimpleTreeView.js +23 -22
- package/node/TreeItem/TreeItem.js +78 -78
- package/node/TreeItem/treeItemClasses.js +1 -1
- package/node/TreeItem/useTreeItemState.js +2 -2
- 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 -22
- 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 +24 -24
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +12 -12
- package/node/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js +36 -22
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +11 -9
- package/node/internals/plugins/useTreeViewNodes/useTreeViewNodes.js +30 -17
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +34 -34
- package/node/internals/useTreeView/useTreeView.js +27 -25
- package/node/useTreeItem2/index.js +12 -0
- package/node/useTreeItem2/useTreeItem2.js +143 -0
- package/node/useTreeItem2/useTreeItem2.types.js +5 -0
- package/package.json +2 -2
- 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 +138 -0
- package/useTreeItem2/useTreeItem2.types.d.ts +113 -0
- package/useTreeItem2/useTreeItem2.types.js +1 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useTreeItem2Utils = void 0;
|
|
7
|
+
var _useTreeViewContext = require("../../internals/TreeViewProvider/useTreeViewContext");
|
|
8
|
+
const useTreeItem2Utils = ({
|
|
9
|
+
nodeId,
|
|
10
|
+
children
|
|
11
|
+
}) => {
|
|
12
|
+
const {
|
|
13
|
+
instance,
|
|
14
|
+
selection: {
|
|
15
|
+
multiSelect
|
|
16
|
+
}
|
|
17
|
+
} = (0, _useTreeViewContext.useTreeViewContext)();
|
|
18
|
+
const status = {
|
|
19
|
+
expandable: Boolean(Array.isArray(children) ? children.length : children),
|
|
20
|
+
expanded: instance.isNodeExpanded(nodeId),
|
|
21
|
+
focused: instance.isNodeFocused(nodeId),
|
|
22
|
+
selected: instance.isNodeSelected(nodeId),
|
|
23
|
+
disabled: instance.isNodeDisabled(nodeId)
|
|
24
|
+
};
|
|
25
|
+
const handleExpansion = event => {
|
|
26
|
+
if (status.disabled) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (!status.focused) {
|
|
30
|
+
instance.focusItem(event, nodeId);
|
|
31
|
+
}
|
|
32
|
+
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
33
|
+
|
|
34
|
+
// If already expanded and trying to toggle selection don't close
|
|
35
|
+
if (status.expandable && !(multiple && instance.isNodeExpanded(nodeId))) {
|
|
36
|
+
instance.toggleNodeExpansion(event, nodeId);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const handleSelection = event => {
|
|
40
|
+
if (status.disabled) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (!status.focused) {
|
|
44
|
+
instance.focusItem(event, nodeId);
|
|
45
|
+
}
|
|
46
|
+
const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
|
|
47
|
+
if (multiple) {
|
|
48
|
+
if (event.shiftKey) {
|
|
49
|
+
instance.selectRange(event, {
|
|
50
|
+
end: nodeId
|
|
51
|
+
});
|
|
52
|
+
} else {
|
|
53
|
+
instance.selectNode(event, nodeId, true);
|
|
54
|
+
}
|
|
55
|
+
} else {
|
|
56
|
+
instance.selectNode(event, nodeId);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const interactions = {
|
|
60
|
+
handleExpansion,
|
|
61
|
+
handleSelection
|
|
62
|
+
};
|
|
63
|
+
return {
|
|
64
|
+
interactions,
|
|
65
|
+
status
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
exports.useTreeItem2Utils = useTreeItem2Utils;
|
package/node/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @mui/x-tree-view v7.0.0-beta.
|
|
2
|
+
* @mui/x-tree-view v7.0.0-beta.7
|
|
3
3
|
*
|
|
4
4
|
* @license MIT
|
|
5
5
|
* This source code is licensed under the MIT license found in the
|
|
@@ -19,18 +19,6 @@ Object.defineProperty(exports, "unstable_resetCleanupTracking", {
|
|
|
19
19
|
return _useInstanceEventHandler.unstable_resetCleanupTracking;
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
|
-
var _TreeItem = require("./TreeItem");
|
|
23
|
-
Object.keys(_TreeItem).forEach(function (key) {
|
|
24
|
-
if (key === "default" || key === "__esModule") return;
|
|
25
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
26
|
-
if (key in exports && exports[key] === _TreeItem[key]) return;
|
|
27
|
-
Object.defineProperty(exports, key, {
|
|
28
|
-
enumerable: true,
|
|
29
|
-
get: function () {
|
|
30
|
-
return _TreeItem[key];
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
22
|
var _TreeView = require("./TreeView");
|
|
35
23
|
Object.keys(_TreeView).forEach(function (key) {
|
|
36
24
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -67,6 +55,66 @@ Object.keys(_RichTreeView).forEach(function (key) {
|
|
|
67
55
|
}
|
|
68
56
|
});
|
|
69
57
|
});
|
|
58
|
+
var _TreeItem = require("./TreeItem");
|
|
59
|
+
Object.keys(_TreeItem).forEach(function (key) {
|
|
60
|
+
if (key === "default" || key === "__esModule") return;
|
|
61
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
62
|
+
if (key in exports && exports[key] === _TreeItem[key]) return;
|
|
63
|
+
Object.defineProperty(exports, key, {
|
|
64
|
+
enumerable: true,
|
|
65
|
+
get: function () {
|
|
66
|
+
return _TreeItem[key];
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
var _TreeItem2 = require("./TreeItem2");
|
|
71
|
+
Object.keys(_TreeItem2).forEach(function (key) {
|
|
72
|
+
if (key === "default" || key === "__esModule") return;
|
|
73
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
74
|
+
if (key in exports && exports[key] === _TreeItem2[key]) return;
|
|
75
|
+
Object.defineProperty(exports, key, {
|
|
76
|
+
enumerable: true,
|
|
77
|
+
get: function () {
|
|
78
|
+
return _TreeItem2[key];
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
var _useTreeItem = require("./useTreeItem2");
|
|
83
|
+
Object.keys(_useTreeItem).forEach(function (key) {
|
|
84
|
+
if (key === "default" || key === "__esModule") return;
|
|
85
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
86
|
+
if (key in exports && exports[key] === _useTreeItem[key]) return;
|
|
87
|
+
Object.defineProperty(exports, key, {
|
|
88
|
+
enumerable: true,
|
|
89
|
+
get: function () {
|
|
90
|
+
return _useTreeItem[key];
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
var _TreeItem2Icon = require("./TreeItem2Icon");
|
|
95
|
+
Object.keys(_TreeItem2Icon).forEach(function (key) {
|
|
96
|
+
if (key === "default" || key === "__esModule") return;
|
|
97
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
98
|
+
if (key in exports && exports[key] === _TreeItem2Icon[key]) return;
|
|
99
|
+
Object.defineProperty(exports, key, {
|
|
100
|
+
enumerable: true,
|
|
101
|
+
get: function () {
|
|
102
|
+
return _TreeItem2Icon[key];
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
var _TreeItem2Provider = require("./TreeItem2Provider");
|
|
107
|
+
Object.keys(_TreeItem2Provider).forEach(function (key) {
|
|
108
|
+
if (key === "default" || key === "__esModule") return;
|
|
109
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
110
|
+
if (key in exports && exports[key] === _TreeItem2Provider[key]) return;
|
|
111
|
+
Object.defineProperty(exports, key, {
|
|
112
|
+
enumerable: true,
|
|
113
|
+
get: function () {
|
|
114
|
+
return _TreeItem2Provider[key];
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
});
|
|
70
118
|
var _useInstanceEventHandler = require("./internals/hooks/useInstanceEventHandler");
|
|
71
119
|
var _models = require("./models");
|
|
72
120
|
Object.keys(_models).forEach(function (key) {
|
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
|
-
exports
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const UNINITIALIZED = {};
|
|
11
|
-
|
|
12
|
-
// See https://github.com/facebook/react/issues/14490 for when to use this.
|
|
13
|
-
function useLazyRef(init, initArg) {
|
|
14
|
-
const ref = React.useRef(UNINITIALIZED);
|
|
15
|
-
if (ref.current === UNINITIALIZED) {
|
|
16
|
-
ref.current = init(initArg);
|
|
7
|
+
Object.defineProperty(exports, "useLazyRef", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () {
|
|
10
|
+
return _useLazyRef.default;
|
|
17
11
|
}
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
});
|
|
13
|
+
var _useLazyRef = _interopRequireDefault(require("@mui/utils/useLazyRef"));
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
|
-
exports
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
React.useEffect(fn, EMPTY);
|
|
14
|
-
/* eslint-enable react-hooks/exhaustive-deps */
|
|
15
|
-
}
|
|
7
|
+
Object.defineProperty(exports, "useOnMount", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () {
|
|
10
|
+
return _useOnMount.default;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
var _useOnMount = _interopRequireDefault(require("@mui/utils/useOnMount"));
|
|
@@ -1,43 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
'use client';
|
|
3
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class Timeout {
|
|
12
|
-
constructor() {
|
|
13
|
-
this.currentId = null;
|
|
14
|
-
this.clear = () => {
|
|
15
|
-
if (this.currentId !== null) {
|
|
16
|
-
clearTimeout(this.currentId);
|
|
17
|
-
this.currentId = null;
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
this.disposeEffect = () => {
|
|
21
|
-
return this.clear;
|
|
22
|
-
};
|
|
7
|
+
Object.defineProperty(exports, "useTimeout", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () {
|
|
10
|
+
return _useTimeout.default;
|
|
23
11
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Executes `fn` after `delay`, clearing any previously scheduled call.
|
|
29
|
-
*/
|
|
30
|
-
start(delay, fn) {
|
|
31
|
-
this.clear();
|
|
32
|
-
this.currentId = setTimeout(() => {
|
|
33
|
-
this.currentId = null;
|
|
34
|
-
fn();
|
|
35
|
-
}, delay);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
exports.Timeout = Timeout;
|
|
39
|
-
function useTimeout() {
|
|
40
|
-
const timeout = (0, _useLazyRef.useLazyRef)(Timeout.create).current;
|
|
41
|
-
(0, _useOnMount.useOnMount)(timeout.disposeEffect);
|
|
42
|
-
return timeout;
|
|
43
|
-
}
|
|
12
|
+
});
|
|
13
|
+
var _useTimeout = _interopRequireDefault(require("@mui/utils/useTimeout"));
|
|
@@ -16,42 +16,42 @@ const useTreeViewExpansion = ({
|
|
|
16
16
|
params,
|
|
17
17
|
models
|
|
18
18
|
}) => {
|
|
19
|
-
const
|
|
20
|
-
params.
|
|
21
|
-
models.
|
|
19
|
+
const setExpandedItems = (event, value) => {
|
|
20
|
+
params.onExpandedItemsChange?.(event, value);
|
|
21
|
+
models.expandedItems.setControlledValue(value);
|
|
22
22
|
};
|
|
23
23
|
const isNodeExpanded = React.useCallback(nodeId => {
|
|
24
|
-
return Array.isArray(models.
|
|
25
|
-
}, [models.
|
|
24
|
+
return Array.isArray(models.expandedItems.value) ? models.expandedItems.value.indexOf(nodeId) !== -1 : false;
|
|
25
|
+
}, [models.expandedItems.value]);
|
|
26
26
|
const isNodeExpandable = React.useCallback(nodeId => !!instance.getNode(nodeId)?.expandable, [instance]);
|
|
27
|
-
const toggleNodeExpansion = (0, _useEventCallback.default)((event,
|
|
28
|
-
if (
|
|
27
|
+
const toggleNodeExpansion = (0, _useEventCallback.default)((event, itemId) => {
|
|
28
|
+
if (itemId == null) {
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
|
-
const isExpandedBefore = models.
|
|
31
|
+
const isExpandedBefore = models.expandedItems.value.indexOf(itemId) !== -1;
|
|
32
32
|
let newExpanded;
|
|
33
33
|
if (isExpandedBefore) {
|
|
34
|
-
newExpanded = models.
|
|
34
|
+
newExpanded = models.expandedItems.value.filter(id => id !== itemId);
|
|
35
35
|
} else {
|
|
36
|
-
newExpanded = [
|
|
36
|
+
newExpanded = [itemId].concat(models.expandedItems.value);
|
|
37
37
|
}
|
|
38
|
-
if (params.
|
|
39
|
-
params.
|
|
38
|
+
if (params.onItemExpansionToggle) {
|
|
39
|
+
params.onItemExpansionToggle(event, itemId, !isExpandedBefore);
|
|
40
40
|
}
|
|
41
|
-
|
|
41
|
+
setExpandedItems(event, newExpanded);
|
|
42
42
|
});
|
|
43
43
|
const expandAllSiblings = (event, nodeId) => {
|
|
44
44
|
const node = instance.getNode(nodeId);
|
|
45
45
|
const siblings = instance.getChildrenIds(node.parentId);
|
|
46
46
|
const diff = siblings.filter(child => instance.isNodeExpandable(child) && !instance.isNodeExpanded(child));
|
|
47
|
-
const newExpanded = models.
|
|
47
|
+
const newExpanded = models.expandedItems.value.concat(diff);
|
|
48
48
|
if (diff.length > 0) {
|
|
49
|
-
if (params.
|
|
49
|
+
if (params.onItemExpansionToggle) {
|
|
50
50
|
diff.forEach(newlyExpandedNodeId => {
|
|
51
|
-
params.
|
|
51
|
+
params.onItemExpansionToggle(event, newlyExpandedNodeId, true);
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
|
-
|
|
54
|
+
setExpandedItems(event, newExpanded);
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
57
|
(0, _useTreeView.populateInstance)(instance, {
|
|
@@ -63,17 +63,17 @@ const useTreeViewExpansion = ({
|
|
|
63
63
|
};
|
|
64
64
|
exports.useTreeViewExpansion = useTreeViewExpansion;
|
|
65
65
|
useTreeViewExpansion.models = {
|
|
66
|
-
|
|
67
|
-
getDefaultValue: params => params.
|
|
66
|
+
expandedItems: {
|
|
67
|
+
getDefaultValue: params => params.defaultExpandedItems
|
|
68
68
|
}
|
|
69
69
|
};
|
|
70
70
|
const DEFAULT_EXPANDED_NODES = [];
|
|
71
71
|
useTreeViewExpansion.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
|
|
72
|
-
|
|
72
|
+
defaultExpandedItems: params.defaultExpandedItems ?? DEFAULT_EXPANDED_NODES
|
|
73
73
|
});
|
|
74
74
|
useTreeViewExpansion.params = {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
expandedItems: true,
|
|
76
|
+
defaultExpandedItems: true,
|
|
77
|
+
onExpandedItemsChange: true,
|
|
78
|
+
onItemExpansionToggle: true
|
|
79
79
|
};
|
|
@@ -37,31 +37,31 @@ const useTreeViewFocus = ({
|
|
|
37
37
|
const node = instance.getNode(nodeId);
|
|
38
38
|
return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
|
|
39
39
|
};
|
|
40
|
-
const
|
|
40
|
+
const focusItem = (0, _useEventCallback.default)((event, nodeId) => {
|
|
41
41
|
// if we receive a nodeId, and it is visible, the focus will be set to it
|
|
42
42
|
if (nodeId && isNodeVisible(nodeId)) {
|
|
43
43
|
if (!isTreeViewFocused()) {
|
|
44
44
|
instance.focusRoot();
|
|
45
45
|
}
|
|
46
46
|
setFocusedNodeId(nodeId);
|
|
47
|
-
if (params.
|
|
48
|
-
params.
|
|
47
|
+
if (params.onItemFocus) {
|
|
48
|
+
params.onItemFocus(event, nodeId);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
});
|
|
52
52
|
const focusDefaultNode = (0, _useEventCallback.default)(event => {
|
|
53
53
|
let nodeToFocusId;
|
|
54
|
-
if (Array.isArray(models.
|
|
55
|
-
nodeToFocusId = models.
|
|
56
|
-
} else if (models.
|
|
57
|
-
nodeToFocusId = models.
|
|
54
|
+
if (Array.isArray(models.selectedItems.value)) {
|
|
55
|
+
nodeToFocusId = models.selectedItems.value.find(isNodeVisible);
|
|
56
|
+
} else if (models.selectedItems.value != null && isNodeVisible(models.selectedItems.value)) {
|
|
57
|
+
nodeToFocusId = models.selectedItems.value;
|
|
58
58
|
}
|
|
59
59
|
if (nodeToFocusId == null) {
|
|
60
60
|
nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
|
|
61
61
|
}
|
|
62
62
|
setFocusedNodeId(nodeToFocusId);
|
|
63
|
-
if (params.
|
|
64
|
-
params.
|
|
63
|
+
if (params.onItemFocus) {
|
|
64
|
+
params.onItemFocus(event, nodeToFocusId);
|
|
65
65
|
}
|
|
66
66
|
});
|
|
67
67
|
const focusRoot = (0, _useEventCallback.default)(() => {
|
|
@@ -71,12 +71,12 @@ const useTreeViewFocus = ({
|
|
|
71
71
|
});
|
|
72
72
|
(0, _useTreeView.populateInstance)(instance, {
|
|
73
73
|
isNodeFocused,
|
|
74
|
-
|
|
74
|
+
focusItem,
|
|
75
75
|
focusRoot,
|
|
76
76
|
focusDefaultNode
|
|
77
77
|
});
|
|
78
78
|
(0, _useTreeView.populatePublicAPI)(publicAPI, {
|
|
79
|
-
|
|
79
|
+
focusItem
|
|
80
80
|
});
|
|
81
81
|
(0, _useInstanceEventHandler.useInstanceEventHandler)(instance, 'removeNode', ({
|
|
82
82
|
id
|
|
@@ -114,5 +114,5 @@ useTreeViewFocus.getInitialState = () => ({
|
|
|
114
114
|
focusedNodeId: null
|
|
115
115
|
});
|
|
116
116
|
useTreeViewFocus.params = {
|
|
117
|
-
|
|
117
|
+
onItemFocus: true
|
|
118
118
|
};
|
|
@@ -22,22 +22,36 @@ const useTreeViewJSXNodes = ({
|
|
|
22
22
|
}) => {
|
|
23
23
|
const insertJSXNode = (0, _useEventCallback.default)(node => {
|
|
24
24
|
setState(prevState => {
|
|
25
|
-
if (prevState.nodeMap[node.id] != null) {
|
|
25
|
+
if (prevState.nodes.nodeMap[node.id] != null) {
|
|
26
26
|
throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Tow items were provided with the same id in the \`items\` prop: "${node.id}"`].join('\n'));
|
|
27
27
|
}
|
|
28
28
|
return (0, _extends2.default)({}, prevState, {
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
nodes: (0, _extends2.default)({}, prevState.nodes, {
|
|
30
|
+
nodeMap: (0, _extends2.default)({}, prevState.nodes.nodeMap, {
|
|
31
|
+
[node.id]: node
|
|
32
|
+
}),
|
|
33
|
+
// For `SimpleTreeView`, we don't have a proper `item` object, so we create a very basic one.
|
|
34
|
+
itemMap: (0, _extends2.default)({}, prevState.nodes.itemMap, {
|
|
35
|
+
[node.id]: {
|
|
36
|
+
id: node.id,
|
|
37
|
+
label: node.label
|
|
38
|
+
}
|
|
39
|
+
})
|
|
31
40
|
})
|
|
32
41
|
});
|
|
33
42
|
});
|
|
34
43
|
});
|
|
35
44
|
const removeJSXNode = (0, _useEventCallback.default)(nodeId => {
|
|
36
45
|
setState(prevState => {
|
|
37
|
-
const
|
|
38
|
-
|
|
46
|
+
const newNodeMap = (0, _extends2.default)({}, prevState.nodes.nodeMap);
|
|
47
|
+
const newItemMap = (0, _extends2.default)({}, prevState.nodes.itemMap);
|
|
48
|
+
delete newNodeMap[nodeId];
|
|
49
|
+
delete newItemMap[nodeId];
|
|
39
50
|
return (0, _extends2.default)({}, prevState, {
|
|
40
|
-
|
|
51
|
+
nodes: (0, _extends2.default)({}, prevState.nodes, {
|
|
52
|
+
nodeMap: newNodeMap,
|
|
53
|
+
itemMap: newItemMap
|
|
54
|
+
})
|
|
41
55
|
});
|
|
42
56
|
});
|
|
43
57
|
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeNode', {
|
|
@@ -66,15 +80,15 @@ const useTreeViewJSXNodes = ({
|
|
|
66
80
|
exports.useTreeViewJSXNodes = useTreeViewJSXNodes;
|
|
67
81
|
const useTreeViewJSXNodesItemPlugin = ({
|
|
68
82
|
props,
|
|
69
|
-
|
|
83
|
+
rootRef,
|
|
84
|
+
contentRef
|
|
70
85
|
}) => {
|
|
71
86
|
const {
|
|
72
87
|
children,
|
|
73
88
|
disabled = false,
|
|
74
89
|
label,
|
|
75
90
|
nodeId,
|
|
76
|
-
id
|
|
77
|
-
ContentProps: inContentProps
|
|
91
|
+
id
|
|
78
92
|
} = props;
|
|
79
93
|
const {
|
|
80
94
|
instance
|
|
@@ -87,8 +101,9 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
87
101
|
};
|
|
88
102
|
const expandable = isExpandable(children);
|
|
89
103
|
const [treeItemElement, setTreeItemElement] = React.useState(null);
|
|
90
|
-
const
|
|
91
|
-
const
|
|
104
|
+
const pluginContentRef = React.useRef(null);
|
|
105
|
+
const handleRootRef = (0, _useForkRef.default)(setTreeItemElement, rootRef);
|
|
106
|
+
const handleContentRef = (0, _useForkRef.default)(pluginContentRef, contentRef);
|
|
92
107
|
const descendant = React.useMemo(() => ({
|
|
93
108
|
element: treeItemElement,
|
|
94
109
|
id: nodeId
|
|
@@ -114,22 +129,21 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
114
129
|
}, [instance, parentId, index, nodeId, expandable, disabled, id]);
|
|
115
130
|
React.useEffect(() => {
|
|
116
131
|
if (label) {
|
|
117
|
-
return instance.mapFirstCharFromJSX(nodeId, (
|
|
132
|
+
return instance.mapFirstCharFromJSX(nodeId, (pluginContentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
|
|
118
133
|
}
|
|
119
134
|
return undefined;
|
|
120
135
|
}, [instance, nodeId, label]);
|
|
121
136
|
return {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
ref: contentRef
|
|
125
|
-
})
|
|
126
|
-
}),
|
|
127
|
-
ref: handleRef,
|
|
128
|
-
wrapItem: item => /*#__PURE__*/(0, _jsxRuntime.jsx)(_DescendantProvider.DescendantProvider, {
|
|
129
|
-
id: nodeId,
|
|
130
|
-
children: item
|
|
131
|
-
})
|
|
137
|
+
contentRef: handleContentRef,
|
|
138
|
+
rootRef: handleRootRef
|
|
132
139
|
};
|
|
133
140
|
};
|
|
134
141
|
useTreeViewJSXNodes.itemPlugin = useTreeViewJSXNodesItemPlugin;
|
|
142
|
+
useTreeViewJSXNodes.wrapItem = ({
|
|
143
|
+
children,
|
|
144
|
+
nodeId
|
|
145
|
+
}) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_DescendantProvider.DescendantProvider, {
|
|
146
|
+
id: nodeId,
|
|
147
|
+
children: children
|
|
148
|
+
});
|
|
135
149
|
useTreeViewJSXNodes.params = {};
|
package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js
CHANGED
|
@@ -90,7 +90,9 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
90
90
|
return null;
|
|
91
91
|
};
|
|
92
92
|
const canToggleNodeSelection = nodeId => !params.disableSelection && !instance.isNodeDisabled(nodeId);
|
|
93
|
-
const canToggleNodeExpansion = nodeId =>
|
|
93
|
+
const canToggleNodeExpansion = nodeId => {
|
|
94
|
+
return !instance.isNodeDisabled(nodeId) && instance.isNodeExpandable(nodeId);
|
|
95
|
+
};
|
|
94
96
|
|
|
95
97
|
// ARIA specification: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/#keyboardinteraction
|
|
96
98
|
const createHandleKeyDown = otherHandlers => event => {
|
|
@@ -99,7 +101,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
99
101
|
return;
|
|
100
102
|
}
|
|
101
103
|
|
|
102
|
-
// If the tree is empty there will be no focused node
|
|
104
|
+
// If the tree is empty, there will be no focused node
|
|
103
105
|
if (event.altKey || event.currentTarget !== event.target || state.focusedNodeId == null) {
|
|
104
106
|
return;
|
|
105
107
|
}
|
|
@@ -149,7 +151,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
149
151
|
const nextNode = (0, _useTreeView.getNextNode)(instance, state.focusedNodeId);
|
|
150
152
|
if (nextNode) {
|
|
151
153
|
event.preventDefault();
|
|
152
|
-
instance.
|
|
154
|
+
instance.focusItem(event, nextNode);
|
|
153
155
|
|
|
154
156
|
// Multi select behavior when pressing Shift + ArrowDown
|
|
155
157
|
// Toggles the selection state of the next node
|
|
@@ -169,7 +171,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
169
171
|
const previousNode = (0, _useTreeView.getPreviousNode)(instance, state.focusedNodeId);
|
|
170
172
|
if (previousNode) {
|
|
171
173
|
event.preventDefault();
|
|
172
|
-
instance.
|
|
174
|
+
instance.focusItem(event, previousNode);
|
|
173
175
|
|
|
174
176
|
// Multi select behavior when pressing Shift + ArrowUp
|
|
175
177
|
// Toggles the selection state of the previous node
|
|
@@ -188,7 +190,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
188
190
|
case key === 'ArrowRight' && !isRTL || key === 'ArrowLeft' && isRTL:
|
|
189
191
|
{
|
|
190
192
|
if (instance.isNodeExpanded(state.focusedNodeId)) {
|
|
191
|
-
instance.
|
|
193
|
+
instance.focusItem(event, (0, _useTreeView.getNextNode)(instance, state.focusedNodeId));
|
|
192
194
|
event.preventDefault();
|
|
193
195
|
} else if (canToggleNodeExpansion(state.focusedNodeId)) {
|
|
194
196
|
instance.toggleNodeExpansion(event, state.focusedNodeId);
|
|
@@ -207,7 +209,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
207
209
|
} else {
|
|
208
210
|
const parent = instance.getNode(state.focusedNodeId).parentId;
|
|
209
211
|
if (parent) {
|
|
210
|
-
instance.
|
|
212
|
+
instance.focusItem(event, parent);
|
|
211
213
|
event.preventDefault();
|
|
212
214
|
}
|
|
213
215
|
}
|
|
@@ -217,7 +219,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
217
219
|
// Focuses the first node in the tree
|
|
218
220
|
case key === 'Home':
|
|
219
221
|
{
|
|
220
|
-
instance.
|
|
222
|
+
instance.focusItem(event, (0, _useTreeView.getFirstNode)(instance));
|
|
221
223
|
|
|
222
224
|
// Multi select behavior when pressing Ctrl + Shift + Home
|
|
223
225
|
// Selects the focused node and all nodes up to the first node.
|
|
@@ -231,7 +233,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
231
233
|
// Focuses the last node in the tree
|
|
232
234
|
case key === 'End':
|
|
233
235
|
{
|
|
234
|
-
instance.
|
|
236
|
+
instance.focusItem(event, (0, _useTreeView.getLastNode)(instance));
|
|
235
237
|
|
|
236
238
|
// Multi select behavior when pressing Ctrl + Shirt + End
|
|
237
239
|
// Selects the focused node and all the nodes down to the last node.
|
|
@@ -268,7 +270,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
268
270
|
{
|
|
269
271
|
const matchingNode = getFirstMatchingNode(state.focusedNodeId, key);
|
|
270
272
|
if (matchingNode != null) {
|
|
271
|
-
instance.
|
|
273
|
+
instance.focusItem(event, matchingNode);
|
|
272
274
|
event.preventDefault();
|
|
273
275
|
}
|
|
274
276
|
break;
|