@mui/x-tree-view 7.0.0-beta.4 → 7.0.0-beta.5
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 +138 -14
- package/RichTreeView/RichTreeView.js +8 -0
- package/RichTreeView/RichTreeView.types.d.ts +7 -1
- package/SimpleTreeView/SimpleTreeView.js +8 -0
- package/SimpleTreeView/SimpleTreeView.types.d.ts +7 -1
- package/TreeView/TreeView.js +8 -0
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +1 -0
- package/hooks/package.json +6 -0
- package/hooks/useTreeViewApiRef.d.ts +6 -0
- package/hooks/useTreeViewApiRef.js +5 -0
- package/index.d.ts +1 -0
- package/index.js +3 -2
- package/internals/hooks/useTimeout.d.ts +5 -3
- package/internals/hooks/useTimeout.js +13 -5
- package/internals/models/helpers.d.ts +1 -0
- package/internals/models/plugin.d.ts +12 -0
- package/internals/models/treeView.d.ts +1 -0
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +40 -22
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +5 -0
- package/internals/useTreeView/useTreeView.d.ts +2 -0
- package/internals/useTreeView/useTreeView.js +12 -0
- package/internals/useTreeView/useTreeView.types.d.ts +2 -1
- package/internals/useTreeView/useTreeView.utils.d.ts +2 -1
- package/internals/useTreeView/useTreeView.utils.js +3 -0
- package/internals/utils/extractPluginParamsFromProps.d.ts +3 -2
- package/internals/utils/extractPluginParamsFromProps.js +5 -3
- package/internals/utils/utils.d.ts +1 -0
- package/internals/utils/utils.js +10 -0
- package/modern/RichTreeView/RichTreeView.js +8 -0
- package/modern/SimpleTreeView/SimpleTreeView.js +8 -0
- package/modern/TreeView/TreeView.js +8 -0
- package/modern/hooks/index.js +1 -0
- package/modern/hooks/useTreeViewApiRef.js +5 -0
- package/modern/index.js +3 -2
- package/modern/internals/hooks/useTimeout.js +13 -5
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +40 -22
- package/modern/internals/useTreeView/useTreeView.js +12 -0
- package/modern/internals/useTreeView/useTreeView.utils.js +3 -0
- package/modern/internals/utils/extractPluginParamsFromProps.js +5 -3
- package/modern/internals/utils/utils.js +10 -0
- package/node/RichTreeView/RichTreeView.js +8 -0
- package/node/SimpleTreeView/SimpleTreeView.js +8 -0
- package/node/TreeView/TreeView.js +8 -0
- package/node/hooks/index.js +12 -0
- package/node/hooks/useTreeViewApiRef.js +14 -0
- package/node/index.js +13 -1
- package/node/internals/hooks/useTimeout.js +13 -4
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +39 -21
- package/node/internals/useTreeView/useTreeView.js +13 -0
- package/node/internals/useTreeView/useTreeView.utils.js +6 -2
- package/node/internals/utils/extractPluginParamsFromProps.js +5 -3
- package/node/internals/utils/utils.js +17 -0
- package/package.json +1 -1
|
@@ -11,10 +11,12 @@ var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallb
|
|
|
11
11
|
var _ownerDocument = _interopRequireDefault(require("@mui/utils/ownerDocument"));
|
|
12
12
|
var _useTreeView = require("../../useTreeView/useTreeView.utils");
|
|
13
13
|
var _useInstanceEventHandler = require("../../hooks/useInstanceEventHandler");
|
|
14
|
+
var _utils = require("../../utils/utils");
|
|
14
15
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
15
16
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
16
17
|
const useTreeViewFocus = ({
|
|
17
18
|
instance,
|
|
19
|
+
publicAPI,
|
|
18
20
|
params,
|
|
19
21
|
state,
|
|
20
22
|
setState,
|
|
@@ -23,19 +25,45 @@ const useTreeViewFocus = ({
|
|
|
23
25
|
}) => {
|
|
24
26
|
const setFocusedNodeId = (0, _useEventCallback.default)(nodeId => {
|
|
25
27
|
const cleanNodeId = typeof nodeId === 'function' ? nodeId(state.focusedNodeId) : nodeId;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
if (state.focusedNodeId !== cleanNodeId) {
|
|
29
|
+
setState(prevState => (0, _extends2.default)({}, prevState, {
|
|
30
|
+
focusedNodeId: cleanNodeId
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
29
33
|
});
|
|
30
|
-
const
|
|
34
|
+
const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current === (0, _utils.getActiveElement)((0, _ownerDocument.default)(rootRef.current)), [rootRef]);
|
|
35
|
+
const isNodeFocused = React.useCallback(nodeId => state.focusedNodeId === nodeId && isTreeViewFocused(), [state.focusedNodeId, isTreeViewFocused]);
|
|
36
|
+
const isNodeVisible = nodeId => {
|
|
37
|
+
const node = instance.getNode(nodeId);
|
|
38
|
+
return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
|
|
39
|
+
};
|
|
31
40
|
const focusNode = (0, _useEventCallback.default)((event, nodeId) => {
|
|
32
|
-
if
|
|
41
|
+
// if we receive a nodeId, and it is visible, the focus will be set to it
|
|
42
|
+
if (nodeId && isNodeVisible(nodeId)) {
|
|
43
|
+
if (!isTreeViewFocused()) {
|
|
44
|
+
instance.focusRoot();
|
|
45
|
+
}
|
|
33
46
|
setFocusedNodeId(nodeId);
|
|
34
47
|
if (params.onNodeFocus) {
|
|
35
48
|
params.onNodeFocus(event, nodeId);
|
|
36
49
|
}
|
|
37
50
|
}
|
|
38
51
|
});
|
|
52
|
+
const focusDefaultNode = (0, _useEventCallback.default)(event => {
|
|
53
|
+
let nodeToFocusId;
|
|
54
|
+
if (Array.isArray(models.selectedNodes.value)) {
|
|
55
|
+
nodeToFocusId = models.selectedNodes.value.find(isNodeVisible);
|
|
56
|
+
} else if (models.selectedNodes.value != null && isNodeVisible(models.selectedNodes.value)) {
|
|
57
|
+
nodeToFocusId = models.selectedNodes.value;
|
|
58
|
+
}
|
|
59
|
+
if (nodeToFocusId == null) {
|
|
60
|
+
nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
|
|
61
|
+
}
|
|
62
|
+
setFocusedNodeId(nodeToFocusId);
|
|
63
|
+
if (params.onNodeFocus) {
|
|
64
|
+
params.onNodeFocus(event, nodeToFocusId);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
39
67
|
const focusRoot = (0, _useEventCallback.default)(() => {
|
|
40
68
|
rootRef.current?.focus({
|
|
41
69
|
preventScroll: true
|
|
@@ -44,7 +72,11 @@ const useTreeViewFocus = ({
|
|
|
44
72
|
(0, _useTreeView.populateInstance)(instance, {
|
|
45
73
|
isNodeFocused,
|
|
46
74
|
focusNode,
|
|
47
|
-
focusRoot
|
|
75
|
+
focusRoot,
|
|
76
|
+
focusDefaultNode
|
|
77
|
+
});
|
|
78
|
+
(0, _useTreeView.populatePublicAPI)(publicAPI, {
|
|
79
|
+
focusNode
|
|
48
80
|
});
|
|
49
81
|
(0, _useInstanceEventHandler.useInstanceEventHandler)(instance, 'removeNode', ({
|
|
50
82
|
id
|
|
@@ -58,23 +90,9 @@ const useTreeViewFocus = ({
|
|
|
58
90
|
});
|
|
59
91
|
const createHandleFocus = otherHandlers => event => {
|
|
60
92
|
otherHandlers.onFocus?.(event);
|
|
61
|
-
|
|
62
93
|
// if the event bubbled (which is React specific) we don't want to steal focus
|
|
63
94
|
if (event.target === event.currentTarget) {
|
|
64
|
-
|
|
65
|
-
const node = instance.getNode(nodeId);
|
|
66
|
-
return node && (node.parentId == null || instance.isNodeExpanded(node.parentId));
|
|
67
|
-
};
|
|
68
|
-
let nodeToFocusId;
|
|
69
|
-
if (Array.isArray(models.selectedNodes.value)) {
|
|
70
|
-
nodeToFocusId = models.selectedNodes.value.find(isNodeVisible);
|
|
71
|
-
} else if (models.selectedNodes.value != null && isNodeVisible(models.selectedNodes.value)) {
|
|
72
|
-
nodeToFocusId = models.selectedNodes.value;
|
|
73
|
-
}
|
|
74
|
-
if (nodeToFocusId == null) {
|
|
75
|
-
nodeToFocusId = instance.getNavigableChildrenIds(null)[0];
|
|
76
|
-
}
|
|
77
|
-
instance.focusNode(event, nodeToFocusId);
|
|
95
|
+
instance.focusDefaultNode(event);
|
|
78
96
|
}
|
|
79
97
|
};
|
|
80
98
|
const createHandleBlur = otherHandlers => event => {
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.useTreeView = void 0;
|
|
8
|
+
exports.useTreeViewApiInitialization = useTreeViewApiInitialization;
|
|
8
9
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
10
|
var React = _interopRequireWildcard(require("react"));
|
|
10
11
|
var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
|
|
@@ -12,6 +13,16 @@ var _useTreeViewModels = require("./useTreeViewModels");
|
|
|
12
13
|
var _corePlugins = require("../corePlugins");
|
|
13
14
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
14
15
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
16
|
+
function useTreeViewApiInitialization(inputApiRef) {
|
|
17
|
+
const fallbackPublicApiRef = React.useRef({});
|
|
18
|
+
if (inputApiRef) {
|
|
19
|
+
if (inputApiRef.current == null) {
|
|
20
|
+
inputApiRef.current = {};
|
|
21
|
+
}
|
|
22
|
+
return inputApiRef.current;
|
|
23
|
+
}
|
|
24
|
+
return fallbackPublicApiRef.current;
|
|
25
|
+
}
|
|
15
26
|
const useTreeView = inParams => {
|
|
16
27
|
const plugins = [..._corePlugins.TREE_VIEW_CORE_PLUGINS, ...inParams.plugins];
|
|
17
28
|
const params = plugins.reduce((acc, plugin) => {
|
|
@@ -23,6 +34,7 @@ const useTreeView = inParams => {
|
|
|
23
34
|
const models = (0, _useTreeViewModels.useTreeViewModels)(plugins, params);
|
|
24
35
|
const instanceRef = React.useRef({});
|
|
25
36
|
const instance = instanceRef.current;
|
|
37
|
+
const publicAPI = useTreeViewApiInitialization(inParams.apiRef);
|
|
26
38
|
const innerRootRef = React.useRef(null);
|
|
27
39
|
const handleRootRef = (0, _useForkRef.default)(innerRootRef, inParams.rootRef);
|
|
28
40
|
const [state, setState] = React.useState(() => {
|
|
@@ -41,6 +53,7 @@ const useTreeView = inParams => {
|
|
|
41
53
|
const runPlugin = plugin => {
|
|
42
54
|
const pluginResponse = plugin({
|
|
43
55
|
instance,
|
|
56
|
+
publicAPI,
|
|
44
57
|
params,
|
|
45
58
|
slots: params.slots,
|
|
46
59
|
slotProps: params.slotProps,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.populateInstance = exports.getPreviousNode = exports.getNextNode = exports.getLastNode = exports.getFirstNode = void 0;
|
|
6
|
+
exports.populatePublicAPI = exports.populateInstance = exports.getPreviousNode = exports.getNextNode = exports.getLastNode = exports.getFirstNode = void 0;
|
|
7
7
|
const getPreviousNode = (instance, nodeId) => {
|
|
8
8
|
const node = instance.getNode(nodeId);
|
|
9
9
|
const siblings = instance.getNavigableChildrenIds(node.parentId);
|
|
@@ -51,4 +51,8 @@ exports.getFirstNode = getFirstNode;
|
|
|
51
51
|
const populateInstance = (instance, methods) => {
|
|
52
52
|
Object.assign(instance, methods);
|
|
53
53
|
};
|
|
54
|
-
exports.populateInstance = populateInstance;
|
|
54
|
+
exports.populateInstance = populateInstance;
|
|
55
|
+
const populatePublicAPI = (publicAPI, methods) => {
|
|
56
|
+
Object.assign(publicAPI, methods);
|
|
57
|
+
};
|
|
58
|
+
exports.populatePublicAPI = populatePublicAPI;
|
|
@@ -6,12 +6,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.extractPluginParamsFromProps = void 0;
|
|
8
8
|
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
|
|
9
|
-
const _excluded = ["slots", "slotProps"];
|
|
9
|
+
const _excluded = ["slots", "slotProps", "apiRef"];
|
|
10
10
|
const extractPluginParamsFromProps = _ref => {
|
|
11
11
|
let {
|
|
12
12
|
props: {
|
|
13
13
|
slots,
|
|
14
|
-
slotProps
|
|
14
|
+
slotProps,
|
|
15
|
+
apiRef
|
|
15
16
|
},
|
|
16
17
|
plugins,
|
|
17
18
|
rootRef
|
|
@@ -25,7 +26,8 @@ const extractPluginParamsFromProps = _ref => {
|
|
|
25
26
|
plugins,
|
|
26
27
|
rootRef,
|
|
27
28
|
slots: slots ?? {},
|
|
28
|
-
slotProps: slotProps ?? {}
|
|
29
|
+
slotProps: slotProps ?? {},
|
|
30
|
+
apiRef
|
|
29
31
|
};
|
|
30
32
|
const otherProps = {};
|
|
31
33
|
Object.keys(props).forEach(propName => {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getActiveElement = void 0;
|
|
7
|
+
const getActiveElement = (root = document) => {
|
|
8
|
+
const activeEl = root.activeElement;
|
|
9
|
+
if (!activeEl) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
if (activeEl.shadowRoot) {
|
|
13
|
+
return getActiveElement(activeEl.shadowRoot);
|
|
14
|
+
}
|
|
15
|
+
return activeEl;
|
|
16
|
+
};
|
|
17
|
+
exports.getActiveElement = getActiveElement;
|