@mui/x-tree-view 7.11.1 → 7.12.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 +110 -4
- package/RichTreeView/RichTreeView.js +9 -4
- package/RichTreeView/RichTreeView.types.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.js +9 -4
- package/SimpleTreeView/SimpleTreeView.types.d.ts +1 -1
- package/TreeItem/TreeItem.js +36 -10
- package/TreeItem/TreeItem.types.d.ts +1 -1
- package/TreeItem/TreeItemContent.d.ts +2 -0
- package/TreeItem/TreeItemContent.js +11 -3
- package/TreeItem/treeItemClasses.d.ts +2 -0
- package/TreeItem/treeItemClasses.js +1 -1
- package/TreeItem/useTreeItemState.d.ts +1 -0
- package/TreeItem/useTreeItemState.js +5 -1
- package/TreeItem2/TreeItem2.js +15 -3
- package/TreeItem2/TreeItem2.types.d.ts +8 -1
- package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.d.ts +4 -0
- package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +69 -0
- package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.d.ts +6 -0
- package/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js +1 -0
- package/TreeItem2DragAndDropOverlay/index.d.ts +2 -0
- package/TreeItem2DragAndDropOverlay/index.js +1 -0
- package/TreeItem2DragAndDropOverlay/package.json +6 -0
- package/TreeItem2Icon/TreeItem2Icon.js +3 -2
- package/TreeItem2Icon/TreeItem2Icon.types.d.ts +1 -1
- package/TreeItem2Provider/TreeItem2Provider.js +1 -1
- package/TreeView/TreeView.js +8 -3
- package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +1 -1
- package/index.js +1 -1
- package/internals/TreeViewProvider/index.d.ts +1 -0
- package/internals/TreeViewProvider/index.js +2 -1
- package/internals/index.d.ts +5 -4
- package/internals/index.js +3 -2
- package/internals/models/index.d.ts +1 -0
- package/internals/models/index.js +2 -1
- package/internals/models/itemPlugin.d.ts +3 -2
- package/internals/models/plugin.d.ts +1 -1
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +2 -3
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/index.d.ts +2 -1
- package/internals/plugins/useTreeViewItems/index.js +2 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.js +6 -2
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +18 -4
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +2 -2
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts +1 -2
- package/internals/useTreeView/useTreeView.types.d.ts +1 -1
- package/internals/utils/tree.d.ts +8 -0
- package/internals/utils/tree.js +11 -0
- package/models/items.d.ts +1 -0
- package/modern/RichTreeView/RichTreeView.js +9 -4
- package/modern/SimpleTreeView/SimpleTreeView.js +9 -4
- package/modern/TreeItem/TreeItem.js +36 -10
- package/modern/TreeItem/TreeItemContent.js +11 -3
- package/modern/TreeItem/treeItemClasses.js +1 -1
- package/modern/TreeItem/useTreeItemState.js +5 -1
- package/modern/TreeItem2/TreeItem2.js +15 -3
- package/modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +69 -0
- package/modern/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js +1 -0
- package/modern/TreeItem2DragAndDropOverlay/index.js +1 -0
- package/modern/TreeItem2Icon/TreeItem2Icon.js +3 -2
- package/modern/TreeItem2Provider/TreeItem2Provider.js +1 -1
- package/modern/TreeView/TreeView.js +8 -3
- package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +1 -1
- package/modern/index.js +1 -1
- package/modern/internals/TreeViewProvider/index.js +2 -1
- package/modern/internals/index.js +3 -2
- package/modern/internals/models/index.js +2 -1
- package/modern/internals/plugins/useTreeViewItems/index.js +2 -1
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +6 -2
- package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +1 -1
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +2 -2
- package/modern/internals/utils/tree.js +11 -0
- package/modern/useTreeItem2/useTreeItem2.js +43 -15
- package/node/RichTreeView/RichTreeView.js +11 -6
- package/node/SimpleTreeView/SimpleTreeView.js +10 -5
- package/node/TreeItem/TreeItem.js +45 -19
- package/node/TreeItem/TreeItemContent.js +11 -3
- package/node/TreeItem/treeItemClasses.js +1 -1
- package/node/TreeItem/useTreeItemState.js +6 -2
- package/node/TreeItem2/TreeItem2.js +21 -9
- package/node/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.js +77 -0
- package/node/TreeItem2DragAndDropOverlay/TreeItem2DragAndDropOverlay.types.js +5 -0
- package/node/TreeItem2DragAndDropOverlay/index.js +12 -0
- package/node/TreeItem2Icon/TreeItem2Icon.js +6 -5
- package/node/TreeItem2Provider/TreeItem2Provider.js +2 -2
- package/node/TreeView/TreeView.js +8 -3
- package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +2 -2
- package/node/index.js +1 -1
- package/node/internals/TreeViewProvider/index.js +8 -1
- package/node/internals/index.js +25 -0
- package/node/internals/models/index.js +11 -0
- package/node/internals/plugins/useTreeViewItems/index.js +14 -1
- package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +6 -2
- package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +2 -2
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +1 -1
- package/node/internals/utils/tree.js +14 -2
- package/node/useTreeItem2/useTreeItem2.js +49 -21
- package/package.json +3 -4
- package/useTreeItem2/index.d.ts +1 -1
- package/useTreeItem2/useTreeItem2.js +43 -15
- package/useTreeItem2/useTreeItem2.types.d.ts +17 -4
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import PropTypes from 'prop-types';
|
|
4
|
-
import
|
|
5
|
-
import
|
|
4
|
+
import resolveComponentProps from '@mui/utils/resolveComponentProps';
|
|
5
|
+
import useSlotProps from '@mui/utils/useSlotProps';
|
|
6
|
+
import { useTreeViewContext } from '../internals/TreeViewProvider';
|
|
6
7
|
import { TreeViewCollapseIcon, TreeViewExpandIcon } from '../icons';
|
|
7
8
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
9
|
function TreeItem2Icon(props) {
|
package/TreeView/TreeView.js
CHANGED
|
@@ -155,6 +155,12 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
155
155
|
* @param {array} itemIds The ids of the expanded items.
|
|
156
156
|
*/
|
|
157
157
|
onExpandedItemsChange: PropTypes.func,
|
|
158
|
+
/**
|
|
159
|
+
* Callback fired when the `content` slot of a given tree item is clicked.
|
|
160
|
+
* @param {React.MouseEvent} event The DOM event that triggered the change.
|
|
161
|
+
* @param {string} itemId The id of the focused item.
|
|
162
|
+
*/
|
|
163
|
+
onItemClick: PropTypes.func,
|
|
158
164
|
/**
|
|
159
165
|
* Callback fired when a tree item is expanded or collapsed.
|
|
160
166
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
@@ -163,10 +169,9 @@ process.env.NODE_ENV !== "production" ? TreeView.propTypes = {
|
|
|
163
169
|
*/
|
|
164
170
|
onItemExpansionToggle: PropTypes.func,
|
|
165
171
|
/**
|
|
166
|
-
* Callback fired when tree
|
|
167
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
172
|
+
* Callback fired when a given tree item is focused.
|
|
173
|
+
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
168
174
|
* @param {string} itemId The id of the focused item.
|
|
169
|
-
* @param {string} value of the focused item.
|
|
170
175
|
*/
|
|
171
176
|
onItemFocus: PropTypes.func,
|
|
172
177
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useTreeViewContext } from '../../internals/TreeViewProvider
|
|
1
|
+
import { useTreeViewContext } from '../../internals/TreeViewProvider';
|
|
2
2
|
const isItemExpandable = reactChildren => {
|
|
3
3
|
if (Array.isArray(reactChildren)) {
|
|
4
4
|
return reactChildren.length > 0 && reactChildren.some(isItemExpandable);
|
package/index.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export { TreeViewProvider } from './TreeViewProvider';
|
|
1
|
+
export { TreeViewProvider } from './TreeViewProvider';
|
|
2
|
+
export { useTreeViewContext } from './useTreeViewContext';
|
package/internals/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { useTreeView } from './useTreeView';
|
|
2
|
-
export { TreeViewProvider } from './TreeViewProvider';
|
|
2
|
+
export { TreeViewProvider, useTreeViewContext } from './TreeViewProvider';
|
|
3
3
|
export { unstable_resetCleanupTracking } from './hooks/useInstanceEventHandler';
|
|
4
|
-
export type { TreeViewPlugin, TreeViewPluginSignature, ConvertPluginsIntoSignatures, MergeSignaturesProperty, TreeViewPublicAPI, TreeViewExperimentalFeatures, } from './models';
|
|
4
|
+
export type { TreeViewPlugin, TreeViewPluginSignature, ConvertPluginsIntoSignatures, MergeSignaturesProperty, TreeViewPublicAPI, TreeViewExperimentalFeatures, TreeViewItemMeta, TreeViewInstance, DefaultizedProps, TreeViewItemPlugin, MuiCancellableEvent, MuiCancellableEventHandler, } from './models';
|
|
5
5
|
export type { TreeViewCorePluginParameters } from './corePlugins';
|
|
6
6
|
export { useTreeViewExpansion } from './plugins/useTreeViewExpansion';
|
|
7
7
|
export type { UseTreeViewExpansionSignature, UseTreeViewExpansionParameters, } from './plugins/useTreeViewExpansion';
|
|
@@ -13,8 +13,9 @@ export { useTreeViewKeyboardNavigation } from './plugins/useTreeViewKeyboardNavi
|
|
|
13
13
|
export type { UseTreeViewKeyboardNavigationSignature } from './plugins/useTreeViewKeyboardNavigation';
|
|
14
14
|
export { useTreeViewIcons } from './plugins/useTreeViewIcons';
|
|
15
15
|
export type { UseTreeViewIconsSignature, UseTreeViewIconsParameters, } from './plugins/useTreeViewIcons';
|
|
16
|
-
export { useTreeViewItems } from './plugins/useTreeViewItems';
|
|
17
|
-
export type { UseTreeViewItemsSignature, UseTreeViewItemsParameters, } from './plugins/useTreeViewItems';
|
|
16
|
+
export { useTreeViewItems, buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID, } from './plugins/useTreeViewItems';
|
|
17
|
+
export type { UseTreeViewItemsSignature, UseTreeViewItemsParameters, UseTreeViewItemsState, } from './plugins/useTreeViewItems';
|
|
18
18
|
export { useTreeViewJSXItems } from './plugins/useTreeViewJSXItems';
|
|
19
19
|
export type { UseTreeViewJSXItemsSignature, UseTreeViewJSXItemsParameters, } from './plugins/useTreeViewJSXItems';
|
|
20
|
+
export { isTargetInDescendants } from './utils/tree';
|
|
20
21
|
export { warnOnce } from './utils/warning';
|
package/internals/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { useTreeView } from './useTreeView';
|
|
2
|
-
export { TreeViewProvider } from './TreeViewProvider';
|
|
2
|
+
export { TreeViewProvider, useTreeViewContext } from './TreeViewProvider';
|
|
3
3
|
export { unstable_resetCleanupTracking } from './hooks/useInstanceEventHandler';
|
|
4
4
|
|
|
5
5
|
// Core plugins
|
|
@@ -10,6 +10,7 @@ export { useTreeViewSelection } from './plugins/useTreeViewSelection';
|
|
|
10
10
|
export { useTreeViewFocus } from './plugins/useTreeViewFocus';
|
|
11
11
|
export { useTreeViewKeyboardNavigation } from './plugins/useTreeViewKeyboardNavigation';
|
|
12
12
|
export { useTreeViewIcons } from './plugins/useTreeViewIcons';
|
|
13
|
-
export { useTreeViewItems } from './plugins/useTreeViewItems';
|
|
13
|
+
export { useTreeViewItems, buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from './plugins/useTreeViewItems';
|
|
14
14
|
export { useTreeViewJSXItems } from './plugins/useTreeViewJSXItems';
|
|
15
|
+
export { isTargetInDescendants } from './utils/tree';
|
|
15
16
|
export { warnOnce } from './utils/warning';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { EventHandlers } from '@mui/
|
|
3
|
-
import type { UseTreeItem2ContentSlotOwnProps, UseTreeItem2RootSlotOwnProps } from '../../useTreeItem2';
|
|
2
|
+
import { EventHandlers } from '@mui/utils';
|
|
3
|
+
import type { UseTreeItem2ContentSlotOwnProps, UseTreeItem2DragAndDropOverlaySlotOwnProps, UseTreeItem2RootSlotOwnProps } from '../../useTreeItem2';
|
|
4
4
|
export interface TreeViewItemPluginSlotPropsEnhancerParams {
|
|
5
5
|
rootRefObject: React.MutableRefObject<HTMLLIElement | null>;
|
|
6
6
|
contentRefObject: React.MutableRefObject<HTMLDivElement | null>;
|
|
@@ -10,6 +10,7 @@ type TreeViewItemPluginSlotPropsEnhancer<TSlotProps> = (params: TreeViewItemPlug
|
|
|
10
10
|
export interface TreeViewItemPluginSlotPropsEnhancers {
|
|
11
11
|
root?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItem2RootSlotOwnProps>;
|
|
12
12
|
content?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItem2ContentSlotOwnProps>;
|
|
13
|
+
dragAndDropOverlay?: TreeViewItemPluginSlotPropsEnhancer<UseTreeItem2DragAndDropOverlaySlotOwnProps>;
|
|
13
14
|
}
|
|
14
15
|
export interface TreeViewItemPluginResponse {
|
|
15
16
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { EventHandlers } from '@mui/
|
|
2
|
+
import { EventHandlers } from '@mui/utils';
|
|
3
3
|
import { TreeViewExperimentalFeatures, TreeViewInstance, TreeViewModel } from './treeView';
|
|
4
4
|
import type { MergeSignaturesProperty, OptionalIfEmpty } from './helpers';
|
|
5
5
|
import { TreeViewEventLookupElement } from './events';
|
|
@@ -37,10 +37,9 @@ export interface UseTreeViewFocusInstance extends UseTreeViewFocusPublicAPI {
|
|
|
37
37
|
}
|
|
38
38
|
export interface UseTreeViewFocusParameters {
|
|
39
39
|
/**
|
|
40
|
-
* Callback fired when tree
|
|
41
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
40
|
+
* Callback fired when a given tree item is focused.
|
|
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
|
-
* @param {string} value of the focused item.
|
|
44
43
|
*/
|
|
45
44
|
onItemFocus?: (event: React.SyntheticEvent | null, itemId: string) => void;
|
|
46
45
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { SlotComponentProps } from '@mui/
|
|
2
|
+
import { SlotComponentProps } from '@mui/utils';
|
|
3
3
|
import { TreeViewPluginSignature } from '../../models';
|
|
4
4
|
import { UseTreeViewItemsSignature } from '../useTreeViewItems';
|
|
5
5
|
import { UseTreeViewSelectionSignature } from '../useTreeViewSelection';
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { useTreeViewItems } from './useTreeViewItems';
|
|
2
|
-
export type { UseTreeViewItemsSignature, UseTreeViewItemsParameters, UseTreeViewItemsDefaultizedParameters, } from './useTreeViewItems.types';
|
|
2
|
+
export type { UseTreeViewItemsSignature, UseTreeViewItemsParameters, UseTreeViewItemsDefaultizedParameters, UseTreeViewItemsState, } from './useTreeViewItems.types';
|
|
3
|
+
export { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from './useTreeViewItems.utils';
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export { useTreeViewItems } from './useTreeViewItems';
|
|
1
|
+
export { useTreeViewItems } from './useTreeViewItems';
|
|
2
|
+
export { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from './useTreeViewItems.utils';
|
|
@@ -184,8 +184,11 @@ export const useTreeViewItems = ({
|
|
|
184
184
|
areItemUpdatesPrevented
|
|
185
185
|
},
|
|
186
186
|
contextValue: {
|
|
187
|
-
|
|
188
|
-
|
|
187
|
+
items: {
|
|
188
|
+
onItemClick: params.onItemClick,
|
|
189
|
+
disabledItemsFocusable: params.disabledItemsFocusable,
|
|
190
|
+
indentationAtItemLevel: experimentalFeatures.indentationAtItemLevel ?? false
|
|
191
|
+
}
|
|
189
192
|
}
|
|
190
193
|
};
|
|
191
194
|
};
|
|
@@ -216,5 +219,6 @@ useTreeViewItems.params = {
|
|
|
216
219
|
isItemDisabled: true,
|
|
217
220
|
getItemLabel: true,
|
|
218
221
|
getItemId: true,
|
|
222
|
+
onItemClick: true,
|
|
219
223
|
itemChildrenIndentation: true
|
|
220
224
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
1
2
|
import { TreeViewItemMeta, DefaultizedProps, TreeViewPluginSignature } from '../../models';
|
|
2
3
|
import { TreeViewBaseItem, TreeViewItemId } from '../../../models';
|
|
3
4
|
interface TreeViewItemProps {
|
|
@@ -23,6 +24,7 @@ export interface UseTreeViewItemsPublicAPI<R extends {}> {
|
|
|
23
24
|
/**
|
|
24
25
|
* Get the ids of a given item's children.
|
|
25
26
|
* Those ids are returned in the order they should be rendered.
|
|
27
|
+
* To get the root items, pass `null` as the `itemId`.
|
|
26
28
|
* @param {TreeViewItemId | null} itemId The id of the item to get the children of.
|
|
27
29
|
* @returns {TreeViewItemId[]} The ids of the item's children.
|
|
28
30
|
*/
|
|
@@ -80,7 +82,9 @@ export interface UseTreeViewItemsInstance<R extends {}> extends UseTreeViewItems
|
|
|
80
82
|
*/
|
|
81
83
|
areItemUpdatesPrevented: () => boolean;
|
|
82
84
|
}
|
|
83
|
-
export interface UseTreeViewItemsParameters<R extends {
|
|
85
|
+
export interface UseTreeViewItemsParameters<R extends {
|
|
86
|
+
children?: R[];
|
|
87
|
+
}> {
|
|
84
88
|
/**
|
|
85
89
|
* If `true`, will allow focus on disabled items.
|
|
86
90
|
* @default false
|
|
@@ -112,6 +116,12 @@ export interface UseTreeViewItemsParameters<R extends {}> {
|
|
|
112
116
|
* @default (item) => item.id
|
|
113
117
|
*/
|
|
114
118
|
getItemId?: (item: R) => TreeViewItemId;
|
|
119
|
+
/**
|
|
120
|
+
* Callback fired when the `content` slot of a given tree item is clicked.
|
|
121
|
+
* @param {React.MouseEvent} event The DOM event that triggered the change.
|
|
122
|
+
* @param {string} itemId The id of the focused item.
|
|
123
|
+
*/
|
|
124
|
+
onItemClick?: (event: React.MouseEvent, itemId: string) => void;
|
|
115
125
|
/**
|
|
116
126
|
* Horizontal indentation between an item and its children.
|
|
117
127
|
* Examples: 24, "24px", "2rem", "2em".
|
|
@@ -119,7 +129,9 @@ export interface UseTreeViewItemsParameters<R extends {}> {
|
|
|
119
129
|
*/
|
|
120
130
|
itemChildrenIndentation?: string | number;
|
|
121
131
|
}
|
|
122
|
-
export type UseTreeViewItemsDefaultizedParameters<R extends {
|
|
132
|
+
export type UseTreeViewItemsDefaultizedParameters<R extends {
|
|
133
|
+
children?: R[];
|
|
134
|
+
}> = DefaultizedProps<UseTreeViewItemsParameters<R>, 'disabledItemsFocusable' | 'itemChildrenIndentation'>;
|
|
123
135
|
interface UseTreeViewItemsEventLookup {
|
|
124
136
|
removeItem: {
|
|
125
137
|
params: {
|
|
@@ -141,8 +153,10 @@ export interface UseTreeViewItemsState<R extends {}> {
|
|
|
141
153
|
};
|
|
142
154
|
};
|
|
143
155
|
}
|
|
144
|
-
interface UseTreeViewItemsContextValue
|
|
145
|
-
|
|
156
|
+
interface UseTreeViewItemsContextValue {
|
|
157
|
+
items: Pick<UseTreeViewItemsDefaultizedParameters<any>, 'disabledItemsFocusable' | 'onItemClick'> & {
|
|
158
|
+
indentationAtItemLevel: boolean;
|
|
159
|
+
};
|
|
146
160
|
}
|
|
147
161
|
export type UseTreeViewItemsSignature = TreeViewPluginSignature<{
|
|
148
162
|
params: UseTreeViewItemsParameters<any>;
|
|
@@ -4,7 +4,7 @@ import useEventCallback from '@mui/utils/useEventCallback';
|
|
|
4
4
|
import useForkRef from '@mui/utils/useForkRef';
|
|
5
5
|
import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
|
|
6
6
|
import { publishTreeViewEvent } from '../../utils/publishTreeViewEvent';
|
|
7
|
-
import { useTreeViewContext } from '../../TreeViewProvider
|
|
7
|
+
import { useTreeViewContext } from '../../TreeViewProvider';
|
|
8
8
|
import { TreeViewChildrenItemContext, TreeViewChildrenItemProvider } from '../../TreeViewProvider/TreeViewChildrenItemProvider';
|
|
9
9
|
import { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from '../useTreeViewItems/useTreeViewItems.utils';
|
|
10
10
|
import { TreeViewItemDepthContext } from '../../TreeViewItemDepthContext';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { useRtl } from '@mui/system/RtlProvider';
|
|
3
3
|
import useEventCallback from '@mui/utils/useEventCallback';
|
|
4
|
-
import { getFirstNavigableItem, getLastNavigableItem, getNextNavigableItem, getPreviousNavigableItem } from '../../utils/tree';
|
|
4
|
+
import { getFirstNavigableItem, getLastNavigableItem, getNextNavigableItem, getPreviousNavigableItem, isTargetInDescendants } from '../../utils/tree';
|
|
5
5
|
function isPrintableCharacter(string) {
|
|
6
6
|
return !!string && string.length === 1 && !!string.match(/\S/);
|
|
7
7
|
}
|
|
@@ -60,7 +60,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
60
60
|
if (event.defaultMuiPrevented) {
|
|
61
61
|
return;
|
|
62
62
|
}
|
|
63
|
-
if (event.altKey || event.
|
|
63
|
+
if (event.altKey || isTargetInDescendants(event.target, event.currentTarget)) {
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
66
|
const ctrlPressed = event.ctrlKey || event.metaKey;
|
package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { TreeViewPluginSignature } from '../../models';
|
|
2
|
+
import { TreeViewPluginSignature, MuiCancellableEvent } from '../../models';
|
|
3
3
|
import { UseTreeViewItemsSignature } from '../useTreeViewItems';
|
|
4
4
|
import { UseTreeViewSelectionSignature } from '../useTreeViewSelection';
|
|
5
5
|
import { UseTreeViewFocusSignature } from '../useTreeViewFocus';
|
|
6
6
|
import { UseTreeViewExpansionSignature } from '../useTreeViewExpansion';
|
|
7
|
-
import { MuiCancellableEvent } from '../../models/MuiCancellableEvent';
|
|
8
7
|
import { TreeViewItemId } from '../../../models';
|
|
9
8
|
export interface UseTreeViewKeyboardNavigationInstance {
|
|
10
9
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { EventHandlers } from '@mui/
|
|
2
|
+
import { EventHandlers } from '@mui/utils';
|
|
3
3
|
import type { TreeViewContextValue } from '../TreeViewProvider';
|
|
4
4
|
import { TreeViewAnyPluginSignature, ConvertSignaturesIntoPlugins, MergeSignaturesProperty, TreeViewInstance, TreeViewPublicAPI, TreeViewExperimentalFeatures } from '../models';
|
|
5
5
|
export interface UseTreeViewParameters<TSignatures extends readonly TreeViewAnyPluginSignature[], TProps extends Partial<UseTreeViewBaseProps<TSignatures>>> {
|
|
@@ -22,3 +22,11 @@ export declare const getFirstNavigableItem: (instance: TreeViewInstance<[UseTree
|
|
|
22
22
|
export declare const findOrderInTremauxTree: (instance: TreeViewInstance<[UseTreeViewItemsSignature]>, itemAId: string, itemBId: string) => string[];
|
|
23
23
|
export declare const getNonDisabledItemsInRange: (instance: TreeViewInstance<[UseTreeViewItemsSignature, UseTreeViewExpansionSignature]>, itemAId: string, itemBId: string) => string[];
|
|
24
24
|
export declare const getAllNavigableItems: (instance: TreeViewInstance<[UseTreeViewItemsSignature, UseTreeViewExpansionSignature]>) => string[];
|
|
25
|
+
/**
|
|
26
|
+
* Checks if the target is in a descendant of this item.
|
|
27
|
+
* This can prevent from firing some logic on the ancestors on the interacted item when the event handler is on the root.
|
|
28
|
+
* @param {HTMLElement} target The target to check
|
|
29
|
+
* @param {HTMLElement | null} itemRoot The root of the item to check if the event target is in its descendants
|
|
30
|
+
* @returns {boolean} Whether the target is in a descendant of this item
|
|
31
|
+
*/
|
|
32
|
+
export declare const isTargetInDescendants: (target: HTMLElement, itemRoot: HTMLElement | null) => boolean;
|
package/internals/utils/tree.js
CHANGED
|
@@ -181,4 +181,15 @@ export const getAllNavigableItems = instance => {
|
|
|
181
181
|
item = getNextNavigableItem(instance, item);
|
|
182
182
|
}
|
|
183
183
|
return navigableItems;
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Checks if the target is in a descendant of this item.
|
|
188
|
+
* This can prevent from firing some logic on the ancestors on the interacted item when the event handler is on the root.
|
|
189
|
+
* @param {HTMLElement} target The target to check
|
|
190
|
+
* @param {HTMLElement | null} itemRoot The root of the item to check if the event target is in its descendants
|
|
191
|
+
* @returns {boolean} Whether the target is in a descendant of this item
|
|
192
|
+
*/
|
|
193
|
+
export const isTargetInDescendants = (target, itemRoot) => {
|
|
194
|
+
return itemRoot !== target.closest('*[role="treeitem"]');
|
|
184
195
|
};
|
package/models/items.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import PropTypes from 'prop-types';
|
|
4
4
|
import composeClasses from '@mui/utils/composeClasses';
|
|
5
|
-
import
|
|
5
|
+
import useSlotProps from '@mui/utils/useSlotProps';
|
|
6
6
|
import { getRichTreeViewUtilityClass } from './richTreeViewClasses';
|
|
7
7
|
import { styled, createUseThemeProps } from '../internals/zero-styled';
|
|
8
8
|
import { useTreeView } from '../internals/useTreeView';
|
|
@@ -241,6 +241,12 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
241
241
|
* @param {array} itemIds The ids of the expanded items.
|
|
242
242
|
*/
|
|
243
243
|
onExpandedItemsChange: PropTypes.func,
|
|
244
|
+
/**
|
|
245
|
+
* Callback fired when the `content` slot of a given tree item is clicked.
|
|
246
|
+
* @param {React.MouseEvent} event The DOM event that triggered the change.
|
|
247
|
+
* @param {string} itemId The id of the focused item.
|
|
248
|
+
*/
|
|
249
|
+
onItemClick: PropTypes.func,
|
|
244
250
|
/**
|
|
245
251
|
* Callback fired when a tree item is expanded or collapsed.
|
|
246
252
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
@@ -249,10 +255,9 @@ process.env.NODE_ENV !== "production" ? RichTreeView.propTypes = {
|
|
|
249
255
|
*/
|
|
250
256
|
onItemExpansionToggle: PropTypes.func,
|
|
251
257
|
/**
|
|
252
|
-
* Callback fired when tree
|
|
253
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
258
|
+
* Callback fired when a given tree item is focused.
|
|
259
|
+
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
254
260
|
* @param {string} itemId The id of the focused item.
|
|
255
|
-
* @param {string} value of the focused item.
|
|
256
261
|
*/
|
|
257
262
|
onItemFocus: PropTypes.func,
|
|
258
263
|
/**
|
|
@@ -2,7 +2,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import PropTypes from 'prop-types';
|
|
4
4
|
import composeClasses from '@mui/utils/composeClasses';
|
|
5
|
-
import
|
|
5
|
+
import useSlotProps from '@mui/utils/useSlotProps';
|
|
6
6
|
import { styled, createUseThemeProps } from '../internals/zero-styled';
|
|
7
7
|
import { getSimpleTreeViewUtilityClass } from './simpleTreeViewClasses';
|
|
8
8
|
import { useTreeView } from '../internals/useTreeView';
|
|
@@ -177,6 +177,12 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
177
177
|
* @param {array} itemIds The ids of the expanded items.
|
|
178
178
|
*/
|
|
179
179
|
onExpandedItemsChange: PropTypes.func,
|
|
180
|
+
/**
|
|
181
|
+
* Callback fired when the `content` slot of a given tree item is clicked.
|
|
182
|
+
* @param {React.MouseEvent} event The DOM event that triggered the change.
|
|
183
|
+
* @param {string} itemId The id of the focused item.
|
|
184
|
+
*/
|
|
185
|
+
onItemClick: PropTypes.func,
|
|
180
186
|
/**
|
|
181
187
|
* Callback fired when a tree item is expanded or collapsed.
|
|
182
188
|
* @param {React.SyntheticEvent} event The DOM event that triggered the change.
|
|
@@ -185,10 +191,9 @@ process.env.NODE_ENV !== "production" ? SimpleTreeView.propTypes = {
|
|
|
185
191
|
*/
|
|
186
192
|
onItemExpansionToggle: PropTypes.func,
|
|
187
193
|
/**
|
|
188
|
-
* Callback fired when tree
|
|
189
|
-
* @param {React.SyntheticEvent} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
194
|
+
* Callback fired when a given tree item is focused.
|
|
195
|
+
* @param {React.SyntheticEvent | null} event The DOM event that triggered the change. **Warning**: This is a generic event not a focus event.
|
|
190
196
|
* @param {string} itemId The id of the focused item.
|
|
191
|
-
* @param {string} value of the focused item.
|
|
192
197
|
*/
|
|
193
198
|
onItemFocus: PropTypes.func,
|
|
194
199
|
/**
|
|
@@ -8,17 +8,19 @@ import * as React from 'react';
|
|
|
8
8
|
import PropTypes from 'prop-types';
|
|
9
9
|
import clsx from 'clsx';
|
|
10
10
|
import Collapse from '@mui/material/Collapse';
|
|
11
|
-
import { resolveComponentProps, useSlotProps } from '@mui/base/utils';
|
|
12
11
|
import useForkRef from '@mui/utils/useForkRef';
|
|
13
12
|
import { shouldForwardProp } from '@mui/system/createStyled';
|
|
14
13
|
import { alpha } from '@mui/material/styles';
|
|
14
|
+
import composeClasses from '@mui/utils/composeClasses';
|
|
15
|
+
import extractEventHandlers from '@mui/utils/extractEventHandlers';
|
|
16
|
+
import resolveComponentProps from '@mui/utils/resolveComponentProps';
|
|
17
|
+
import useSlotProps from '@mui/utils/useSlotProps';
|
|
15
18
|
import unsupportedProp from '@mui/utils/unsupportedProp';
|
|
16
19
|
import elementTypeAcceptingRef from '@mui/utils/elementTypeAcceptingRef';
|
|
17
|
-
import { unstable_composeClasses as composeClasses } from '@mui/base';
|
|
18
20
|
import { styled, createUseThemeProps } from '../internals/zero-styled';
|
|
19
21
|
import { TreeItemContent } from './TreeItemContent';
|
|
20
22
|
import { treeItemClasses, getTreeItemUtilityClass } from './treeItemClasses';
|
|
21
|
-
import { useTreeViewContext } from '../internals/TreeViewProvider
|
|
23
|
+
import { useTreeViewContext } from '../internals/TreeViewProvider';
|
|
22
24
|
import { TreeViewCollapseIcon, TreeViewExpandIcon } from '../icons';
|
|
23
25
|
import { TreeItem2Provider } from '../TreeItem2Provider';
|
|
24
26
|
import { TreeViewItemDepthContext } from '../internals/TreeViewItemDepthContext';
|
|
@@ -72,6 +74,7 @@ const StyledTreeItemContent = styled(TreeItemContent, {
|
|
|
72
74
|
width: '100%',
|
|
73
75
|
boxSizing: 'border-box',
|
|
74
76
|
// prevent width + padding to overflow
|
|
77
|
+
position: 'relative',
|
|
75
78
|
display: 'flex',
|
|
76
79
|
alignItems: 'center',
|
|
77
80
|
gap: theme.spacing(1),
|
|
@@ -166,14 +169,16 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
166
169
|
const {
|
|
167
170
|
icons: contextIcons,
|
|
168
171
|
runItemPlugins,
|
|
172
|
+
items: {
|
|
173
|
+
disabledItemsFocusable,
|
|
174
|
+
indentationAtItemLevel
|
|
175
|
+
},
|
|
169
176
|
selection: {
|
|
170
177
|
multiSelect
|
|
171
178
|
},
|
|
172
179
|
expansion: {
|
|
173
180
|
expansionTrigger
|
|
174
181
|
},
|
|
175
|
-
disabledItemsFocusable,
|
|
176
|
-
indentationAtItemLevel,
|
|
177
182
|
instance
|
|
178
183
|
} = useTreeViewContext();
|
|
179
184
|
const depthContext = React.useContext(TreeViewItemDepthContext);
|
|
@@ -206,10 +211,13 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
206
211
|
} = useTreeItemState(itemId);
|
|
207
212
|
const {
|
|
208
213
|
contentRef,
|
|
209
|
-
rootRef
|
|
214
|
+
rootRef,
|
|
215
|
+
propsEnhancers
|
|
210
216
|
} = runItemPlugins(props);
|
|
211
|
-
const
|
|
212
|
-
const
|
|
217
|
+
const rootRefObject = React.useRef(null);
|
|
218
|
+
const contentRefObject = React.useRef(null);
|
|
219
|
+
const handleRootRef = useForkRef(inRef, rootRef, rootRefObject);
|
|
220
|
+
const handleContentRef = useForkRef(ContentProps?.ref, contentRef, contentRefObject);
|
|
213
221
|
const slots = {
|
|
214
222
|
expandIcon: inSlots?.expandIcon ?? contextIcons.slots.expandIcon ?? TreeViewExpandIcon,
|
|
215
223
|
collapseIcon: inSlots?.collapseIcon ?? contextIcons.slots.collapseIcon ?? TreeViewCollapseIcon,
|
|
@@ -317,6 +325,21 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
317
325
|
};
|
|
318
326
|
const idAttribute = instance.getTreeItemIdAttribute(itemId, id);
|
|
319
327
|
const tabIndex = instance.canItemBeTabbed(itemId) ? 0 : -1;
|
|
328
|
+
const enhancedRootProps = propsEnhancers.root?.({
|
|
329
|
+
rootRefObject,
|
|
330
|
+
contentRefObject,
|
|
331
|
+
externalEventHandlers: extractEventHandlers(other)
|
|
332
|
+
}) ?? {};
|
|
333
|
+
const enhancedContentProps = propsEnhancers.content?.({
|
|
334
|
+
rootRefObject,
|
|
335
|
+
contentRefObject,
|
|
336
|
+
externalEventHandlers: extractEventHandlers(ContentProps)
|
|
337
|
+
}) ?? {};
|
|
338
|
+
const enhancedDragAndDropOverlayProps = propsEnhancers.dragAndDropOverlay?.({
|
|
339
|
+
rootRefObject,
|
|
340
|
+
contentRefObject,
|
|
341
|
+
externalEventHandlers: {}
|
|
342
|
+
}) ?? {};
|
|
320
343
|
return /*#__PURE__*/_jsx(TreeItem2Provider, {
|
|
321
344
|
itemId: itemId,
|
|
322
345
|
children: /*#__PURE__*/_jsxs(TreeItemRoot, _extends({
|
|
@@ -335,7 +358,8 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
335
358
|
ref: handleRootRef,
|
|
336
359
|
style: indentationAtItemLevel ? _extends({}, other.style, {
|
|
337
360
|
'--TreeView-itemDepth': typeof depthContext === 'function' ? depthContext(itemId) : depthContext
|
|
338
|
-
}) : other.style
|
|
361
|
+
}) : other.style
|
|
362
|
+
}, enhancedRootProps, {
|
|
339
363
|
children: [/*#__PURE__*/_jsx(StyledTreeItemContent, _extends({
|
|
340
364
|
as: ContentComponent,
|
|
341
365
|
classes: {
|
|
@@ -356,7 +380,9 @@ export const TreeItem = /*#__PURE__*/React.forwardRef(function TreeItem(inProps,
|
|
|
356
380
|
expansionIcon: expansionIcon,
|
|
357
381
|
displayIcon: displayIcon,
|
|
358
382
|
ownerState: ownerState
|
|
359
|
-
}, ContentProps, {
|
|
383
|
+
}, ContentProps, enhancedContentProps, enhancedDragAndDropOverlayProps.action == null ? {} : {
|
|
384
|
+
dragAndDropOverlayProps: enhancedDragAndDropOverlayProps
|
|
385
|
+
}, {
|
|
360
386
|
ref: handleContentRef
|
|
361
387
|
})), children && /*#__PURE__*/_jsx(TreeItemGroup, _extends({
|
|
362
388
|
as: GroupTransition
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
|
-
const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "itemId", "onClick", "onMouseDown"];
|
|
3
|
+
const _excluded = ["classes", "className", "displayIcon", "expansionIcon", "icon", "label", "itemId", "onClick", "onMouseDown", "dragAndDropOverlayProps"];
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
6
|
import clsx from 'clsx';
|
|
7
7
|
import Checkbox from '@mui/material/Checkbox';
|
|
8
8
|
import { useTreeItemState } from './useTreeItemState';
|
|
9
|
+
import { TreeItem2DragAndDropOverlay } from '../TreeItem2DragAndDropOverlay';
|
|
9
10
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
11
|
/**
|
|
11
12
|
* @ignore - internal component.
|
|
@@ -20,7 +21,8 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
|
|
|
20
21
|
label,
|
|
21
22
|
itemId,
|
|
22
23
|
onClick,
|
|
23
|
-
onMouseDown
|
|
24
|
+
onMouseDown,
|
|
25
|
+
dragAndDropOverlayProps
|
|
24
26
|
} = props,
|
|
25
27
|
other = _objectWithoutPropertiesLoose(props, _excluded);
|
|
26
28
|
const {
|
|
@@ -33,6 +35,7 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
|
|
|
33
35
|
handleExpansion,
|
|
34
36
|
handleSelection,
|
|
35
37
|
handleCheckboxSelection,
|
|
38
|
+
handleContentClick,
|
|
36
39
|
preventSelection,
|
|
37
40
|
expansionTrigger
|
|
38
41
|
} = useTreeItemState(itemId);
|
|
@@ -45,6 +48,7 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
|
|
|
45
48
|
}
|
|
46
49
|
};
|
|
47
50
|
const handleClick = event => {
|
|
51
|
+
handleContentClick?.(event, itemId);
|
|
48
52
|
if (checkboxRef.current?.contains(event.target)) {
|
|
49
53
|
return;
|
|
50
54
|
}
|
|
@@ -79,7 +83,7 @@ const TreeItemContent = /*#__PURE__*/React.forwardRef(function TreeItemContent(p
|
|
|
79
83
|
}), /*#__PURE__*/_jsx("div", {
|
|
80
84
|
className: classes.label,
|
|
81
85
|
children: label
|
|
82
|
-
})]
|
|
86
|
+
}), dragAndDropOverlayProps && /*#__PURE__*/_jsx(TreeItem2DragAndDropOverlay, _extends({}, dragAndDropOverlayProps))]
|
|
83
87
|
}))
|
|
84
88
|
);
|
|
85
89
|
});
|
|
@@ -97,6 +101,10 @@ process.env.NODE_ENV !== "production" ? TreeItemContent.propTypes = {
|
|
|
97
101
|
* The icon to display next to the tree item's label. Either a parent or end icon.
|
|
98
102
|
*/
|
|
99
103
|
displayIcon: PropTypes.node,
|
|
104
|
+
dragAndDropOverlayProps: PropTypes.shape({
|
|
105
|
+
action: PropTypes.oneOf(['make-child', 'move-to-parent', 'reorder-above', 'reorder-below']),
|
|
106
|
+
style: PropTypes.object
|
|
107
|
+
}),
|
|
100
108
|
/**
|
|
101
109
|
* The icon to display next to the tree item's label. Either an expansion or collapse icon.
|
|
102
110
|
*/
|
|
@@ -3,4 +3,4 @@ import generateUtilityClasses from '@mui/utils/generateUtilityClasses';
|
|
|
3
3
|
export function getTreeItemUtilityClass(slot) {
|
|
4
4
|
return generateUtilityClass('MuiTreeItem', slot);
|
|
5
5
|
}
|
|
6
|
-
export const treeItemClasses = generateUtilityClasses('MuiTreeItem', ['root', 'groupTransition', 'content', 'expanded', 'selected', 'focused', 'disabled', 'iconContainer', 'label', 'checkbox']);
|
|
6
|
+
export const treeItemClasses = generateUtilityClasses('MuiTreeItem', ['root', 'groupTransition', 'content', 'expanded', 'selected', 'focused', 'disabled', 'iconContainer', 'label', 'checkbox', 'dragAndDropOverlay']);
|