@mui/x-tree-view 7.19.0 → 7.21.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 +224 -43
- package/RichTreeView/RichTreeView.js +14 -53
- package/SimpleTreeView/SimpleTreeView.js +8 -8
- package/TreeItem/TreeItem.js +25 -12
- package/TreeItem/TreeItem.types.d.ts +6 -4
- package/TreeItem/TreeItemContent.d.ts +5 -5
- package/TreeItem/TreeItemContent.js +29 -33
- package/TreeItem/treeItemClasses.d.ts +1 -1
- package/TreeItem2/TreeItem2.types.d.ts +1 -1
- package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +7 -7
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +1 -1
- package/TreeView/TreeView.d.ts +1 -1
- package/TreeView/TreeView.js +8 -8
- package/index.js +1 -1
- package/internals/components/RichTreeViewItems.d.ts +35 -0
- package/internals/components/RichTreeViewItems.js +56 -0
- package/internals/corePlugins/corePlugins.d.ts +1 -1
- package/internals/corePlugins/corePlugins.js +1 -1
- package/internals/corePlugins/useTreeViewId/useTreeViewId.js +3 -3
- package/internals/corePlugins/useTreeViewId/useTreeViewId.types.d.ts +1 -1
- package/internals/corePlugins/useTreeViewId/useTreeViewId.utils.d.ts +1 -1
- package/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +1 -1
- package/internals/index.d.ts +1 -0
- package/internals/index.js +1 -0
- package/internals/models/treeView.d.ts +2 -2
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +2 -2
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +1 -1
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/index.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +8 -8
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +1 -1
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +3 -3
- package/modern/RichTreeView/RichTreeView.js +14 -53
- package/modern/SimpleTreeView/SimpleTreeView.js +8 -8
- package/modern/TreeItem/TreeItem.js +25 -12
- package/modern/TreeItem/TreeItemContent.js +29 -33
- package/modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +7 -7
- package/modern/TreeView/TreeView.js +8 -8
- package/modern/index.js +1 -1
- package/modern/internals/components/RichTreeViewItems.js +56 -0
- package/modern/internals/corePlugins/corePlugins.js +1 -1
- package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.js +3 -3
- package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +1 -1
- package/modern/internals/index.js +1 -0
- package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
- package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
- package/modern/useTreeItem2/useTreeItem2.js +11 -11
- package/node/RichTreeView/RichTreeView.js +14 -53
- package/node/SimpleTreeView/SimpleTreeView.js +8 -8
- package/node/TreeItem/TreeItem.js +25 -12
- package/node/TreeItem/TreeItemContent.js +29 -33
- package/node/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +7 -7
- package/node/TreeView/TreeView.js +8 -8
- package/node/index.js +1 -1
- package/node/internals/components/RichTreeViewItems.js +64 -0
- package/node/internals/corePlugins/corePlugins.js +1 -1
- package/node/internals/corePlugins/useTreeViewId/useTreeViewId.js +3 -3
- package/node/internals/corePlugins/useTreeViewId/useTreeViewId.utils.js +1 -1
- package/node/internals/index.js +7 -0
- package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +3 -3
- package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
- package/node/useTreeItem2/useTreeItem2.js +11 -11
- package/package.json +4 -4
- package/useTreeItem2/index.d.ts +1 -1
- package/useTreeItem2/useTreeItem2.js +11 -11
- package/useTreeItem2/useTreeItem2.types.d.ts +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { TreeViewItemId } from '../../../models';
|
|
2
2
|
export declare const createTreeViewDefaultId: () => string;
|
|
3
3
|
/**
|
|
4
|
-
* Generate the id attribute (i.e.: the `id` attribute passed to the DOM element) of a
|
|
4
|
+
* Generate the id attribute (i.e.: the `id` attribute passed to the DOM element) of a Tree Item.
|
|
5
5
|
* If the user explicitly defined an id attribute, it will be returned.
|
|
6
6
|
* Otherwise, the method creates a unique id for the item based on the Tree View id attribute and the item `itemId`
|
|
7
7
|
* @param {object} params The parameters to determine the id attribute of the item.
|
|
@@ -5,7 +5,7 @@ export const createTreeViewDefaultId = () => {
|
|
|
5
5
|
};
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* Generate the id attribute (i.e.: the `id` attribute passed to the DOM element) of a
|
|
8
|
+
* Generate the id attribute (i.e.: the `id` attribute passed to the DOM element) of a Tree Item.
|
|
9
9
|
* If the user explicitly defined an id attribute, it will be returned.
|
|
10
10
|
* Otherwise, the method creates a unique id for the item based on the Tree View id attribute and the item `itemId`
|
|
11
11
|
* @param {object} params The parameters to determine the id attribute of the item.
|
package/internals/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { useTreeView } from './useTreeView';
|
|
2
2
|
export { TreeViewProvider, useTreeViewContext } from './TreeViewProvider';
|
|
3
|
+
export { RichTreeViewItems } from './components/RichTreeViewItems';
|
|
3
4
|
export { unstable_resetCleanupTracking } from './hooks/useInstanceEventHandler';
|
|
4
5
|
export type { TreeViewPlugin, TreeViewPluginSignature, ConvertPluginsIntoSignatures, MergeSignaturesProperty, TreeViewPublicAPI, TreeViewExperimentalFeatures, TreeViewItemMeta, TreeViewInstance, DefaultizedProps, TreeViewItemPlugin, MuiCancellableEvent, MuiCancellableEventHandler, } from './models';
|
|
5
6
|
export type { TreeViewCorePluginParameters } from './corePlugins';
|
package/internals/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { useTreeView } from "./useTreeView/index.js";
|
|
2
2
|
export { TreeViewProvider, useTreeViewContext } from "./TreeViewProvider/index.js";
|
|
3
|
+
export { RichTreeViewItems } from "./components/RichTreeViewItems.js";
|
|
3
4
|
export { unstable_resetCleanupTracking } from "./hooks/useInstanceEventHandler.js";
|
|
4
5
|
|
|
5
6
|
// Core plugins
|
|
@@ -8,11 +8,11 @@ export interface TreeViewItemMeta {
|
|
|
8
8
|
expandable: boolean;
|
|
9
9
|
disabled: boolean;
|
|
10
10
|
/**
|
|
11
|
-
* Only defined for
|
|
11
|
+
* Only defined for `<RichTreeView />` and `<RichTreeViewPro />`.
|
|
12
12
|
*/
|
|
13
13
|
depth?: number;
|
|
14
14
|
/**
|
|
15
|
-
* Only defined for
|
|
15
|
+
* Only defined for `<RichTreeView />` and `<RichTreeViewPro />`.
|
|
16
16
|
*/
|
|
17
17
|
label?: string;
|
|
18
18
|
}
|
|
@@ -54,13 +54,13 @@ export interface UseTreeViewExpansionParameters {
|
|
|
54
54
|
*/
|
|
55
55
|
defaultExpandedItems?: string[];
|
|
56
56
|
/**
|
|
57
|
-
* Callback fired when
|
|
57
|
+
* Callback fired when Tree Items are expanded/collapsed.
|
|
58
58
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
59
59
|
* @param {array} itemIds The ids of the expanded items.
|
|
60
60
|
*/
|
|
61
61
|
onExpandedItemsChange?: (event: React.SyntheticEvent, itemIds: string[]) => void;
|
|
62
62
|
/**
|
|
63
|
-
* Callback fired when a
|
|
63
|
+
* Callback fired when a Tree Item is expanded or collapsed.
|
|
64
64
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
65
65
|
* @param {array} itemId The itemId of the modified item.
|
|
66
66
|
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
@@ -37,7 +37,7 @@ export interface UseTreeViewFocusInstance extends UseTreeViewFocusPublicAPI {
|
|
|
37
37
|
}
|
|
38
38
|
export interface UseTreeViewFocusParameters {
|
|
39
39
|
/**
|
|
40
|
-
* Callback fired when a given
|
|
40
|
+
* Callback fired when a given Tree Item is focused.
|
|
41
41
|
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
42
42
|
* @param {string} itemId The id of the focused item.
|
|
43
43
|
*/
|
|
@@ -17,7 +17,7 @@ interface UseTreeViewIconsSlots {
|
|
|
17
17
|
expandIcon?: React.ElementType;
|
|
18
18
|
/**
|
|
19
19
|
* The default icon displayed next to an end item.
|
|
20
|
-
* This is applied to all
|
|
20
|
+
* This is applied to all Tree Items and can be overridden by the TreeItem `icon` slot prop.
|
|
21
21
|
*/
|
|
22
22
|
endIcon?: React.ElementType;
|
|
23
23
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { useTreeViewItems } from './useTreeViewItems';
|
|
2
|
-
export type { UseTreeViewItemsSignature, UseTreeViewItemsParameters, UseTreeViewItemsDefaultizedParameters, UseTreeViewItemsState, } from './useTreeViewItems.types';
|
|
2
|
+
export type { UseTreeViewItemsSignature, UseTreeViewItemsParameters, UseTreeViewItemsDefaultizedParameters, UseTreeViewItemsState, TreeViewItemToRenderProps, } from './useTreeViewItems.types';
|
|
3
3
|
export { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from './useTreeViewItems.utils';
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { TreeViewItemMeta, DefaultizedProps, TreeViewPluginSignature } from '../../models';
|
|
3
3
|
import { TreeViewBaseItem, TreeViewItemId } from '../../../models';
|
|
4
|
-
interface
|
|
4
|
+
export interface TreeViewItemToRenderProps {
|
|
5
5
|
label: string;
|
|
6
6
|
itemId: string;
|
|
7
7
|
id: string | undefined;
|
|
8
|
-
children?:
|
|
8
|
+
children?: TreeViewItemToRenderProps[];
|
|
9
9
|
}
|
|
10
10
|
export interface UseTreeViewItemsPublicAPI<R extends {}> {
|
|
11
11
|
/**
|
|
12
12
|
* Get the item with the given id.
|
|
13
|
-
* When used in the
|
|
13
|
+
* When used in the Simple Tree View, it returns an object with the `id` and `label` properties.
|
|
14
14
|
* @param {string} itemId The id of the item to retrieve.
|
|
15
15
|
* @returns {R} The item with the given id.
|
|
16
16
|
*/
|
|
@@ -31,7 +31,7 @@ export interface UseTreeViewItemsPublicAPI<R extends {}> {
|
|
|
31
31
|
getItemOrderedChildrenIds: (itemId: TreeViewItemId | null) => TreeViewItemId[];
|
|
32
32
|
/**
|
|
33
33
|
* Get all the items in the same format as provided by `props.items`.
|
|
34
|
-
* @returns {
|
|
34
|
+
* @returns {TreeViewItemToRenderProps[]} The items in the tree.
|
|
35
35
|
*/
|
|
36
36
|
getItemTree: () => TreeViewBaseItem[];
|
|
37
37
|
}
|
|
@@ -46,10 +46,10 @@ export interface UseTreeViewItemsInstance<R extends {}> extends UseTreeViewItems
|
|
|
46
46
|
/**
|
|
47
47
|
* Get the item that should be rendered.
|
|
48
48
|
* This method is only used on Rich Tree View components.
|
|
49
|
-
* Check the `
|
|
50
|
-
* @returns {
|
|
49
|
+
* Check the `TreeViewItemToRenderProps` type for more information.
|
|
50
|
+
* @returns {TreeViewItemToRenderProps[]} The items to render.
|
|
51
51
|
*/
|
|
52
|
-
getItemsToRender: () =>
|
|
52
|
+
getItemsToRender: () => TreeViewItemToRenderProps[];
|
|
53
53
|
/**
|
|
54
54
|
* Check if a given item is disabled.
|
|
55
55
|
* An item is disabled if it was marked as disabled or if one of its ancestors is disabled.
|
|
@@ -117,7 +117,7 @@ export interface UseTreeViewItemsParameters<R extends {
|
|
|
117
117
|
*/
|
|
118
118
|
getItemId?: (item: R) => TreeViewItemId;
|
|
119
119
|
/**
|
|
120
|
-
* Callback fired when the `content` slot of a given
|
|
120
|
+
* Callback fired when the `content` slot of a given Tree Item is clicked.
|
|
121
121
|
* @param {React.MouseEvent} event The DOM event that triggered the change.
|
|
122
122
|
* @param {string} itemId The id of the focused item.
|
|
123
123
|
*/
|
|
@@ -25,7 +25,7 @@ export const useTreeViewJSXItems = ({
|
|
|
25
25
|
itemMetaMap: _extends({}, prevState.items.itemMetaMap, {
|
|
26
26
|
[item.id]: item
|
|
27
27
|
}),
|
|
28
|
-
// For
|
|
28
|
+
// For Simple Tree View, we don't have a proper `item` object, so we create a very basic one.
|
|
29
29
|
itemMap: _extends({}, prevState.items.itemMap, {
|
|
30
30
|
[item.id]: {
|
|
31
31
|
id: item.id,
|
|
@@ -4,7 +4,7 @@ import useEventCallback from '@mui/utils/useEventCallback';
|
|
|
4
4
|
import { getFirstNavigableItem, getLastNavigableItem, getNextNavigableItem, getPreviousNavigableItem, isTargetInDescendants } from "../../utils/tree.js";
|
|
5
5
|
import { hasPlugin } from "../../utils/plugins.js";
|
|
6
6
|
import { useTreeViewLabel } from "../useTreeViewLabel/index.js";
|
|
7
|
-
function
|
|
7
|
+
function isPrintableKey(string) {
|
|
8
8
|
return !!string && string.length === 1 && !!string.match(/\S/);
|
|
9
9
|
}
|
|
10
10
|
export const useTreeViewKeyboardNavigation = ({
|
|
@@ -227,7 +227,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
227
227
|
|
|
228
228
|
// Multi select behavior when pressing Ctrl + a
|
|
229
229
|
// Selects all the items
|
|
230
|
-
case
|
|
230
|
+
case String.fromCharCode(event.keyCode) === 'A' && ctrlPressed && params.multiSelect && !params.disableSelection:
|
|
231
231
|
{
|
|
232
232
|
instance.selectAllNavigableItems(event);
|
|
233
233
|
event.preventDefault();
|
|
@@ -236,7 +236,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
236
236
|
|
|
237
237
|
// Type-ahead
|
|
238
238
|
// TODO: Support typing multiple characters
|
|
239
|
-
case !ctrlPressed && !event.shiftKey &&
|
|
239
|
+
case !ctrlPressed && !event.shiftKey && isPrintableKey(key):
|
|
240
240
|
{
|
|
241
241
|
const matchingItem = getFirstMatchingItem(itemId, key);
|
|
242
242
|
if (matchingItem != null) {
|
|
@@ -73,7 +73,7 @@ useTreeViewLabel.getDefaultizedParams = ({
|
|
|
73
73
|
const canUseFeature = experimentalFeatures?.labelEditing;
|
|
74
74
|
if (process.env.NODE_ENV !== 'production') {
|
|
75
75
|
if (params.isItemEditable && !canUseFeature) {
|
|
76
|
-
warnOnce(['MUI X: The label editing feature requires the `labelEditing` experimental feature to be enabled.', 'You can do it by passing `experimentalFeatures={{ labelEditing: true}}` to the
|
|
76
|
+
warnOnce(['MUI X: The label editing feature requires the `labelEditing` experimental feature to be enabled.', 'You can do it by passing `experimentalFeatures={{ labelEditing: true}}` to the Rich Tree View Pro component.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/rich-tree-view/editing/']);
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
return _extends({}, params, {
|
|
@@ -37,7 +37,7 @@ export interface UseTreeViewLabelInstance extends UseTreeViewLabelPublicAPI {
|
|
|
37
37
|
*/
|
|
38
38
|
isItemEditable: (itemId: TreeViewItemId) => boolean;
|
|
39
39
|
/**
|
|
40
|
-
* Set to `true` if the
|
|
40
|
+
* Set to `true` if the Tree View is editable.
|
|
41
41
|
*/
|
|
42
42
|
isTreeViewEditable: boolean;
|
|
43
43
|
}
|
|
@@ -80,19 +80,19 @@ export interface UseTreeViewSelectionParameters<Multiple extends boolean | undef
|
|
|
80
80
|
*/
|
|
81
81
|
multiSelect?: Multiple;
|
|
82
82
|
/**
|
|
83
|
-
* If `true`, the
|
|
83
|
+
* If `true`, the Tree View renders a checkbox at the left of its label that allows selecting it.
|
|
84
84
|
* @default false
|
|
85
85
|
*/
|
|
86
86
|
checkboxSelection?: boolean;
|
|
87
87
|
/**
|
|
88
|
-
* Callback fired when
|
|
88
|
+
* Callback fired when Tree Items are selected/deselected.
|
|
89
89
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
90
90
|
* @param {string[] | string} itemIds The ids of the selected items.
|
|
91
91
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
92
92
|
*/
|
|
93
93
|
onSelectedItemsChange?: (event: React.SyntheticEvent, itemIds: TreeViewSelectionValue<Multiple>) => void;
|
|
94
94
|
/**
|
|
95
|
-
* Callback fired when a
|
|
95
|
+
* Callback fired when a Tree Item is selected or deselected.
|
|
96
96
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
97
97
|
* @param {array} itemId The itemId of the modified item.
|
|
98
98
|
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
@@ -11,7 +11,7 @@ import { styled, createUseThemeProps } from "../internals/zero-styled/index.js";
|
|
|
11
11
|
import { useTreeView } from "../internals/useTreeView/index.js";
|
|
12
12
|
import { TreeViewProvider } from "../internals/TreeViewProvider/index.js";
|
|
13
13
|
import { RICH_TREE_VIEW_PLUGINS } from "./RichTreeView.plugins.js";
|
|
14
|
-
import {
|
|
14
|
+
import { RichTreeViewItems } from "../internals/components/RichTreeViewItems.js";
|
|
15
15
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
16
|
const useThemeProps = createUseThemeProps('MuiRichTreeView');
|
|
17
17
|
const useUtilityClasses = ownerState => {
|
|
@@ -34,33 +34,6 @@ export const RichTreeViewRoot = styled('ul', {
|
|
|
34
34
|
outline: 0,
|
|
35
35
|
position: 'relative'
|
|
36
36
|
});
|
|
37
|
-
function WrappedTreeItem({
|
|
38
|
-
slots,
|
|
39
|
-
slotProps,
|
|
40
|
-
label,
|
|
41
|
-
id,
|
|
42
|
-
itemId,
|
|
43
|
-
children
|
|
44
|
-
}) {
|
|
45
|
-
const Item = slots?.item ?? TreeItem;
|
|
46
|
-
const itemProps = useSlotProps({
|
|
47
|
-
elementType: Item,
|
|
48
|
-
externalSlotProps: slotProps?.item,
|
|
49
|
-
additionalProps: {
|
|
50
|
-
itemId,
|
|
51
|
-
id,
|
|
52
|
-
label
|
|
53
|
-
},
|
|
54
|
-
ownerState: {
|
|
55
|
-
itemId,
|
|
56
|
-
label
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
return /*#__PURE__*/_jsx(Item, _extends({}, itemProps, {
|
|
60
|
-
children: children
|
|
61
|
-
}));
|
|
62
|
-
}
|
|
63
|
-
|
|
64
37
|
/**
|
|
65
38
|
*
|
|
66
39
|
* Demos:
|
|
@@ -78,7 +51,7 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
|
|
|
78
51
|
});
|
|
79
52
|
if (process.env.NODE_ENV !== 'production') {
|
|
80
53
|
if (props.children != null) {
|
|
81
|
-
warnOnce(['MUI X: The
|
|
54
|
+
warnOnce(['MUI X: The Rich Tree View 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/.']);
|
|
82
55
|
}
|
|
83
56
|
}
|
|
84
57
|
const {
|
|
@@ -103,26 +76,14 @@ const RichTreeView = /*#__PURE__*/React.forwardRef(function RichTreeView(inProps
|
|
|
103
76
|
getSlotProps: getRootProps,
|
|
104
77
|
ownerState: props
|
|
105
78
|
});
|
|
106
|
-
const itemsToRender = instance.getItemsToRender();
|
|
107
|
-
const renderItem = ({
|
|
108
|
-
label,
|
|
109
|
-
itemId,
|
|
110
|
-
id,
|
|
111
|
-
children
|
|
112
|
-
}) => {
|
|
113
|
-
return /*#__PURE__*/_jsx(WrappedTreeItem, {
|
|
114
|
-
slots: slots,
|
|
115
|
-
slotProps: slotProps,
|
|
116
|
-
label: label,
|
|
117
|
-
id: id,
|
|
118
|
-
itemId: itemId,
|
|
119
|
-
children: children?.map(renderItem)
|
|
120
|
-
}, itemId);
|
|
121
|
-
};
|
|
122
79
|
return /*#__PURE__*/_jsx(TreeViewProvider, {
|
|
123
80
|
value: contextValue,
|
|
124
81
|
children: /*#__PURE__*/_jsx(Root, _extends({}, rootProps, {
|
|
125
|
-
children:
|
|
82
|
+
children: /*#__PURE__*/_jsx(RichTreeViewItems, {
|
|
83
|
+
slots: slots,
|
|
84
|
+
slotProps: slotProps,
|
|
85
|
+
itemsToRender: instance.getItemsToRender()
|
|
86
|
+
})
|
|
126
87
|
}))
|
|
127
88
|
});
|
|
128
89
|
});
|
|
@@ -147,7 +108,7 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
147
108
|
})
|
|
148
109
|
}),
|
|
149
110
|
/**
|
|
150
|
-
* If `true`, the
|
|
111
|
+
* If `true`, the Tree View renders a checkbox at the left of its label that allows selecting it.
|
|
151
112
|
* @default false
|
|
152
113
|
*/
|
|
153
114
|
checkboxSelection: PropTypes.bool,
|
|
@@ -250,26 +211,26 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
250
211
|
*/
|
|
251
212
|
multiSelect: PropTypes.bool,
|
|
252
213
|
/**
|
|
253
|
-
* Callback fired when
|
|
214
|
+
* Callback fired when Tree Items are expanded/collapsed.
|
|
254
215
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
255
216
|
* @param {array} itemIds The ids of the expanded items.
|
|
256
217
|
*/
|
|
257
218
|
onExpandedItemsChange: PropTypes.func,
|
|
258
219
|
/**
|
|
259
|
-
* Callback fired when the `content` slot of a given
|
|
220
|
+
* Callback fired when the `content` slot of a given Tree Item is clicked.
|
|
260
221
|
* @param {React.MouseEvent} event The DOM event that triggered the change.
|
|
261
222
|
* @param {string} itemId The id of the focused item.
|
|
262
223
|
*/
|
|
263
224
|
onItemClick: PropTypes.func,
|
|
264
225
|
/**
|
|
265
|
-
* Callback fired when a
|
|
226
|
+
* Callback fired when a Tree Item is expanded or collapsed.
|
|
266
227
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
267
228
|
* @param {array} itemId The itemId of the modified item.
|
|
268
229
|
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
269
230
|
*/
|
|
270
231
|
onItemExpansionToggle: PropTypes.func,
|
|
271
232
|
/**
|
|
272
|
-
* Callback fired when a given
|
|
233
|
+
* Callback fired when a given Tree Item is focused.
|
|
273
234
|
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
274
235
|
* @param {string} itemId The id of the focused item.
|
|
275
236
|
*/
|
|
@@ -281,14 +242,14 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
281
242
|
*/
|
|
282
243
|
onItemLabelChange: PropTypes.func,
|
|
283
244
|
/**
|
|
284
|
-
* Callback fired when a
|
|
245
|
+
* Callback fired when a Tree Item is selected or deselected.
|
|
285
246
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
286
247
|
* @param {array} itemId The itemId of the modified item.
|
|
287
248
|
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
288
249
|
*/
|
|
289
250
|
onItemSelectionToggle: PropTypes.func,
|
|
290
251
|
/**
|
|
291
|
-
* Callback fired when
|
|
252
|
+
* Callback fired when Tree Items are selected/deselected.
|
|
292
253
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
293
254
|
* @param {string[] | string} itemIds The ids of the selected items.
|
|
294
255
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
@@ -53,7 +53,7 @@ const SimpleTreeView = /*#__PURE__*/React.forwardRef(function SimpleTreeView(inP
|
|
|
53
53
|
const ownerState = props;
|
|
54
54
|
if (process.env.NODE_ENV !== 'production') {
|
|
55
55
|
if (props.items != null) {
|
|
56
|
-
warnOnce(['MUI X: The
|
|
56
|
+
warnOnce(['MUI X: The Simple Tree View component does not support the `items` prop.', 'If you want to add items, you need to pass them as JSX children.', 'Check the documentation for more details: https://mui.com/x/react-tree-view/simple-tree-view/items/.']);
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
const {
|
|
@@ -104,7 +104,7 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
104
104
|
})
|
|
105
105
|
}),
|
|
106
106
|
/**
|
|
107
|
-
* If `true`, the
|
|
107
|
+
* If `true`, the Tree View renders a checkbox at the left of its label that allows selecting it.
|
|
108
108
|
* @default false
|
|
109
109
|
*/
|
|
110
110
|
checkboxSelection: PropTypes.bool,
|
|
@@ -174,39 +174,39 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
174
174
|
*/
|
|
175
175
|
multiSelect: PropTypes.bool,
|
|
176
176
|
/**
|
|
177
|
-
* Callback fired when
|
|
177
|
+
* Callback fired when Tree Items are expanded/collapsed.
|
|
178
178
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
179
179
|
* @param {array} itemIds The ids of the expanded items.
|
|
180
180
|
*/
|
|
181
181
|
onExpandedItemsChange: PropTypes.func,
|
|
182
182
|
/**
|
|
183
|
-
* Callback fired when the `content` slot of a given
|
|
183
|
+
* Callback fired when the `content` slot of a given Tree Item is clicked.
|
|
184
184
|
* @param {React.MouseEvent} event The DOM event that triggered the change.
|
|
185
185
|
* @param {string} itemId The id of the focused item.
|
|
186
186
|
*/
|
|
187
187
|
onItemClick: PropTypes.func,
|
|
188
188
|
/**
|
|
189
|
-
* Callback fired when a
|
|
189
|
+
* Callback fired when a Tree Item is expanded or collapsed.
|
|
190
190
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
191
191
|
* @param {array} itemId The itemId of the modified item.
|
|
192
192
|
* @param {array} isExpanded `true` if the item has just been expanded, `false` if it has just been collapsed.
|
|
193
193
|
*/
|
|
194
194
|
onItemExpansionToggle: PropTypes.func,
|
|
195
195
|
/**
|
|
196
|
-
* Callback fired when a given
|
|
196
|
+
* Callback fired when a given Tree Item is focused.
|
|
197
197
|
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
198
198
|
* @param {string} itemId The id of the focused item.
|
|
199
199
|
*/
|
|
200
200
|
onItemFocus: PropTypes.func,
|
|
201
201
|
/**
|
|
202
|
-
* Callback fired when a
|
|
202
|
+
* Callback fired when a Tree Item is selected or deselected.
|
|
203
203
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
204
204
|
* @param {array} itemId The itemId of the modified item.
|
|
205
205
|
* @param {array} isSelected `true` if the item has just been selected, `false` if it has just been deselected.
|
|
206
206
|
*/
|
|
207
207
|
onItemSelectionToggle: PropTypes.func,
|
|
208
208
|
/**
|
|
209
|
-
* Callback fired when
|
|
209
|
+
* Callback fired when Tree Items are selected/deselected.
|
|
210
210
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
211
211
|
* @param {string[] | string} itemIds The ids of the selected items.
|
|
212
212
|
* When `multiSelect` is `true`, this is an array of strings; when false (default) a string.
|
|
@@ -19,6 +19,7 @@ import resolveComponentProps from '@mui/utils/resolveComponentProps';
|
|
|
19
19
|
import useSlotProps from '@mui/utils/useSlotProps';
|
|
20
20
|
import unsupportedProp from '@mui/utils/unsupportedProp';
|
|
21
21
|
import elementTypeAcceptingRef from '@mui/utils/elementTypeAcceptingRef';
|
|
22
|
+
import { warnOnce } from '@mui/x-internals/warning';
|
|
22
23
|
import { styled, createUseThemeProps } from "../internals/zero-styled/index.js";
|
|
23
24
|
import { TreeItemContent } from "./TreeItemContent.js";
|
|
24
25
|
import { treeItemClasses, getTreeItemUtilityClass } from "./treeItemClasses.js";
|
|
@@ -181,7 +182,7 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
181
182
|
indentationAtItemLevel
|
|
182
183
|
},
|
|
183
184
|
selection: {
|
|
184
|
-
|
|
185
|
+
disableSelection
|
|
185
186
|
},
|
|
186
187
|
expansion: {
|
|
187
188
|
expansionTrigger
|
|
@@ -220,6 +221,15 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
220
221
|
handleCancelItemLabelEditing,
|
|
221
222
|
handleSaveItemLabel
|
|
222
223
|
} = useTreeItemState(itemId);
|
|
224
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
225
|
+
// Checking directly the `props` to avoid having the default value applied
|
|
226
|
+
if (props.ContentComponent) {
|
|
227
|
+
warnOnce(['MUI X: The ContentComponent prop of the TreeItem component is deprecated and will be removed in the next major release.', 'You can use the new TreeItem2 component or the new useTreeItem2 hook to customize the rendering of the content.', 'For more detail, see https://mui.com/x/react-tree-view/tree-item-customization/.']);
|
|
228
|
+
}
|
|
229
|
+
if (props.ContentProps) {
|
|
230
|
+
warnOnce(['MUI X: The ContentProps prop of the TreeItem component is deprecated and will be removed in the next major release.', 'You can use the new TreeItem2 component or the new useTreeItem2 hook to customize the rendering of the content.', 'For more detail, see https://mui.com/x/react-tree-view/tree-item-customization/.']);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
223
233
|
const {
|
|
224
234
|
contentRef,
|
|
225
235
|
rootRef,
|
|
@@ -308,17 +318,18 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
308
318
|
}),
|
|
309
319
|
iconProps = _objectWithoutPropertiesLoose(_useSlotProps3, _excluded4);
|
|
310
320
|
const icon = Icon ? /*#__PURE__*/_jsx(Icon, _extends({}, iconProps)) : null;
|
|
321
|
+
|
|
322
|
+
// https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
311
323
|
let ariaSelected;
|
|
312
|
-
if (
|
|
313
|
-
|
|
314
|
-
} else if (selected) {
|
|
315
|
-
/* single-selection trees unset aria-selected on un-selected items.
|
|
316
|
-
*
|
|
317
|
-
* If the tree does not support multiple selection, aria-selected
|
|
318
|
-
* is set to true for the selected item and it is not present on any other item in the tree.
|
|
319
|
-
* Source: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/
|
|
320
|
-
*/
|
|
324
|
+
if (selected) {
|
|
325
|
+
// - each selected node has aria-selected set to true.
|
|
321
326
|
ariaSelected = true;
|
|
327
|
+
} else if (disableSelection || disabled) {
|
|
328
|
+
// - if the tree contains nodes that are not selectable, aria-selected is not present on those nodes.
|
|
329
|
+
ariaSelected = undefined;
|
|
330
|
+
} else {
|
|
331
|
+
// - all nodes that are selectable but not selected have aria-selected set to false.
|
|
332
|
+
ariaSelected = false;
|
|
322
333
|
}
|
|
323
334
|
function handleFocus(event) {
|
|
324
335
|
const canBeFocused = !disabled || disabledItemsFocusable;
|
|
@@ -329,7 +340,7 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
329
340
|
function handleBlur(event) {
|
|
330
341
|
onBlur?.(event);
|
|
331
342
|
if (editing ||
|
|
332
|
-
// we can exit the editing state by clicking outside the input (within the
|
|
343
|
+
// we can exit the editing state by clicking outside the input (within the Tree Item) or by pressing Enter or Escape -> we don't want to remove the focused item from the state in these cases
|
|
333
344
|
// we can also exit the editing state by clicking on the root itself -> want to remove the focused item from the state in this case
|
|
334
345
|
event.relatedTarget && isTargetInDescendants(event.relatedTarget, rootRefObject.current) && (event.target && event.target?.dataset?.element === 'labelInput' && isTargetInDescendants(event.target, rootRefObject.current) || event.relatedTarget?.dataset?.element === 'labelInput')) {
|
|
335
346
|
return;
|
|
@@ -442,11 +453,13 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
|
|
|
442
453
|
className: PropTypes.string,
|
|
443
454
|
/**
|
|
444
455
|
* The component used to render the content of the item.
|
|
456
|
+
* @deprecated Consider using the `<TreeItem2 />` component or the `useTreeItem2` hook instead. For more details, see https://mui.com/x/react-tree-view/tree-item-customization/.
|
|
445
457
|
* @default TreeItemContent
|
|
446
458
|
*/
|
|
447
459
|
ContentComponent: elementTypeAcceptingRef,
|
|
448
460
|
/**
|
|
449
461
|
* Props applied to ContentComponent.
|
|
462
|
+
* @deprecated Consider using the `<TreeItem2 />` component or the `useTreeItem2` hook instead. For more details, see https://mui.com/x/react-tree-view/tree-item-customization/.
|
|
450
463
|
*/
|
|
451
464
|
ContentProps: PropTypes.object,
|
|
452
465
|
/**
|
|
@@ -459,7 +472,7 @@ process.env.NODE_ENV !== "production" ? TreeItem.propTypes = {
|
|
|
459
472
|
*/
|
|
460
473
|
itemId: PropTypes.string.isRequired,
|
|
461
474
|
/**
|
|
462
|
-
* The
|
|
475
|
+
* The Tree Item label.
|
|
463
476
|
*/
|
|
464
477
|
label: PropTypes.node,
|
|
465
478
|
/**
|
|
@@ -73,35 +73,31 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
|
|
|
73
73
|
}
|
|
74
74
|
toggleItemEditing();
|
|
75
75
|
};
|
|
76
|
-
return (
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
children: label
|
|
102
|
-
})), dragAndDropOverlayProps && /*#__PURE__*/_jsx(TreeItem2DragAndDropOverlay, _extends({}, dragAndDropOverlayProps))]
|
|
103
|
-
}))
|
|
104
|
-
);
|
|
76
|
+
return /*#__PURE__*/ /* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions -- Key event is handled by the TreeView */_jsxs("div", _extends({}, other, {
|
|
77
|
+
className: clsx(classes.root, className, expanded && classes.expanded, selected && classes.selected, focused && classes.focused, disabled && classes.disabled, editing && classes.editing, editable && classes.editable),
|
|
78
|
+
onClick: handleClick,
|
|
79
|
+
onMouseDown: handleMouseDown,
|
|
80
|
+
ref: ref,
|
|
81
|
+
children: [/*#__PURE__*/_jsx("div", {
|
|
82
|
+
className: classes.iconContainer,
|
|
83
|
+
children: icon
|
|
84
|
+
}), checkboxSelection && /*#__PURE__*/_jsx(Checkbox, {
|
|
85
|
+
className: classes.checkbox,
|
|
86
|
+
checked: selected,
|
|
87
|
+
onChange: handleCheckboxSelection,
|
|
88
|
+
disabled: disabled || disableSelection,
|
|
89
|
+
ref: checkboxRef,
|
|
90
|
+
tabIndex: -1
|
|
91
|
+
}), editing ? /*#__PURE__*/_jsx(TreeItem2LabelInput, _extends({}, labelInputProps, {
|
|
92
|
+
className: classes.labelInput
|
|
93
|
+
})) : /*#__PURE__*/_jsx("div", _extends({
|
|
94
|
+
className: classes.label
|
|
95
|
+
}, editable && {
|
|
96
|
+
onDoubleClick: handleLabelDoubleClick
|
|
97
|
+
}, {
|
|
98
|
+
children: label
|
|
99
|
+
})), dragAndDropOverlayProps && /*#__PURE__*/_jsx(TreeItem2DragAndDropOverlay, _extends({}, dragAndDropOverlayProps))]
|
|
100
|
+
}));
|
|
105
101
|
});
|
|
106
102
|
process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
107
103
|
// ----------------------------- Warning --------------------------------
|
|
@@ -114,7 +110,7 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
|
114
110
|
classes: PropTypes.object.isRequired,
|
|
115
111
|
className: PropTypes.string,
|
|
116
112
|
/**
|
|
117
|
-
* The icon to display next to the
|
|
113
|
+
* The icon to display next to the Tree Item's label. Either a parent or end icon.
|
|
118
114
|
*/
|
|
119
115
|
displayIcon: PropTypes.node,
|
|
120
116
|
dragAndDropOverlayProps: PropTypes.shape({
|
|
@@ -122,11 +118,11 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
|
122
118
|
style: PropTypes.object
|
|
123
119
|
}),
|
|
124
120
|
/**
|
|
125
|
-
* The icon to display next to the
|
|
121
|
+
* The icon to display next to the Tree Item's label. Either an expansion or collapse icon.
|
|
126
122
|
*/
|
|
127
123
|
expansionIcon: PropTypes.node,
|
|
128
124
|
/**
|
|
129
|
-
* The icon to display next to the
|
|
125
|
+
* The icon to display next to the Tree Item's label.
|
|
130
126
|
*/
|
|
131
127
|
icon: PropTypes.node,
|
|
132
128
|
/**
|
|
@@ -134,7 +130,7 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
|
134
130
|
*/
|
|
135
131
|
itemId: PropTypes.string.isRequired,
|
|
136
132
|
/**
|
|
137
|
-
* The
|
|
133
|
+
* The Tree Item label.
|
|
138
134
|
*/
|
|
139
135
|
label: PropTypes.node,
|
|
140
136
|
labelInputProps: PropTypes.shape({
|