@mui/x-tree-view 8.0.0-alpha.1 → 8.0.0-alpha.10
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 +1903 -231
- package/README.md +1 -1
- package/RichTreeView/RichTreeView.types.d.ts +3 -3
- package/SimpleTreeView/SimpleTreeView.types.d.ts +3 -3
- package/TreeItem/TreeItem.d.ts +1 -1
- package/TreeItem/TreeItem.types.d.ts +1 -1
- package/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +1 -1
- package/TreeItemIcon/TreeItemIcon.types.d.ts +1 -1
- package/TreeItemProvider/TreeItemProvider.d.ts +2 -4
- package/TreeItemProvider/TreeItemProvider.js +13 -11
- package/hooks/useTreeItemUtils/useTreeItemUtils.d.ts +4 -4
- package/hooks/useTreeViewApiRef.d.ts +2 -1
- package/index.js +1 -1
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +1 -1
- package/internals/components/RichTreeViewItems.d.ts +1 -1
- package/internals/hooks/useInstanceEventHandler.js +1 -1
- package/internals/models/itemPlugin.d.ts +3 -3
- package/internals/models/plugin.d.ts +3 -3
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +23 -24
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +66 -10
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +8 -1
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +1 -5
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.d.ts +3 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +12 -0
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +252 -84
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +26 -8
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +13 -16
- package/internals/useTreeView/useTreeView.d.ts +1 -1
- package/internals/useTreeView/useTreeView.types.d.ts +2 -2
- package/internals/useTreeView/useTreeViewBuildContext.d.ts +1 -1
- package/modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +1 -1
- package/modern/TreeItemProvider/TreeItemProvider.js +13 -11
- package/modern/index.js +1 -1
- package/modern/internals/hooks/useInstanceEventHandler.js +1 -1
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +23 -24
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +8 -1
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +12 -0
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +13 -16
- package/modern/useTreeItem/useTreeItem.js +3 -5
- package/node/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +2 -2
- package/node/TreeItemProvider/TreeItemProvider.js +13 -10
- package/node/index.js +1 -1
- package/node/internals/hooks/useInstanceEventHandler.js +1 -1
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +22 -24
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +9 -2
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +15 -2
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +13 -16
- package/node/useTreeItem/useTreeItem.js +3 -5
- package/package.json +5 -5
- package/useTreeItem/useTreeItem.js +3 -5
- package/useTreeItem/useTreeItem.types.d.ts +1 -1
|
@@ -102,12 +102,36 @@ interface UseTreeViewItemsEventLookup {
|
|
|
102
102
|
}
|
|
103
103
|
export interface UseTreeViewItemsState<R extends {}> {
|
|
104
104
|
items: {
|
|
105
|
+
/**
|
|
106
|
+
* If `true`, will allow focus on disabled items.
|
|
107
|
+
* Always equal to `props.disabledItemsFocusable` (or `false` if not provided).
|
|
108
|
+
*/
|
|
105
109
|
disabledItemsFocusable: boolean;
|
|
106
|
-
|
|
107
|
-
|
|
110
|
+
/**
|
|
111
|
+
* Model of each item as provided by `props.items` or by imperative items updates.
|
|
112
|
+
* It is not updated when properties derived from the model are updated:
|
|
113
|
+
* - when the label of an item is updated, `itemMetaLookup` is updated, not `itemModelLookup`.
|
|
114
|
+
* - when the children of an item are updated, `itemOrderedChildrenIdsLookup` and `itemChildrenIndexesLookup` are updated, not `itemModelLookup`.
|
|
115
|
+
* This means that the `children`, `label` or `id` properties of an item model should never be used directly, always use the structured sub-states instead.
|
|
116
|
+
*/
|
|
117
|
+
itemModelLookup: {
|
|
118
|
+
[itemId: string]: TreeViewBaseItem<R>;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Meta data of each item.
|
|
122
|
+
*/
|
|
123
|
+
itemMetaLookup: {
|
|
124
|
+
[itemId: string]: TreeViewItemMeta;
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Ordered children ids of each item.
|
|
128
|
+
*/
|
|
108
129
|
itemOrderedChildrenIdsLookup: {
|
|
109
130
|
[parentItemId: string]: string[];
|
|
110
131
|
};
|
|
132
|
+
/**
|
|
133
|
+
* Index of each child in the ordered children ids of its parent.
|
|
134
|
+
*/
|
|
111
135
|
itemChildrenIndexesLookup: {
|
|
112
136
|
[parentItemId: string]: {
|
|
113
137
|
[itemId: string]: number;
|
|
@@ -129,10 +153,4 @@ export type UseTreeViewItemsSignature = TreeViewPluginSignature<{
|
|
|
129
153
|
state: UseTreeViewItemsState<TreeViewDefaultItemModelProperties>;
|
|
130
154
|
contextValue: UseTreeViewItemsContextValue;
|
|
131
155
|
}>;
|
|
132
|
-
export type TreeViewItemMetaLookup = {
|
|
133
|
-
[itemId: string]: TreeViewItemMeta;
|
|
134
|
-
};
|
|
135
|
-
export type TreeViewItemModelLookup<R extends {}> = {
|
|
136
|
-
[itemId: string]: TreeViewBaseItem<R>;
|
|
137
|
-
};
|
|
138
156
|
export {};
|
|
@@ -2,19 +2,18 @@ import _extends from "@babel/runtime/helpers/esm/extends";
|
|
|
2
2
|
import { useTreeViewContext } from "../../TreeViewProvider/index.js";
|
|
3
3
|
import { selectorItemOrderedChildrenIds } from "../useTreeViewItems/useTreeViewItems.selectors.js";
|
|
4
4
|
import { selectorIsItemSelected } from "./useTreeViewSelection.selectors.js";
|
|
5
|
-
|
|
5
|
+
import { useSelector } from "../../hooks/useSelector.js";
|
|
6
|
+
function selectorItemCheckboxStatus(state, {
|
|
6
7
|
itemId,
|
|
7
|
-
|
|
8
|
-
selectionPropagation,
|
|
9
|
-
selected
|
|
8
|
+
selectionPropagation
|
|
10
9
|
}) {
|
|
11
|
-
if (
|
|
10
|
+
if (selectorIsItemSelected(state, itemId)) {
|
|
12
11
|
return {
|
|
13
12
|
indeterminate: false,
|
|
14
13
|
checked: true
|
|
15
14
|
};
|
|
16
15
|
}
|
|
17
|
-
const children = selectorItemOrderedChildrenIds(
|
|
16
|
+
const children = selectorItemOrderedChildrenIds(state, itemId);
|
|
18
17
|
if (children.length === 0) {
|
|
19
18
|
return {
|
|
20
19
|
indeterminate: false,
|
|
@@ -25,18 +24,18 @@ function getCheckboxStatus({
|
|
|
25
24
|
let hasUnSelectedDescendant = false;
|
|
26
25
|
const traverseDescendants = itemToTraverseId => {
|
|
27
26
|
if (itemToTraverseId !== itemId) {
|
|
28
|
-
if (selectorIsItemSelected(
|
|
27
|
+
if (selectorIsItemSelected(state, itemToTraverseId)) {
|
|
29
28
|
hasSelectedDescendant = true;
|
|
30
29
|
} else {
|
|
31
30
|
hasUnSelectedDescendant = true;
|
|
32
31
|
}
|
|
33
32
|
}
|
|
34
|
-
selectorItemOrderedChildrenIds(
|
|
33
|
+
selectorItemOrderedChildrenIds(state, itemToTraverseId).forEach(traverseDescendants);
|
|
35
34
|
};
|
|
36
35
|
traverseDescendants(itemId);
|
|
37
36
|
return {
|
|
38
|
-
indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant
|
|
39
|
-
checked: selectionPropagation.parents ? hasSelectedDescendant :
|
|
37
|
+
indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant,
|
|
38
|
+
checked: selectionPropagation.parents ? hasSelectedDescendant : false
|
|
40
39
|
};
|
|
41
40
|
}
|
|
42
41
|
export const useTreeViewSelectionItemPlugin = ({
|
|
@@ -53,6 +52,10 @@ export const useTreeViewSelectionItemPlugin = ({
|
|
|
53
52
|
selectionPropagation
|
|
54
53
|
}
|
|
55
54
|
} = useTreeViewContext();
|
|
55
|
+
const checkboxStatus = useSelector(store, selectorItemCheckboxStatus, {
|
|
56
|
+
itemId,
|
|
57
|
+
selectionPropagation
|
|
58
|
+
}, (a, b) => a.checked === b.checked && a.indeterminate === b.indeterminate);
|
|
56
59
|
return {
|
|
57
60
|
propsEnhancers: {
|
|
58
61
|
checkbox: ({
|
|
@@ -70,12 +73,6 @@ export const useTreeViewSelectionItemPlugin = ({
|
|
|
70
73
|
}
|
|
71
74
|
interactions.handleCheckboxSelection(event);
|
|
72
75
|
};
|
|
73
|
-
const checkboxStatus = getCheckboxStatus({
|
|
74
|
-
store,
|
|
75
|
-
itemId,
|
|
76
|
-
selectionPropagation,
|
|
77
|
-
selected: status.selected
|
|
78
|
-
});
|
|
79
76
|
return _extends({
|
|
80
77
|
visible: checkboxSelection,
|
|
81
78
|
disabled: disableSelection || status.disabled,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { TreeViewAnyPluginSignature } from '../models';
|
|
3
3
|
import { UseTreeViewBaseProps, UseTreeViewParameters, UseTreeViewReturnValue } from './useTreeView.types';
|
|
4
|
-
export declare function useTreeViewApiInitialization<T>(inputApiRef: React.
|
|
4
|
+
export declare function useTreeViewApiInitialization<T>(inputApiRef: React.RefObject<T | undefined> | undefined): T;
|
|
5
5
|
export declare const useTreeView: <TSignatures extends readonly TreeViewAnyPluginSignature[], TProps extends Partial<UseTreeViewBaseProps<TSignatures>>>({ plugins: inPlugins, rootRef, props, }: UseTreeViewParameters<TSignatures, TProps>) => UseTreeViewReturnValue<TSignatures>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { EventHandlers } from '@mui/utils';
|
|
2
|
+
import { EventHandlers } from '@mui/utils/types';
|
|
3
3
|
import type { TreeViewContextValue } from '../TreeViewProvider';
|
|
4
4
|
import { TreeViewAnyPluginSignature, ConvertSignaturesIntoPlugins, MergeSignaturesProperty, TreeViewPublicAPI, TreeViewExperimentalFeatures } from '../models';
|
|
5
5
|
export interface UseTreeViewParameters<TSignatures extends readonly TreeViewAnyPluginSignature[], TProps extends Partial<UseTreeViewBaseProps<TSignatures>>> {
|
|
@@ -8,7 +8,7 @@ export interface UseTreeViewParameters<TSignatures extends readonly TreeViewAnyP
|
|
|
8
8
|
props: TProps;
|
|
9
9
|
}
|
|
10
10
|
export interface UseTreeViewBaseProps<TSignatures extends readonly TreeViewAnyPluginSignature[]> {
|
|
11
|
-
apiRef: React.
|
|
11
|
+
apiRef: React.RefObject<TreeViewPublicAPI<TSignatures> | undefined> | undefined;
|
|
12
12
|
slots: MergeSignaturesProperty<TSignatures, 'slots'>;
|
|
13
13
|
slotProps: MergeSignaturesProperty<TSignatures, 'slotProps'>;
|
|
14
14
|
experimentalFeatures: TreeViewExperimentalFeatures<TSignatures>;
|
|
@@ -8,5 +8,5 @@ export declare const useTreeViewBuildContext: <TSignatures extends readonly Tree
|
|
|
8
8
|
instance: TreeViewInstance<TSignatures>;
|
|
9
9
|
publicAPI: TreeViewPublicAPI<TSignatures>;
|
|
10
10
|
store: TreeViewStore<TSignatures>;
|
|
11
|
-
rootRef: React.RefObject<HTMLUListElement>;
|
|
11
|
+
rootRef: React.RefObject<HTMLUListElement | null>;
|
|
12
12
|
}) => TreeViewContextValue<TSignatures>;
|
|
@@ -4,7 +4,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
|
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
6
|
import { alpha } from '@mui/material/styles';
|
|
7
|
-
import { shouldForwardProp } from '@mui/system';
|
|
7
|
+
import { shouldForwardProp } from '@mui/system/createStyled';
|
|
8
8
|
import { styled } from "../internals/zero-styled/index.js";
|
|
9
9
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
10
10
|
const TreeItemDragAndDropOverlayRoot = styled('div', {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import * as React from 'react';
|
|
1
4
|
import PropTypes from 'prop-types';
|
|
2
5
|
import { useTreeViewContext } from "../internals/TreeViewProvider/index.js";
|
|
3
6
|
import { generateTreeItemIdAttribute } from "../internals/corePlugins/useTreeViewId/useTreeViewId.utils.js";
|
|
4
7
|
import { useSelector } from "../internals/hooks/useSelector.js";
|
|
5
8
|
import { selectorTreeViewId } from "../internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* @ignore - internal component.
|
|
9
|
-
*/
|
|
9
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
10
10
|
function TreeItemProvider(props) {
|
|
11
11
|
const {
|
|
12
12
|
children,
|
|
@@ -24,14 +24,16 @@ function TreeItemProvider(props) {
|
|
|
24
24
|
treeId,
|
|
25
25
|
id
|
|
26
26
|
});
|
|
27
|
-
return
|
|
28
|
-
children
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
return /*#__PURE__*/_jsx(React.Fragment, {
|
|
28
|
+
children: wrapItem({
|
|
29
|
+
children,
|
|
30
|
+
itemId,
|
|
31
|
+
instance,
|
|
32
|
+
idAttribute
|
|
33
|
+
})
|
|
32
34
|
});
|
|
33
35
|
}
|
|
34
|
-
TreeItemProvider.propTypes = {
|
|
36
|
+
process.env.NODE_ENV !== "production" ? TreeItemProvider.propTypes = {
|
|
35
37
|
// ----------------------------- Warning --------------------------------
|
|
36
38
|
// | These PropTypes are generated from the TypeScript type definitions |
|
|
37
39
|
// | To update them edit the TypeScript types and run "pnpm proptypes" |
|
|
@@ -39,5 +41,5 @@ TreeItemProvider.propTypes = {
|
|
|
39
41
|
children: PropTypes.node,
|
|
40
42
|
id: PropTypes.string,
|
|
41
43
|
itemId: PropTypes.string.isRequired
|
|
42
|
-
};
|
|
44
|
+
} : void 0;
|
|
43
45
|
export { TreeItemProvider };
|
package/modern/index.js
CHANGED
|
@@ -14,7 +14,7 @@ export function createUseInstanceEventHandler(registryContainer) {
|
|
|
14
14
|
}
|
|
15
15
|
const [objectRetainedByReact] = React.useState(new ObjectToBeRetainedByReact());
|
|
16
16
|
const subscription = React.useRef(null);
|
|
17
|
-
const handlerRef = React.useRef();
|
|
17
|
+
const handlerRef = React.useRef(undefined);
|
|
18
18
|
handlerRef.current = handler;
|
|
19
19
|
const cleanupTokenRef = React.useRef(null);
|
|
20
20
|
if (!subscription.current && handlerRef.current) {
|
|
@@ -1,25 +1,38 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
-
import * as React from 'react';
|
|
3
2
|
import useEventCallback from '@mui/utils/useEventCallback';
|
|
4
3
|
import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
|
|
5
4
|
import { selectorIsItemExpandable, selectorIsItemExpanded } from "./useTreeViewExpansion.selectors.js";
|
|
6
|
-
import { createExpandedItemsMap } from "./useTreeViewExpansion.utils.js";
|
|
5
|
+
import { createExpandedItemsMap, getExpansionTrigger } from "./useTreeViewExpansion.utils.js";
|
|
7
6
|
import { selectorItemMeta, selectorItemOrderedChildrenIds } from "../useTreeViewItems/useTreeViewItems.selectors.js";
|
|
8
7
|
export const useTreeViewExpansion = ({
|
|
9
8
|
instance,
|
|
10
9
|
store,
|
|
11
10
|
params,
|
|
12
|
-
models
|
|
13
|
-
experimentalFeatures
|
|
11
|
+
models
|
|
14
12
|
}) => {
|
|
15
|
-
const isTreeViewEditable = Boolean(params.isItemEditable) && !!experimentalFeatures.labelEditing;
|
|
16
13
|
useEnhancedEffect(() => {
|
|
17
14
|
store.update(prevState => _extends({}, prevState, {
|
|
18
|
-
expansion: {
|
|
15
|
+
expansion: _extends({}, prevState.expansion, {
|
|
19
16
|
expandedItemsMap: createExpandedItemsMap(models.expandedItems.value)
|
|
20
|
-
}
|
|
17
|
+
})
|
|
21
18
|
}));
|
|
22
19
|
}, [store, models.expandedItems.value]);
|
|
20
|
+
useEnhancedEffect(() => {
|
|
21
|
+
store.update(prevState => {
|
|
22
|
+
const newExpansionTrigger = getExpansionTrigger({
|
|
23
|
+
isItemEditable: params.isItemEditable,
|
|
24
|
+
expansionTrigger: params.expansionTrigger
|
|
25
|
+
});
|
|
26
|
+
if (prevState.expansion.expansionTrigger === newExpansionTrigger) {
|
|
27
|
+
return prevState;
|
|
28
|
+
}
|
|
29
|
+
return _extends({}, prevState, {
|
|
30
|
+
expansion: _extends({}, prevState.expansion, {
|
|
31
|
+
expansionTrigger: newExpansionTrigger
|
|
32
|
+
})
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}, [store, params.isItemEditable, params.expansionTrigger]);
|
|
23
36
|
const setExpandedItems = (event, value) => {
|
|
24
37
|
params.onExpandedItemsChange?.(event, value);
|
|
25
38
|
models.expandedItems.setControlledValue(value);
|
|
@@ -61,20 +74,6 @@ export const useTreeViewExpansion = ({
|
|
|
61
74
|
setExpandedItems(event, newExpanded);
|
|
62
75
|
}
|
|
63
76
|
};
|
|
64
|
-
const expansionTrigger = React.useMemo(() => {
|
|
65
|
-
if (params.expansionTrigger) {
|
|
66
|
-
return params.expansionTrigger;
|
|
67
|
-
}
|
|
68
|
-
if (isTreeViewEditable) {
|
|
69
|
-
return 'iconContainer';
|
|
70
|
-
}
|
|
71
|
-
return 'content';
|
|
72
|
-
}, [params.expansionTrigger, isTreeViewEditable]);
|
|
73
|
-
const pluginContextValue = React.useMemo(() => ({
|
|
74
|
-
expansion: {
|
|
75
|
-
expansionTrigger
|
|
76
|
-
}
|
|
77
|
-
}), [expansionTrigger]);
|
|
78
77
|
return {
|
|
79
78
|
publicAPI: {
|
|
80
79
|
setItemExpansion
|
|
@@ -83,8 +82,7 @@ export const useTreeViewExpansion = ({
|
|
|
83
82
|
setItemExpansion,
|
|
84
83
|
toggleItemExpansion,
|
|
85
84
|
expandAllSiblings
|
|
86
|
-
}
|
|
87
|
-
contextValue: pluginContextValue
|
|
85
|
+
}
|
|
88
86
|
};
|
|
89
87
|
};
|
|
90
88
|
useTreeViewExpansion.models = {
|
|
@@ -100,7 +98,8 @@ useTreeViewExpansion.getDefaultizedParams = ({
|
|
|
100
98
|
});
|
|
101
99
|
useTreeViewExpansion.getInitialState = params => ({
|
|
102
100
|
expansion: {
|
|
103
|
-
expandedItemsMap: createExpandedItemsMap(params.expandedItems === undefined ? params.defaultExpandedItems : params.expandedItems)
|
|
101
|
+
expandedItemsMap: createExpandedItemsMap(params.expandedItems === undefined ? params.defaultExpandedItems : params.expandedItems),
|
|
102
|
+
expansionTrigger: getExpansionTrigger(params)
|
|
104
103
|
}
|
|
105
104
|
});
|
|
106
105
|
useTreeViewExpansion.params = {
|
|
@@ -14,4 +14,11 @@ export const selectorIsItemExpanded = createSelector([selectorExpansion, (_, ite
|
|
|
14
14
|
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
15
15
|
* @returns {boolean} `true` if the item is expandable, `false` otherwise.
|
|
16
16
|
*/
|
|
17
|
-
export const selectorIsItemExpandable = createSelector([selectorItemMeta], itemMeta => itemMeta?.expandable ?? false);
|
|
17
|
+
export const selectorIsItemExpandable = createSelector([selectorItemMeta], itemMeta => itemMeta?.expandable ?? false);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Get the slot that triggers the item's expansion when clicked.
|
|
21
|
+
* @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
|
|
22
|
+
* @returns {'content' | 'iconContainer'} The slot that triggers the item's expansion when clicked. Is `null` if the item is not expandable.
|
|
23
|
+
*/
|
|
24
|
+
export const selectorItemExpansionTrigger = createSelector([selectorExpansion], expansionState => expansionState.expansionTrigger);
|
|
@@ -4,4 +4,16 @@ export const createExpandedItemsMap = expandedItems => {
|
|
|
4
4
|
expandedItemsMap.set(id, true);
|
|
5
5
|
});
|
|
6
6
|
return expandedItemsMap;
|
|
7
|
+
};
|
|
8
|
+
export const getExpansionTrigger = ({
|
|
9
|
+
isItemEditable,
|
|
10
|
+
expansionTrigger
|
|
11
|
+
}) => {
|
|
12
|
+
if (expansionTrigger) {
|
|
13
|
+
return expansionTrigger;
|
|
14
|
+
}
|
|
15
|
+
if (isItemEditable) {
|
|
16
|
+
return 'iconContainer';
|
|
17
|
+
}
|
|
18
|
+
return 'content';
|
|
7
19
|
};
|
|
@@ -2,19 +2,18 @@ import _extends from "@babel/runtime/helpers/esm/extends";
|
|
|
2
2
|
import { useTreeViewContext } from "../../TreeViewProvider/index.js";
|
|
3
3
|
import { selectorItemOrderedChildrenIds } from "../useTreeViewItems/useTreeViewItems.selectors.js";
|
|
4
4
|
import { selectorIsItemSelected } from "./useTreeViewSelection.selectors.js";
|
|
5
|
-
|
|
5
|
+
import { useSelector } from "../../hooks/useSelector.js";
|
|
6
|
+
function selectorItemCheckboxStatus(state, {
|
|
6
7
|
itemId,
|
|
7
|
-
|
|
8
|
-
selectionPropagation,
|
|
9
|
-
selected
|
|
8
|
+
selectionPropagation
|
|
10
9
|
}) {
|
|
11
|
-
if (
|
|
10
|
+
if (selectorIsItemSelected(state, itemId)) {
|
|
12
11
|
return {
|
|
13
12
|
indeterminate: false,
|
|
14
13
|
checked: true
|
|
15
14
|
};
|
|
16
15
|
}
|
|
17
|
-
const children = selectorItemOrderedChildrenIds(
|
|
16
|
+
const children = selectorItemOrderedChildrenIds(state, itemId);
|
|
18
17
|
if (children.length === 0) {
|
|
19
18
|
return {
|
|
20
19
|
indeterminate: false,
|
|
@@ -25,18 +24,18 @@ function getCheckboxStatus({
|
|
|
25
24
|
let hasUnSelectedDescendant = false;
|
|
26
25
|
const traverseDescendants = itemToTraverseId => {
|
|
27
26
|
if (itemToTraverseId !== itemId) {
|
|
28
|
-
if (selectorIsItemSelected(
|
|
27
|
+
if (selectorIsItemSelected(state, itemToTraverseId)) {
|
|
29
28
|
hasSelectedDescendant = true;
|
|
30
29
|
} else {
|
|
31
30
|
hasUnSelectedDescendant = true;
|
|
32
31
|
}
|
|
33
32
|
}
|
|
34
|
-
selectorItemOrderedChildrenIds(
|
|
33
|
+
selectorItemOrderedChildrenIds(state, itemToTraverseId).forEach(traverseDescendants);
|
|
35
34
|
};
|
|
36
35
|
traverseDescendants(itemId);
|
|
37
36
|
return {
|
|
38
|
-
indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant
|
|
39
|
-
checked: selectionPropagation.parents ? hasSelectedDescendant :
|
|
37
|
+
indeterminate: hasSelectedDescendant && hasUnSelectedDescendant || !hasUnSelectedDescendant,
|
|
38
|
+
checked: selectionPropagation.parents ? hasSelectedDescendant : false
|
|
40
39
|
};
|
|
41
40
|
}
|
|
42
41
|
export const useTreeViewSelectionItemPlugin = ({
|
|
@@ -53,6 +52,10 @@ export const useTreeViewSelectionItemPlugin = ({
|
|
|
53
52
|
selectionPropagation
|
|
54
53
|
}
|
|
55
54
|
} = useTreeViewContext();
|
|
55
|
+
const checkboxStatus = useSelector(store, selectorItemCheckboxStatus, {
|
|
56
|
+
itemId,
|
|
57
|
+
selectionPropagation
|
|
58
|
+
}, (a, b) => a.checked === b.checked && a.indeterminate === b.indeterminate);
|
|
56
59
|
return {
|
|
57
60
|
propsEnhancers: {
|
|
58
61
|
checkbox: ({
|
|
@@ -70,12 +73,6 @@ export const useTreeViewSelectionItemPlugin = ({
|
|
|
70
73
|
}
|
|
71
74
|
interactions.handleCheckboxSelection(event);
|
|
72
75
|
};
|
|
73
|
-
const checkboxStatus = getCheckboxStatus({
|
|
74
|
-
store,
|
|
75
|
-
itemId,
|
|
76
|
-
selectionPropagation,
|
|
77
|
-
selected: status.selected
|
|
78
|
-
});
|
|
79
76
|
return _extends({
|
|
80
77
|
visible: checkboxSelection,
|
|
81
78
|
disabled: disableSelection || status.disabled,
|
|
@@ -13,6 +13,7 @@ import { selectorIsItemTheDefaultFocusableItem } from "../internals/plugins/useT
|
|
|
13
13
|
import { generateTreeItemIdAttribute } from "../internals/corePlugins/useTreeViewId/useTreeViewId.utils.js";
|
|
14
14
|
import { selectorCanItemBeFocused } from "../internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js";
|
|
15
15
|
import { selectorTreeViewId } from "../internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js";
|
|
16
|
+
import { selectorItemExpansionTrigger } from "../internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js";
|
|
16
17
|
export const useTreeItem = parameters => {
|
|
17
18
|
const {
|
|
18
19
|
runItemPlugins,
|
|
@@ -23,9 +24,6 @@ export const useTreeItem = parameters => {
|
|
|
23
24
|
disableSelection,
|
|
24
25
|
checkboxSelection
|
|
25
26
|
},
|
|
26
|
-
expansion: {
|
|
27
|
-
expansionTrigger
|
|
28
|
-
},
|
|
29
27
|
label: labelContext,
|
|
30
28
|
instance,
|
|
31
29
|
publicAPI,
|
|
@@ -122,7 +120,7 @@ export const useTreeItem = parameters => {
|
|
|
122
120
|
if (event.defaultMuiPrevented || checkboxRef.current?.contains(event.target)) {
|
|
123
121
|
return;
|
|
124
122
|
}
|
|
125
|
-
if (
|
|
123
|
+
if (selectorItemExpansionTrigger(store.value) === 'content') {
|
|
126
124
|
interactions.handleExpansion(event);
|
|
127
125
|
}
|
|
128
126
|
if (!checkboxSelection) {
|
|
@@ -145,7 +143,7 @@ export const useTreeItem = parameters => {
|
|
|
145
143
|
if (event.defaultMuiPrevented) {
|
|
146
144
|
return;
|
|
147
145
|
}
|
|
148
|
-
if (
|
|
146
|
+
if (selectorItemExpansionTrigger(store.value) === 'iconContainer') {
|
|
149
147
|
interactions.handleExpansion(event);
|
|
150
148
|
}
|
|
151
149
|
};
|
|
@@ -11,14 +11,14 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
|
|
|
11
11
|
var React = _interopRequireWildcard(require("react"));
|
|
12
12
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
13
13
|
var _styles = require("@mui/material/styles");
|
|
14
|
-
var
|
|
14
|
+
var _createStyled = require("@mui/system/createStyled");
|
|
15
15
|
var _zeroStyled = require("../internals/zero-styled");
|
|
16
16
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
17
17
|
const TreeItemDragAndDropOverlayRoot = (0, _zeroStyled.styled)('div', {
|
|
18
18
|
name: 'MuiTreeItemDragAndDropOverlay',
|
|
19
19
|
slot: 'Root',
|
|
20
20
|
overridesResolver: (props, styles) => styles.root,
|
|
21
|
-
shouldForwardProp: prop => (0,
|
|
21
|
+
shouldForwardProp: prop => (0, _createStyled.shouldForwardProp)(prop) && prop !== 'action'
|
|
22
22
|
})(({
|
|
23
23
|
theme
|
|
24
24
|
}) => ({
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
'use client';
|
|
2
3
|
|
|
3
4
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
4
6
|
Object.defineProperty(exports, "__esModule", {
|
|
5
7
|
value: true
|
|
6
8
|
});
|
|
7
9
|
exports.TreeItemProvider = TreeItemProvider;
|
|
10
|
+
var React = _interopRequireWildcard(require("react"));
|
|
8
11
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
9
12
|
var _TreeViewProvider = require("../internals/TreeViewProvider");
|
|
10
13
|
var _useTreeViewId = require("../internals/corePlugins/useTreeViewId/useTreeViewId.utils");
|
|
11
14
|
var _useSelector = require("../internals/hooks/useSelector");
|
|
12
15
|
var _useTreeViewId2 = require("../internals/corePlugins/useTreeViewId/useTreeViewId.selectors");
|
|
13
|
-
|
|
14
|
-
* @ignore - internal component.
|
|
15
|
-
*/
|
|
16
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
16
17
|
function TreeItemProvider(props) {
|
|
17
18
|
const {
|
|
18
19
|
children,
|
|
@@ -30,14 +31,16 @@ function TreeItemProvider(props) {
|
|
|
30
31
|
treeId,
|
|
31
32
|
id
|
|
32
33
|
});
|
|
33
|
-
return
|
|
34
|
-
children
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(React.Fragment, {
|
|
35
|
+
children: wrapItem({
|
|
36
|
+
children,
|
|
37
|
+
itemId,
|
|
38
|
+
instance,
|
|
39
|
+
idAttribute
|
|
40
|
+
})
|
|
38
41
|
});
|
|
39
42
|
}
|
|
40
|
-
TreeItemProvider.propTypes = {
|
|
43
|
+
process.env.NODE_ENV !== "production" ? TreeItemProvider.propTypes = {
|
|
41
44
|
// ----------------------------- Warning --------------------------------
|
|
42
45
|
// | These PropTypes are generated from the TypeScript type definitions |
|
|
43
46
|
// | To update them edit the TypeScript types and run "pnpm proptypes" |
|
|
@@ -45,4 +48,4 @@ TreeItemProvider.propTypes = {
|
|
|
45
48
|
children: _propTypes.default.node,
|
|
46
49
|
id: _propTypes.default.string,
|
|
47
50
|
itemId: _propTypes.default.string.isRequired
|
|
48
|
-
};
|
|
51
|
+
} : void 0;
|
package/node/index.js
CHANGED
|
@@ -22,7 +22,7 @@ function createUseInstanceEventHandler(registryContainer) {
|
|
|
22
22
|
}
|
|
23
23
|
const [objectRetainedByReact] = React.useState(new ObjectToBeRetainedByReact());
|
|
24
24
|
const subscription = React.useRef(null);
|
|
25
|
-
const handlerRef = React.useRef();
|
|
25
|
+
const handlerRef = React.useRef(undefined);
|
|
26
26
|
handlerRef.current = handler;
|
|
27
27
|
const cleanupTokenRef = React.useRef(null);
|
|
28
28
|
if (!subscription.current && handlerRef.current) {
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
4
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.useTreeViewExpansion = void 0;
|
|
9
8
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
10
|
-
var React = _interopRequireWildcard(require("react"));
|
|
11
9
|
var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
|
|
12
10
|
var _useEnhancedEffect = _interopRequireDefault(require("@mui/utils/useEnhancedEffect"));
|
|
13
11
|
var _useTreeViewExpansion = require("./useTreeViewExpansion.selectors");
|
|
@@ -17,17 +15,31 @@ const useTreeViewExpansion = ({
|
|
|
17
15
|
instance,
|
|
18
16
|
store,
|
|
19
17
|
params,
|
|
20
|
-
models
|
|
21
|
-
experimentalFeatures
|
|
18
|
+
models
|
|
22
19
|
}) => {
|
|
23
|
-
const isTreeViewEditable = Boolean(params.isItemEditable) && !!experimentalFeatures.labelEditing;
|
|
24
20
|
(0, _useEnhancedEffect.default)(() => {
|
|
25
21
|
store.update(prevState => (0, _extends2.default)({}, prevState, {
|
|
26
|
-
expansion: {
|
|
22
|
+
expansion: (0, _extends2.default)({}, prevState.expansion, {
|
|
27
23
|
expandedItemsMap: (0, _useTreeViewExpansion2.createExpandedItemsMap)(models.expandedItems.value)
|
|
28
|
-
}
|
|
24
|
+
})
|
|
29
25
|
}));
|
|
30
26
|
}, [store, models.expandedItems.value]);
|
|
27
|
+
(0, _useEnhancedEffect.default)(() => {
|
|
28
|
+
store.update(prevState => {
|
|
29
|
+
const newExpansionTrigger = (0, _useTreeViewExpansion2.getExpansionTrigger)({
|
|
30
|
+
isItemEditable: params.isItemEditable,
|
|
31
|
+
expansionTrigger: params.expansionTrigger
|
|
32
|
+
});
|
|
33
|
+
if (prevState.expansion.expansionTrigger === newExpansionTrigger) {
|
|
34
|
+
return prevState;
|
|
35
|
+
}
|
|
36
|
+
return (0, _extends2.default)({}, prevState, {
|
|
37
|
+
expansion: (0, _extends2.default)({}, prevState.expansion, {
|
|
38
|
+
expansionTrigger: newExpansionTrigger
|
|
39
|
+
})
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}, [store, params.isItemEditable, params.expansionTrigger]);
|
|
31
43
|
const setExpandedItems = (event, value) => {
|
|
32
44
|
params.onExpandedItemsChange?.(event, value);
|
|
33
45
|
models.expandedItems.setControlledValue(value);
|
|
@@ -69,20 +81,6 @@ const useTreeViewExpansion = ({
|
|
|
69
81
|
setExpandedItems(event, newExpanded);
|
|
70
82
|
}
|
|
71
83
|
};
|
|
72
|
-
const expansionTrigger = React.useMemo(() => {
|
|
73
|
-
if (params.expansionTrigger) {
|
|
74
|
-
return params.expansionTrigger;
|
|
75
|
-
}
|
|
76
|
-
if (isTreeViewEditable) {
|
|
77
|
-
return 'iconContainer';
|
|
78
|
-
}
|
|
79
|
-
return 'content';
|
|
80
|
-
}, [params.expansionTrigger, isTreeViewEditable]);
|
|
81
|
-
const pluginContextValue = React.useMemo(() => ({
|
|
82
|
-
expansion: {
|
|
83
|
-
expansionTrigger
|
|
84
|
-
}
|
|
85
|
-
}), [expansionTrigger]);
|
|
86
84
|
return {
|
|
87
85
|
publicAPI: {
|
|
88
86
|
setItemExpansion
|
|
@@ -91,8 +89,7 @@ const useTreeViewExpansion = ({
|
|
|
91
89
|
setItemExpansion,
|
|
92
90
|
toggleItemExpansion,
|
|
93
91
|
expandAllSiblings
|
|
94
|
-
}
|
|
95
|
-
contextValue: pluginContextValue
|
|
92
|
+
}
|
|
96
93
|
};
|
|
97
94
|
};
|
|
98
95
|
exports.useTreeViewExpansion = useTreeViewExpansion;
|
|
@@ -109,7 +106,8 @@ useTreeViewExpansion.getDefaultizedParams = ({
|
|
|
109
106
|
});
|
|
110
107
|
useTreeViewExpansion.getInitialState = params => ({
|
|
111
108
|
expansion: {
|
|
112
|
-
expandedItemsMap: (0, _useTreeViewExpansion2.createExpandedItemsMap)(params.expandedItems === undefined ? params.defaultExpandedItems : params.expandedItems)
|
|
109
|
+
expandedItemsMap: (0, _useTreeViewExpansion2.createExpandedItemsMap)(params.expandedItems === undefined ? params.defaultExpandedItems : params.expandedItems),
|
|
110
|
+
expansionTrigger: (0, _useTreeViewExpansion2.getExpansionTrigger)(params)
|
|
113
111
|
}
|
|
114
112
|
});
|
|
115
113
|
useTreeViewExpansion.params = {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.selectorIsItemExpanded = exports.selectorIsItemExpandable = void 0;
|
|
6
|
+
exports.selectorItemExpansionTrigger = exports.selectorIsItemExpanded = exports.selectorIsItemExpandable = void 0;
|
|
7
7
|
var _selectors = require("../../utils/selectors");
|
|
8
8
|
var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
|
|
9
9
|
const selectorExpansion = state => state.expansion;
|
|
@@ -20,4 +20,11 @@ const selectorIsItemExpanded = exports.selectorIsItemExpanded = (0, _selectors.c
|
|
|
20
20
|
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
21
21
|
* @returns {boolean} `true` if the item is expandable, `false` otherwise.
|
|
22
22
|
*/
|
|
23
|
-
const selectorIsItemExpandable = exports.selectorIsItemExpandable = (0, _selectors.createSelector)([_useTreeViewItems.selectorItemMeta], itemMeta => itemMeta?.expandable ?? false);
|
|
23
|
+
const selectorIsItemExpandable = exports.selectorIsItemExpandable = (0, _selectors.createSelector)([_useTreeViewItems.selectorItemMeta], itemMeta => itemMeta?.expandable ?? false);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Get the slot that triggers the item's expansion when clicked.
|
|
27
|
+
* @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
|
|
28
|
+
* @returns {'content' | 'iconContainer'} The slot that triggers the item's expansion when clicked. Is `null` if the item is not expandable.
|
|
29
|
+
*/
|
|
30
|
+
const selectorItemExpansionTrigger = exports.selectorItemExpansionTrigger = (0, _selectors.createSelector)([selectorExpansion], expansionState => expansionState.expansionTrigger);
|