@mui/x-tree-view 7.0.0-beta.7 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +266 -12
- package/README.md +1 -1
- package/RichTreeView/RichTreeView.js +15 -17
- package/RichTreeView/RichTreeView.types.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.js +3 -4
- package/SimpleTreeView/SimpleTreeView.plugins.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/TreeItem/TreeItem.js +43 -35
- package/TreeItem/TreeItem.types.d.ts +3 -3
- package/TreeItem/TreeItemContent.d.ts +7 -7
- package/TreeItem/TreeItemContent.js +10 -10
- package/TreeItem/treeItemClasses.d.ts +1 -1
- package/TreeItem/useTreeItemState.d.ts +1 -1
- package/TreeItem/useTreeItemState.js +13 -13
- package/TreeItem2/TreeItem2.js +16 -17
- package/TreeItem2Icon/TreeItem2Icon.js +5 -6
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +4 -4
- package/TreeItem2Provider/TreeItem2Provider.js +3 -3
- package/TreeItem2Provider/TreeItem2Provider.types.d.ts +1 -1
- package/TreeView/TreeView.d.ts +1 -1
- package/TreeView/TreeView.js +1 -1
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.d.ts +2 -2
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
- package/hooks/useTreeViewApiRef.d.ts +1 -1
- package/index.js +1 -1
- package/internals/TreeViewProvider/DescendantProvider.d.ts +1 -1
- package/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/internals/hooks/useInstanceEventHandler.js +5 -10
- package/internals/index.d.ts +2 -2
- package/internals/models/plugin.d.ts +1 -1
- package/internals/plugins/defaultPlugins.d.ts +3 -3
- package/internals/plugins/defaultPlugins.js +2 -2
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +17 -24
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +6 -6
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +76 -58
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +9 -8
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +6 -6
- package/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/internals/plugins/useTreeViewId/useTreeViewId.types.d.ts +2 -2
- package/internals/plugins/useTreeViewItems/index.d.ts +2 -0
- package/internals/plugins/useTreeViewItems/index.js +1 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.d.ts +3 -0
- package/{modern/internals/plugins/useTreeViewNodes/useTreeViewNodes.js → internals/plugins/useTreeViewItems/useTreeViewItems.js} +42 -33
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +99 -0
- package/internals/plugins/useTreeViewJSXItems/index.d.ts +2 -0
- package/internals/plugins/useTreeViewJSXItems/index.js +1 -0
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.d.ts +3 -0
- package/{modern/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +41 -40
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.types.d.ts +18 -0
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +85 -96
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +6 -3
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +44 -47
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +8 -8
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +7 -7
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/internals/useTreeView/useTreeView.js +5 -6
- package/internals/useTreeView/useTreeView.utils.d.ts +5 -5
- package/internals/useTreeView/useTreeView.utils.js +18 -18
- package/internals/utils/extractPluginParamsFromProps.js +2 -2
- package/internals/utils/utils.js +1 -0
- package/modern/RichTreeView/RichTreeView.js +11 -11
- package/modern/SimpleTreeView/SimpleTreeView.js +1 -1
- package/modern/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/modern/TreeItem/TreeItem.js +31 -22
- package/modern/TreeItem/TreeItemContent.js +10 -10
- package/modern/TreeItem/useTreeItemState.js +13 -13
- package/modern/TreeItem2/TreeItem2.js +11 -11
- package/modern/TreeItem2Provider/TreeItem2Provider.js +3 -3
- package/modern/TreeView/TreeView.js +1 -1
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
- package/modern/index.js +1 -1
- package/modern/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/modern/internals/plugins/defaultPlugins.js +2 -2
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +14 -14
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +74 -53
- package/modern/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/modern/internals/plugins/useTreeViewItems/index.js +1 -0
- package/{internals/plugins/useTreeViewNodes/useTreeViewNodes.js → modern/internals/plugins/useTreeViewItems/useTreeViewItems.js} +46 -41
- package/modern/internals/plugins/useTreeViewJSXItems/index.js +1 -0
- package/{internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.js → modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js} +41 -41
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +85 -94
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +40 -40
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/modern/internals/useTreeView/useTreeView.js +3 -4
- package/modern/internals/useTreeView/useTreeView.utils.js +18 -18
- package/modern/internals/utils/utils.js +1 -0
- package/modern/useTreeItem2/useTreeItem2.js +23 -12
- package/node/RichTreeView/RichTreeView.js +11 -11
- package/node/SimpleTreeView/SimpleTreeView.js +1 -1
- package/node/SimpleTreeView/SimpleTreeView.plugins.js +2 -2
- package/node/TreeItem/TreeItem.js +31 -22
- package/node/TreeItem/TreeItemContent.js +10 -10
- package/node/TreeItem/useTreeItemState.js +13 -13
- package/node/TreeItem2/TreeItem2.js +11 -11
- package/node/TreeItem2Provider/TreeItem2Provider.js +3 -3
- package/node/TreeView/TreeView.js +1 -1
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +12 -12
- package/node/index.js +1 -1
- package/node/internals/TreeViewProvider/DescendantProvider.js +1 -1
- package/node/internals/plugins/defaultPlugins.js +2 -2
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +14 -14
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +74 -53
- package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
- package/node/internals/plugins/useTreeViewItems/index.js +12 -0
- package/node/internals/plugins/{useTreeViewNodes/useTreeViewNodes.js → useTreeViewItems/useTreeViewItems.js} +44 -35
- package/node/internals/plugins/useTreeViewJSXItems/index.js +12 -0
- package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.js → useTreeViewJSXItems/useTreeViewJSXItems.js} +43 -42
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +84 -93
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +39 -39
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +5 -5
- package/node/internals/useTreeView/useTreeView.js +3 -4
- package/node/internals/useTreeView/useTreeView.utils.js +23 -23
- package/node/internals/utils/utils.js +1 -0
- package/node/useTreeItem2/useTreeItem2.js +23 -12
- package/package.json +5 -5
- package/useTreeItem2/useTreeItem2.d.ts +1 -1
- package/useTreeItem2/useTreeItem2.js +26 -18
- package/useTreeItem2/useTreeItem2.types.d.ts +9 -7
- package/internals/plugins/useTreeViewJSXNodes/index.d.ts +0 -2
- package/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.d.ts +0 -3
- package/internals/plugins/useTreeViewJSXNodes/useTreeViewJSXNodes.types.d.ts +0 -18
- package/internals/plugins/useTreeViewNodes/index.d.ts +0 -2
- package/internals/plugins/useTreeViewNodes/index.js +0 -1
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.d.ts +0 -3
- package/internals/plugins/useTreeViewNodes/useTreeViewNodes.types.d.ts +0 -88
- package/modern/internals/plugins/useTreeViewJSXNodes/index.js +0 -1
- package/modern/internals/plugins/useTreeViewNodes/index.js +0 -1
- package/node/internals/plugins/useTreeViewJSXNodes/index.js +0 -12
- package/node/internals/plugins/useTreeViewNodes/index.js +0 -12
- /package/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
- /package/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
- /package/modern/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
- /package/modern/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
- /package/node/internals/plugins/{useTreeViewJSXNodes/useTreeViewJSXNodes.types.js → useTreeViewItems/useTreeViewItems.types.js} +0 -0
- /package/node/internals/plugins/{useTreeViewNodes/useTreeViewNodes.types.js → useTreeViewJSXItems/useTreeViewJSXItems.types.js} +0 -0
|
@@ -20,11 +20,11 @@ const useTreeViewExpansion = ({
|
|
|
20
20
|
params.onExpandedItemsChange?.(event, value);
|
|
21
21
|
models.expandedItems.setControlledValue(value);
|
|
22
22
|
};
|
|
23
|
-
const
|
|
24
|
-
return Array.isArray(models.expandedItems.value) ? models.expandedItems.value.indexOf(
|
|
23
|
+
const isItemExpanded = React.useCallback(itemId => {
|
|
24
|
+
return Array.isArray(models.expandedItems.value) ? models.expandedItems.value.indexOf(itemId) !== -1 : false;
|
|
25
25
|
}, [models.expandedItems.value]);
|
|
26
|
-
const
|
|
27
|
-
const
|
|
26
|
+
const isItemExpandable = React.useCallback(itemId => !!instance.getNode(itemId)?.expandable, [instance]);
|
|
27
|
+
const toggleItemExpansion = (0, _useEventCallback.default)((event, itemId) => {
|
|
28
28
|
if (itemId == null) {
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
@@ -40,24 +40,24 @@ const useTreeViewExpansion = ({
|
|
|
40
40
|
}
|
|
41
41
|
setExpandedItems(event, newExpanded);
|
|
42
42
|
});
|
|
43
|
-
const expandAllSiblings = (event,
|
|
44
|
-
const node = instance.getNode(
|
|
43
|
+
const expandAllSiblings = (event, itemId) => {
|
|
44
|
+
const node = instance.getNode(itemId);
|
|
45
45
|
const siblings = instance.getChildrenIds(node.parentId);
|
|
46
|
-
const diff = siblings.filter(child => instance.
|
|
46
|
+
const diff = siblings.filter(child => instance.isItemExpandable(child) && !instance.isItemExpanded(child));
|
|
47
47
|
const newExpanded = models.expandedItems.value.concat(diff);
|
|
48
48
|
if (diff.length > 0) {
|
|
49
49
|
if (params.onItemExpansionToggle) {
|
|
50
|
-
diff.forEach(
|
|
51
|
-
params.onItemExpansionToggle(event,
|
|
50
|
+
diff.forEach(newlyExpandedItemId => {
|
|
51
|
+
params.onItemExpansionToggle(event, newlyExpandedItemId, true);
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
54
|
setExpandedItems(event, newExpanded);
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
57
|
(0, _useTreeView.populateInstance)(instance, {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
isItemExpanded,
|
|
59
|
+
isItemExpandable,
|
|
60
|
+
toggleItemExpansion,
|
|
61
61
|
expandAllSiblings
|
|
62
62
|
});
|
|
63
63
|
};
|
|
@@ -67,9 +67,9 @@ useTreeViewExpansion.models = {
|
|
|
67
67
|
getDefaultValue: params => params.defaultExpandedItems
|
|
68
68
|
}
|
|
69
69
|
};
|
|
70
|
-
const
|
|
70
|
+
const DEFAULT_EXPANDED_ITEMS = [];
|
|
71
71
|
useTreeViewExpansion.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
|
|
72
|
-
defaultExpandedItems: params.defaultExpandedItems ??
|
|
72
|
+
defaultExpandedItems: params.defaultExpandedItems ?? DEFAULT_EXPANDED_ITEMS
|
|
73
73
|
});
|
|
74
74
|
useTreeViewExpansion.params = {
|
|
75
75
|
expandedItems: true,
|
|
@@ -14,6 +14,22 @@ var _useInstanceEventHandler = require("../../hooks/useInstanceEventHandler");
|
|
|
14
14
|
var _utils = require("../../utils/utils");
|
|
15
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); }
|
|
16
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; }
|
|
17
|
+
const useTabbableItemId = (instance, selectedItems) => {
|
|
18
|
+
const isItemVisible = itemId => {
|
|
19
|
+
const node = instance.getNode(itemId);
|
|
20
|
+
return node && (node.parentId == null || instance.isItemExpanded(node.parentId));
|
|
21
|
+
};
|
|
22
|
+
let tabbableItemId;
|
|
23
|
+
if (Array.isArray(selectedItems)) {
|
|
24
|
+
tabbableItemId = selectedItems.find(isItemVisible);
|
|
25
|
+
} else if (selectedItems != null && isItemVisible(selectedItems)) {
|
|
26
|
+
tabbableItemId = selectedItems;
|
|
27
|
+
}
|
|
28
|
+
if (tabbableItemId == null) {
|
|
29
|
+
tabbableItemId = instance.getNavigableChildrenIds(null)[0];
|
|
30
|
+
}
|
|
31
|
+
return tabbableItemId;
|
|
32
|
+
};
|
|
17
33
|
const useTreeViewFocus = ({
|
|
18
34
|
instance,
|
|
19
35
|
publicAPI,
|
|
@@ -23,95 +39,100 @@ const useTreeViewFocus = ({
|
|
|
23
39
|
models,
|
|
24
40
|
rootRef
|
|
25
41
|
}) => {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
42
|
+
const tabbableItemId = useTabbableItemId(instance, models.selectedItems.value);
|
|
43
|
+
const setFocusedItemId = (0, _useEventCallback.default)(itemId => {
|
|
44
|
+
const cleanItemId = typeof itemId === 'function' ? itemId(state.focusedItemId) : itemId;
|
|
45
|
+
if (state.focusedItemId !== cleanItemId) {
|
|
29
46
|
setState(prevState => (0, _extends2.default)({}, prevState, {
|
|
30
|
-
|
|
47
|
+
focusedItemId: cleanItemId
|
|
31
48
|
}));
|
|
32
49
|
}
|
|
33
50
|
});
|
|
34
|
-
const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const node = instance.getNode(
|
|
38
|
-
return node && (node.parentId == null || instance.
|
|
51
|
+
const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current.contains((0, _utils.getActiveElement)((0, _ownerDocument.default)(rootRef.current))), [rootRef]);
|
|
52
|
+
const isItemFocused = React.useCallback(itemId => state.focusedItemId === itemId && isTreeViewFocused(), [state.focusedItemId, isTreeViewFocused]);
|
|
53
|
+
const isItemVisible = itemId => {
|
|
54
|
+
const node = instance.getNode(itemId);
|
|
55
|
+
return node && (node.parentId == null || instance.isItemExpanded(node.parentId));
|
|
39
56
|
};
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
57
|
+
const innerFocusItem = (event, itemId) => {
|
|
58
|
+
const node = instance.getNode(itemId);
|
|
59
|
+
const itemElement = document.getElementById(instance.getTreeItemId(itemId, node.idAttribute));
|
|
60
|
+
if (itemElement) {
|
|
61
|
+
itemElement.focus();
|
|
62
|
+
}
|
|
63
|
+
setFocusedItemId(itemId);
|
|
64
|
+
if (params.onItemFocus) {
|
|
65
|
+
params.onItemFocus(event, itemId);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const focusItem = (0, _useEventCallback.default)((event, itemId) => {
|
|
69
|
+
// If we receive an itemId, and it is visible, the focus will be set to it
|
|
70
|
+
if (isItemVisible(itemId)) {
|
|
71
|
+
innerFocusItem(event, itemId);
|
|
50
72
|
}
|
|
51
73
|
});
|
|
52
|
-
const
|
|
53
|
-
let
|
|
74
|
+
const focusDefaultItem = (0, _useEventCallback.default)(event => {
|
|
75
|
+
let itemToFocusId;
|
|
54
76
|
if (Array.isArray(models.selectedItems.value)) {
|
|
55
|
-
|
|
56
|
-
} else if (models.selectedItems.value != null &&
|
|
57
|
-
|
|
77
|
+
itemToFocusId = models.selectedItems.value.find(isItemVisible);
|
|
78
|
+
} else if (models.selectedItems.value != null && isItemVisible(models.selectedItems.value)) {
|
|
79
|
+
itemToFocusId = models.selectedItems.value;
|
|
58
80
|
}
|
|
59
|
-
if (
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
setFocusedNodeId(nodeToFocusId);
|
|
63
|
-
if (params.onItemFocus) {
|
|
64
|
-
params.onItemFocus(event, nodeToFocusId);
|
|
81
|
+
if (itemToFocusId == null) {
|
|
82
|
+
itemToFocusId = instance.getNavigableChildrenIds(null)[0];
|
|
65
83
|
}
|
|
84
|
+
innerFocusItem(event, itemToFocusId);
|
|
66
85
|
});
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
86
|
+
const removeFocusedItem = (0, _useEventCallback.default)(() => {
|
|
87
|
+
if (state.focusedItemId == null) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const node = instance.getNode(state.focusedItemId);
|
|
91
|
+
if (node) {
|
|
92
|
+
const itemElement = document.getElementById(instance.getTreeItemId(state.focusedItemId, node.idAttribute));
|
|
93
|
+
if (itemElement) {
|
|
94
|
+
itemElement.blur();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
setFocusedItemId(null);
|
|
71
98
|
});
|
|
99
|
+
const canItemBeTabbed = itemId => itemId === tabbableItemId;
|
|
72
100
|
(0, _useTreeView.populateInstance)(instance, {
|
|
73
|
-
|
|
101
|
+
isItemFocused,
|
|
102
|
+
canItemBeTabbed,
|
|
74
103
|
focusItem,
|
|
75
|
-
|
|
76
|
-
|
|
104
|
+
focusDefaultItem,
|
|
105
|
+
removeFocusedItem
|
|
77
106
|
});
|
|
78
107
|
(0, _useTreeView.populatePublicAPI)(publicAPI, {
|
|
79
108
|
focusItem
|
|
80
109
|
});
|
|
81
|
-
(0, _useInstanceEventHandler.useInstanceEventHandler)(instance, '
|
|
110
|
+
(0, _useInstanceEventHandler.useInstanceEventHandler)(instance, 'removeItem', ({
|
|
82
111
|
id
|
|
83
112
|
}) => {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
return oldFocusedNodeId;
|
|
89
|
-
});
|
|
113
|
+
if (state.focusedItemId === id) {
|
|
114
|
+
instance.focusDefaultItem(null);
|
|
115
|
+
}
|
|
90
116
|
});
|
|
91
117
|
const createHandleFocus = otherHandlers => event => {
|
|
92
118
|
otherHandlers.onFocus?.(event);
|
|
93
119
|
// if the event bubbled (which is React specific) we don't want to steal focus
|
|
94
120
|
if (event.target === event.currentTarget) {
|
|
95
|
-
instance.
|
|
121
|
+
instance.focusDefaultItem(event);
|
|
96
122
|
}
|
|
97
123
|
};
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
setFocusedNodeId(null);
|
|
101
|
-
};
|
|
102
|
-
const focusedNode = instance.getNode(state.focusedNodeId);
|
|
103
|
-
const activeDescendant = focusedNode ? instance.getTreeItemId(focusedNode.id, focusedNode.idAttribute) : null;
|
|
124
|
+
const focusedItem = instance.getNode(state.focusedItemId);
|
|
125
|
+
const activeDescendant = focusedItem ? instance.getTreeItemId(focusedItem.id, focusedItem.idAttribute) : null;
|
|
104
126
|
return {
|
|
105
127
|
getRootProps: otherHandlers => ({
|
|
106
128
|
onFocus: createHandleFocus(otherHandlers),
|
|
107
|
-
onBlur: createHandleBlur(otherHandlers),
|
|
108
129
|
'aria-activedescendant': activeDescendant ?? undefined
|
|
109
130
|
})
|
|
110
131
|
};
|
|
111
132
|
};
|
|
112
133
|
exports.useTreeViewFocus = useTreeViewFocus;
|
|
113
134
|
useTreeViewFocus.getInitialState = () => ({
|
|
114
|
-
|
|
135
|
+
focusedItemId: null
|
|
115
136
|
});
|
|
116
137
|
useTreeViewFocus.params = {
|
|
117
138
|
onItemFocus: true
|
|
@@ -15,7 +15,7 @@ const useTreeViewId = ({
|
|
|
15
15
|
params
|
|
16
16
|
}) => {
|
|
17
17
|
const treeId = (0, _useId.default)(params.id);
|
|
18
|
-
const getTreeItemId = React.useCallback((
|
|
18
|
+
const getTreeItemId = React.useCallback((itemId, idAttribute) => idAttribute ?? `${treeId}-${itemId}`, [treeId]);
|
|
19
19
|
(0, _useTreeView.populateInstance)(instance, {
|
|
20
20
|
getTreeItemId
|
|
21
21
|
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "useTreeViewItems", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _useTreeViewItems.useTreeViewItems;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _useTreeViewItems = require("./useTreeViewItems");
|
|
@@ -4,15 +4,14 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.
|
|
7
|
+
exports.useTreeViewItems = void 0;
|
|
8
8
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
9
|
var React = _interopRequireWildcard(require("react"));
|
|
10
|
-
var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
|
|
11
10
|
var _useTreeView = require("../../useTreeView/useTreeView.utils");
|
|
12
11
|
var _publishTreeViewEvent = require("../../utils/publishTreeViewEvent");
|
|
13
12
|
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
13
|
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; }
|
|
15
|
-
const
|
|
14
|
+
const updateItemsState = ({
|
|
16
15
|
items,
|
|
17
16
|
isItemDisabled,
|
|
18
17
|
getItemLabel,
|
|
@@ -54,22 +53,22 @@ const updateNodesState = ({
|
|
|
54
53
|
itemMap
|
|
55
54
|
};
|
|
56
55
|
};
|
|
57
|
-
const
|
|
56
|
+
const useTreeViewItems = ({
|
|
58
57
|
instance,
|
|
59
58
|
publicAPI,
|
|
60
59
|
params,
|
|
61
60
|
state,
|
|
62
61
|
setState
|
|
63
62
|
}) => {
|
|
64
|
-
const getNode = React.useCallback(
|
|
65
|
-
const getItem = React.useCallback(
|
|
66
|
-
const
|
|
67
|
-
if (
|
|
63
|
+
const getNode = React.useCallback(itemId => state.items.nodeMap[itemId], [state.items.nodeMap]);
|
|
64
|
+
const getItem = React.useCallback(itemId => state.items.itemMap[itemId], [state.items.itemMap]);
|
|
65
|
+
const isItemDisabled = React.useCallback(itemId => {
|
|
66
|
+
if (itemId == null) {
|
|
68
67
|
return false;
|
|
69
68
|
}
|
|
70
|
-
let node = instance.getNode(
|
|
69
|
+
let node = instance.getNode(itemId);
|
|
71
70
|
|
|
72
|
-
// This can be called before the
|
|
71
|
+
// This can be called before the item has been added to the item map.
|
|
73
72
|
if (!node) {
|
|
74
73
|
return false;
|
|
75
74
|
}
|
|
@@ -84,56 +83,66 @@ const useTreeViewNodes = ({
|
|
|
84
83
|
}
|
|
85
84
|
return false;
|
|
86
85
|
}, [instance]);
|
|
87
|
-
const getChildrenIds =
|
|
88
|
-
const getNavigableChildrenIds =
|
|
89
|
-
let childrenIds = instance.getChildrenIds(
|
|
86
|
+
const getChildrenIds = React.useCallback(itemId => Object.values(state.items.nodeMap).filter(item => item.parentId === itemId).sort((a, b) => a.index - b.index).map(child => child.id), [state.items.nodeMap]);
|
|
87
|
+
const getNavigableChildrenIds = itemId => {
|
|
88
|
+
let childrenIds = instance.getChildrenIds(itemId);
|
|
90
89
|
if (!params.disabledItemsFocusable) {
|
|
91
|
-
childrenIds = childrenIds.filter(
|
|
90
|
+
childrenIds = childrenIds.filter(item => !instance.isItemDisabled(item));
|
|
92
91
|
}
|
|
93
92
|
return childrenIds;
|
|
94
93
|
};
|
|
94
|
+
const areItemUpdatesPreventedRef = React.useRef(false);
|
|
95
|
+
const preventItemUpdates = React.useCallback(() => {
|
|
96
|
+
areItemUpdatesPreventedRef.current = true;
|
|
97
|
+
}, []);
|
|
98
|
+
const areItemUpdatesPrevented = React.useCallback(() => areItemUpdatesPreventedRef.current, []);
|
|
95
99
|
React.useEffect(() => {
|
|
100
|
+
if (instance.areItemUpdatesPrevented()) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
96
103
|
setState(prevState => {
|
|
97
|
-
const newState =
|
|
104
|
+
const newState = updateItemsState({
|
|
98
105
|
items: params.items,
|
|
99
106
|
isItemDisabled: params.isItemDisabled,
|
|
100
107
|
getItemId: params.getItemId,
|
|
101
108
|
getItemLabel: params.getItemLabel
|
|
102
109
|
});
|
|
103
|
-
Object.values(prevState.
|
|
104
|
-
if (!newState.nodeMap[
|
|
105
|
-
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, '
|
|
106
|
-
id:
|
|
110
|
+
Object.values(prevState.items.nodeMap).forEach(item => {
|
|
111
|
+
if (!newState.nodeMap[item.id]) {
|
|
112
|
+
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeItem', {
|
|
113
|
+
id: item.id
|
|
107
114
|
});
|
|
108
115
|
}
|
|
109
116
|
});
|
|
110
117
|
return (0, _extends2.default)({}, prevState, {
|
|
111
|
-
|
|
118
|
+
items: newState
|
|
112
119
|
});
|
|
113
120
|
});
|
|
114
121
|
}, [instance, setState, params.items, params.isItemDisabled, params.getItemId, params.getItemLabel]);
|
|
115
|
-
const
|
|
116
|
-
const
|
|
122
|
+
const getItemsToRender = () => {
|
|
123
|
+
const getPropsFromItemId = ({
|
|
117
124
|
id,
|
|
118
125
|
children
|
|
119
126
|
}) => {
|
|
120
|
-
const
|
|
127
|
+
const item = state.items.nodeMap[id];
|
|
121
128
|
return {
|
|
122
|
-
label:
|
|
123
|
-
|
|
124
|
-
id:
|
|
125
|
-
children: children?.map(
|
|
129
|
+
label: item.label,
|
|
130
|
+
itemId: item.id,
|
|
131
|
+
id: item.idAttribute,
|
|
132
|
+
children: children?.map(getPropsFromItemId)
|
|
126
133
|
};
|
|
127
134
|
};
|
|
128
|
-
return state.
|
|
135
|
+
return state.items.nodeTree.map(getPropsFromItemId);
|
|
129
136
|
};
|
|
130
137
|
(0, _useTreeView.populateInstance)(instance, {
|
|
131
138
|
getNode,
|
|
132
139
|
getItem,
|
|
133
|
-
|
|
140
|
+
getItemsToRender,
|
|
134
141
|
getChildrenIds,
|
|
135
142
|
getNavigableChildrenIds,
|
|
136
|
-
|
|
143
|
+
isItemDisabled,
|
|
144
|
+
preventItemUpdates,
|
|
145
|
+
areItemUpdatesPrevented
|
|
137
146
|
});
|
|
138
147
|
(0, _useTreeView.populatePublicAPI)(publicAPI, {
|
|
139
148
|
getItem
|
|
@@ -144,19 +153,19 @@ const useTreeViewNodes = ({
|
|
|
144
153
|
}
|
|
145
154
|
};
|
|
146
155
|
};
|
|
147
|
-
exports.
|
|
148
|
-
|
|
149
|
-
|
|
156
|
+
exports.useTreeViewItems = useTreeViewItems;
|
|
157
|
+
useTreeViewItems.getInitialState = params => ({
|
|
158
|
+
items: updateItemsState({
|
|
150
159
|
items: params.items,
|
|
151
160
|
isItemDisabled: params.isItemDisabled,
|
|
152
161
|
getItemId: params.getItemId,
|
|
153
162
|
getItemLabel: params.getItemLabel
|
|
154
163
|
})
|
|
155
164
|
});
|
|
156
|
-
|
|
165
|
+
useTreeViewItems.getDefaultizedParams = params => (0, _extends2.default)({}, params, {
|
|
157
166
|
disabledItemsFocusable: params.disabledItemsFocusable ?? false
|
|
158
167
|
});
|
|
159
|
-
|
|
168
|
+
useTreeViewItems.params = {
|
|
160
169
|
disabledItemsFocusable: true,
|
|
161
170
|
items: true,
|
|
162
171
|
isItemDisabled: true,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "useTreeViewJSXItems", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _useTreeViewJSXItems.useTreeViewJSXItems;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _useTreeViewJSXItems = require("./useTreeViewJSXItems");
|
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.
|
|
7
|
+
exports.useTreeViewJSXItems = void 0;
|
|
8
8
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
9
|
var React = _interopRequireWildcard(require("react"));
|
|
10
10
|
var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
|
|
@@ -16,69 +16,70 @@ var _DescendantProvider = require("../../TreeViewProvider/DescendantProvider");
|
|
|
16
16
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
17
17
|
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); }
|
|
18
18
|
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; }
|
|
19
|
-
const
|
|
19
|
+
const useTreeViewJSXItems = ({
|
|
20
20
|
instance,
|
|
21
21
|
setState
|
|
22
22
|
}) => {
|
|
23
|
-
|
|
23
|
+
instance.preventItemUpdates();
|
|
24
|
+
const insertJSXItem = (0, _useEventCallback.default)(item => {
|
|
24
25
|
setState(prevState => {
|
|
25
|
-
if (prevState.
|
|
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: "${
|
|
26
|
+
if (prevState.items.nodeMap[item.id] != null) {
|
|
27
|
+
throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Tow items were provided with the same id in the \`items\` prop: "${item.id}"`].join('\n'));
|
|
27
28
|
}
|
|
28
29
|
return (0, _extends2.default)({}, prevState, {
|
|
29
|
-
|
|
30
|
-
nodeMap: (0, _extends2.default)({}, prevState.
|
|
31
|
-
[
|
|
30
|
+
items: (0, _extends2.default)({}, prevState.items, {
|
|
31
|
+
nodeMap: (0, _extends2.default)({}, prevState.items.nodeMap, {
|
|
32
|
+
[item.id]: item
|
|
32
33
|
}),
|
|
33
34
|
// For `SimpleTreeView`, we don't have a proper `item` object, so we create a very basic one.
|
|
34
|
-
itemMap: (0, _extends2.default)({}, prevState.
|
|
35
|
-
[
|
|
36
|
-
id:
|
|
37
|
-
label:
|
|
35
|
+
itemMap: (0, _extends2.default)({}, prevState.items.itemMap, {
|
|
36
|
+
[item.id]: {
|
|
37
|
+
id: item.id,
|
|
38
|
+
label: item.label
|
|
38
39
|
}
|
|
39
40
|
})
|
|
40
41
|
})
|
|
41
42
|
});
|
|
42
43
|
});
|
|
43
44
|
});
|
|
44
|
-
const
|
|
45
|
+
const removeJSXItem = (0, _useEventCallback.default)(itemId => {
|
|
45
46
|
setState(prevState => {
|
|
46
|
-
const newNodeMap = (0, _extends2.default)({}, prevState.
|
|
47
|
-
const newItemMap = (0, _extends2.default)({}, prevState.
|
|
48
|
-
delete newNodeMap[
|
|
49
|
-
delete newItemMap[
|
|
47
|
+
const newNodeMap = (0, _extends2.default)({}, prevState.items.nodeMap);
|
|
48
|
+
const newItemMap = (0, _extends2.default)({}, prevState.items.itemMap);
|
|
49
|
+
delete newNodeMap[itemId];
|
|
50
|
+
delete newItemMap[itemId];
|
|
50
51
|
return (0, _extends2.default)({}, prevState, {
|
|
51
|
-
|
|
52
|
+
items: (0, _extends2.default)({}, prevState.items, {
|
|
52
53
|
nodeMap: newNodeMap,
|
|
53
54
|
itemMap: newItemMap
|
|
54
55
|
})
|
|
55
56
|
});
|
|
56
57
|
});
|
|
57
|
-
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, '
|
|
58
|
-
id:
|
|
58
|
+
(0, _publishTreeViewEvent.publishTreeViewEvent)(instance, 'removeItem', {
|
|
59
|
+
id: itemId
|
|
59
60
|
});
|
|
60
61
|
});
|
|
61
|
-
const mapFirstCharFromJSX = (0, _useEventCallback.default)((
|
|
62
|
+
const mapFirstCharFromJSX = (0, _useEventCallback.default)((itemId, firstChar) => {
|
|
62
63
|
instance.updateFirstCharMap(firstCharMap => {
|
|
63
|
-
firstCharMap[
|
|
64
|
+
firstCharMap[itemId] = firstChar;
|
|
64
65
|
return firstCharMap;
|
|
65
66
|
});
|
|
66
67
|
return () => {
|
|
67
68
|
instance.updateFirstCharMap(firstCharMap => {
|
|
68
69
|
const newMap = (0, _extends2.default)({}, firstCharMap);
|
|
69
|
-
delete newMap[
|
|
70
|
+
delete newMap[itemId];
|
|
70
71
|
return newMap;
|
|
71
72
|
});
|
|
72
73
|
};
|
|
73
74
|
});
|
|
74
75
|
(0, _useTreeView.populateInstance)(instance, {
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
insertJSXItem,
|
|
77
|
+
removeJSXItem,
|
|
77
78
|
mapFirstCharFromJSX
|
|
78
79
|
});
|
|
79
80
|
};
|
|
80
|
-
exports.
|
|
81
|
-
const
|
|
81
|
+
exports.useTreeViewJSXItems = useTreeViewJSXItems;
|
|
82
|
+
const useTreeViewJSXItemsItemPlugin = ({
|
|
82
83
|
props,
|
|
83
84
|
rootRef,
|
|
84
85
|
contentRef
|
|
@@ -87,7 +88,7 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
87
88
|
children,
|
|
88
89
|
disabled = false,
|
|
89
90
|
label,
|
|
90
|
-
|
|
91
|
+
itemId,
|
|
91
92
|
id
|
|
92
93
|
} = props;
|
|
93
94
|
const {
|
|
@@ -106,44 +107,44 @@ const useTreeViewJSXNodesItemPlugin = ({
|
|
|
106
107
|
const handleContentRef = (0, _useForkRef.default)(pluginContentRef, contentRef);
|
|
107
108
|
const descendant = React.useMemo(() => ({
|
|
108
109
|
element: treeItemElement,
|
|
109
|
-
id:
|
|
110
|
-
}), [
|
|
110
|
+
id: itemId
|
|
111
|
+
}), [itemId, treeItemElement]);
|
|
111
112
|
const {
|
|
112
113
|
index,
|
|
113
114
|
parentId
|
|
114
115
|
} = (0, _DescendantProvider.useDescendant)(descendant);
|
|
115
116
|
React.useEffect(() => {
|
|
116
|
-
// On the first render a
|
|
117
|
+
// On the first render a item's index will be -1. We want to wait for the real index.
|
|
117
118
|
if (index !== -1) {
|
|
118
|
-
instance.
|
|
119
|
-
id:
|
|
119
|
+
instance.insertJSXItem({
|
|
120
|
+
id: itemId,
|
|
120
121
|
idAttribute: id,
|
|
121
122
|
index,
|
|
122
123
|
parentId,
|
|
123
124
|
expandable,
|
|
124
125
|
disabled
|
|
125
126
|
});
|
|
126
|
-
return () => instance.
|
|
127
|
+
return () => instance.removeJSXItem(itemId);
|
|
127
128
|
}
|
|
128
129
|
return undefined;
|
|
129
|
-
}, [instance, parentId, index,
|
|
130
|
+
}, [instance, parentId, index, itemId, expandable, disabled, id]);
|
|
130
131
|
React.useEffect(() => {
|
|
131
132
|
if (label) {
|
|
132
|
-
return instance.mapFirstCharFromJSX(
|
|
133
|
+
return instance.mapFirstCharFromJSX(itemId, (pluginContentRef.current?.textContent ?? '').substring(0, 1).toLowerCase());
|
|
133
134
|
}
|
|
134
135
|
return undefined;
|
|
135
|
-
}, [instance,
|
|
136
|
+
}, [instance, itemId, label]);
|
|
136
137
|
return {
|
|
137
138
|
contentRef: handleContentRef,
|
|
138
139
|
rootRef: handleRootRef
|
|
139
140
|
};
|
|
140
141
|
};
|
|
141
|
-
|
|
142
|
-
|
|
142
|
+
useTreeViewJSXItems.itemPlugin = useTreeViewJSXItemsItemPlugin;
|
|
143
|
+
useTreeViewJSXItems.wrapItem = ({
|
|
143
144
|
children,
|
|
144
|
-
|
|
145
|
+
itemId
|
|
145
146
|
}) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_DescendantProvider.DescendantProvider, {
|
|
146
|
-
id:
|
|
147
|
+
id: itemId,
|
|
147
148
|
children: children
|
|
148
149
|
});
|
|
149
|
-
|
|
150
|
+
useTreeViewJSXItems.params = {};
|