@mui/x-tree-view 8.12.0 → 8.13.1
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 +207 -0
- package/RichTreeView/RichTreeView.js +5 -5
- package/RichTreeView/RichTreeView.types.d.ts +2 -3
- package/RichTreeView/index.d.ts +1 -1
- package/SimpleTreeView/SimpleTreeView.types.d.ts +2 -3
- package/SimpleTreeView/index.d.ts +1 -1
- package/esm/RichTreeView/RichTreeView.js +5 -5
- package/esm/RichTreeView/RichTreeView.types.d.ts +2 -3
- package/esm/RichTreeView/index.d.ts +1 -1
- package/esm/SimpleTreeView/SimpleTreeView.types.d.ts +2 -3
- package/esm/SimpleTreeView/index.d.ts +1 -1
- package/esm/hooks/useApplyPropagationToSelectedItemsOnMount.js +2 -2
- package/esm/index.js +1 -1
- package/esm/internals/index.d.ts +2 -2
- package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +4 -4
- package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +1 -1
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.js +79 -158
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +0 -8
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +0 -8
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +12 -26
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.utils.d.ts +36 -2
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.utils.js +115 -1
- package/esm/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +6 -6
- package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +1 -1
- package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +2 -2
- package/esm/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -1
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +6 -2
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +7 -2
- package/esm/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +8 -9
- package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +12 -3
- package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +2 -2
- package/esm/internals/useTreeView/useTreeView.js +2 -2
- package/esm/useTreeItem/useTreeItem.js +3 -3
- package/hooks/useApplyPropagationToSelectedItemsOnMount.js +2 -3
- package/index.js +1 -1
- package/internals/index.d.ts +2 -2
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +8 -8
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +4 -4
- package/internals/plugins/useTreeViewItems/useTreeViewItems.js +80 -159
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +0 -8
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +0 -8
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +12 -26
- package/internals/plugins/useTreeViewItems/useTreeViewItems.utils.d.ts +36 -2
- package/internals/plugins/useTreeViewItems/useTreeViewItems.utils.js +119 -2
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +8 -8
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +2 -3
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +2 -2
- package/internals/plugins/useTreeViewLazyLoading/index.d.ts +1 -1
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.d.ts +6 -2
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.selectors.js +7 -2
- package/internals/plugins/useTreeViewLazyLoading/useTreeViewLazyLoading.types.d.ts +8 -9
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +12 -3
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +2 -2
- package/internals/useTreeView/useTreeView.js +2 -2
- package/package.json +3 -3
- package/useTreeItem/useTreeItem.js +3 -3
- package/esm/internals/hooks/useLazyRef.d.ts +0 -1
- package/esm/internals/hooks/useLazyRef.js +0 -1
- package/esm/internals/hooks/useOnMount.d.ts +0 -1
- package/esm/internals/hooks/useOnMount.js +0 -1
- package/esm/internals/hooks/useTimeout.d.ts +0 -1
- package/esm/internals/hooks/useTimeout.js +0 -1
- package/internals/hooks/useLazyRef.d.ts +0 -1
- package/internals/hooks/useLazyRef.js +0 -13
- package/internals/hooks/useOnMount.d.ts +0 -1
- package/internals/hooks/useOnMount.js +0 -13
- package/internals/hooks/useTimeout.d.ts +0 -1
- package/internals/hooks/useTimeout.js +0 -13
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createSelector } from '@mui/x-internals/store';
|
|
2
|
+
import { TREE_VIEW_ROOT_PARENT_ID } from "../useTreeViewItems/index.js";
|
|
2
3
|
export const lazyLoadingSelectors = {
|
|
3
4
|
/**
|
|
4
5
|
* Gets the data source used to lazy load items.
|
|
@@ -7,9 +8,13 @@ export const lazyLoadingSelectors = {
|
|
|
7
8
|
/**
|
|
8
9
|
* Checks whether an item is loading.
|
|
9
10
|
*/
|
|
10
|
-
isItemLoading: createSelector((state, itemId) => state.lazyLoading?.dataSource.loading[itemId] ?? false),
|
|
11
|
+
isItemLoading: createSelector((state, itemId) => state.lazyLoading?.dataSource.loading[itemId ?? TREE_VIEW_ROOT_PARENT_ID] ?? false),
|
|
11
12
|
/**
|
|
12
13
|
* Checks whether an item has errors.
|
|
13
14
|
*/
|
|
14
|
-
itemHasError: createSelector((state, itemId) => !!state.lazyLoading?.dataSource.errors[itemId])
|
|
15
|
+
itemHasError: createSelector((state, itemId) => !!state.lazyLoading?.dataSource.errors[itemId ?? TREE_VIEW_ROOT_PARENT_ID]),
|
|
16
|
+
/**
|
|
17
|
+
* Get an item error.
|
|
18
|
+
*/
|
|
19
|
+
itemError: createSelector((state, itemId) => state.lazyLoading?.dataSource.errors[itemId ?? TREE_VIEW_ROOT_PARENT_ID])
|
|
15
20
|
};
|
|
@@ -5,7 +5,7 @@ import { TreeViewItemId } from "../../../models/index.js";
|
|
|
5
5
|
import { UseTreeViewItemsSignature } from "../useTreeViewItems/index.js";
|
|
6
6
|
import { UseTreeViewExpansionSignature } from "../useTreeViewExpansion/index.js";
|
|
7
7
|
import { UseTreeViewSelectionSignature } from "../useTreeViewSelection/index.js";
|
|
8
|
-
type DataSource<R extends {}> = {
|
|
8
|
+
export type DataSource<R extends {}> = {
|
|
9
9
|
/**
|
|
10
10
|
* Used to determine the number of children the item has.
|
|
11
11
|
* Only relevant for lazy-loaded trees.
|
|
@@ -43,7 +43,7 @@ export interface UseTreeViewLazyLoadingInstance extends UseTreeViewLazyLoadingPu
|
|
|
43
43
|
* @param {TreeViewItemId[]} parentIds The ids of the items to fetch the children of.
|
|
44
44
|
* @returns {Promise<void>} The promise resolved when the items are fetched.
|
|
45
45
|
*/
|
|
46
|
-
fetchItems: (parentIds
|
|
46
|
+
fetchItems: (parentIds: TreeViewItemId[]) => Promise<void>;
|
|
47
47
|
/**
|
|
48
48
|
* Method used for fetching an item's children.
|
|
49
49
|
* Only relevant for lazy-loaded tree views.
|
|
@@ -54,21 +54,21 @@ export interface UseTreeViewLazyLoadingInstance extends UseTreeViewLazyLoadingPu
|
|
|
54
54
|
* @returns {Promise<void>} The promise resolved when the items are fetched.
|
|
55
55
|
*/
|
|
56
56
|
fetchItemChildren: (parameters: {
|
|
57
|
-
itemId: TreeViewItemId;
|
|
57
|
+
itemId: TreeViewItemId | null;
|
|
58
58
|
forceRefresh?: boolean;
|
|
59
59
|
}) => Promise<void>;
|
|
60
60
|
/**
|
|
61
61
|
* Set the loading state of an item.
|
|
62
|
-
* @param {TreeViewItemId} itemId The id of the item to set the loading state of.
|
|
62
|
+
* @param {TreeViewItemId} itemId The id of the item to set the loading state of. If `null` is passed, it will set the loading state of the root.
|
|
63
63
|
* @param {boolean} isLoading True if the item is loading.
|
|
64
64
|
*/
|
|
65
|
-
setDataSourceLoading: (itemId: TreeViewItemId, isLoading: boolean) => void;
|
|
65
|
+
setDataSourceLoading: (itemId: TreeViewItemId | null, isLoading: boolean) => void;
|
|
66
66
|
/**
|
|
67
67
|
* Set the error state of an item.
|
|
68
|
-
* @param {TreeViewItemId} itemId The id of the item to set the error state of.
|
|
68
|
+
* @param {TreeViewItemId} itemId The id of the item to set the error state of. If `null` is passed, it will set the error state of the root.
|
|
69
69
|
* @param {Error | null} error The error caught on the item.
|
|
70
70
|
*/
|
|
71
|
-
setDataSourceError: (itemId: TreeViewItemId, error: Error | null) => void;
|
|
71
|
+
setDataSourceError: (itemId: TreeViewItemId | null, error: Error | null) => void;
|
|
72
72
|
}
|
|
73
73
|
export interface UseTreeViewLazyLoadingParameters<R extends {}> {
|
|
74
74
|
/**
|
|
@@ -97,5 +97,4 @@ export type UseTreeViewLazyLoadingSignature = TreeViewPluginSignature<{
|
|
|
97
97
|
instance: UseTreeViewLazyLoadingInstance;
|
|
98
98
|
state: UseTreeViewLazyLoadingState;
|
|
99
99
|
dependencies: [UseTreeViewItemsSignature, UseTreeViewExpansionSignature, UseTreeViewSelectionSignature];
|
|
100
|
-
}>;
|
|
101
|
-
export {};
|
|
100
|
+
}>;
|
|
@@ -19,11 +19,20 @@ const selectorCheckboxSelectionStatus = createSelector((state, itemId) => {
|
|
|
19
19
|
itemsSelectors.itemOrderedChildrenIds(state, itemToTraverseId).forEach(traverseDescendants);
|
|
20
20
|
};
|
|
21
21
|
traverseDescendants(itemId);
|
|
22
|
-
|
|
22
|
+
const shouldSelectBasedOnDescendants = selectionSelectors.propagationRules(state).parents;
|
|
23
|
+
if (shouldSelectBasedOnDescendants) {
|
|
24
|
+
if (hasSelectedDescendant && hasUnSelectedDescendant) {
|
|
25
|
+
return 'indeterminate';
|
|
26
|
+
}
|
|
27
|
+
if (hasSelectedDescendant && !hasUnSelectedDescendant) {
|
|
28
|
+
return 'checked';
|
|
29
|
+
}
|
|
30
|
+
return 'empty';
|
|
31
|
+
}
|
|
32
|
+
if (hasSelectedDescendant) {
|
|
23
33
|
return 'indeterminate';
|
|
24
34
|
}
|
|
25
|
-
|
|
26
|
-
return shouldSelectBasedOnDescendants && hasSelectedDescendant && !hasUnSelectedDescendant ? 'checked' : 'empty';
|
|
35
|
+
return 'empty';
|
|
27
36
|
});
|
|
28
37
|
export const useTreeViewSelectionItemPlugin = ({
|
|
29
38
|
props
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { useAssertModelConsistency } from '@mui/x-internals/useAssertModelConsistency';
|
|
4
|
-
import
|
|
4
|
+
import { useIsoLayoutEffect } from '@base-ui-components/utils/useIsoLayoutEffect';
|
|
5
5
|
import { findOrderInTremauxTree, getAllNavigableItems, getFirstNavigableItem, getLastNavigableItem, getNonDisabledItemsInRange } from "../../utils/tree.js";
|
|
6
6
|
import { propagateSelection, getAddedAndRemovedItems, getLookupFromArray } from "./useTreeViewSelection.utils.js";
|
|
7
7
|
import { selectionSelectors } from "./useTreeViewSelection.selectors.js";
|
|
@@ -168,7 +168,7 @@ export const useTreeViewSelection = ({
|
|
|
168
168
|
}
|
|
169
169
|
setSelectedItems(event, newSelectedItems);
|
|
170
170
|
};
|
|
171
|
-
|
|
171
|
+
useIsoLayoutEffect(() => {
|
|
172
172
|
store.set('selection', {
|
|
173
173
|
selectedItems: params.selectedItems === undefined ? store.state.selection.selectedItems : params.selectedItems,
|
|
174
174
|
isEnabled: !params.disableSelection,
|
|
@@ -2,7 +2,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { useRefWithInit } from '@base-ui-components/utils/useRefWithInit';
|
|
4
4
|
import { Store } from '@mui/x-internals/store';
|
|
5
|
-
import
|
|
5
|
+
import { useMergedRefs } from '@base-ui-components/utils/useMergedRefs';
|
|
6
6
|
import { TREE_VIEW_CORE_PLUGINS } from "../corePlugins/index.js";
|
|
7
7
|
import { useExtractPluginParamsFromProps } from "./useExtractPluginParamsFromProps.js";
|
|
8
8
|
import { useTreeViewBuildContext } from "./useTreeViewBuildContext.js";
|
|
@@ -46,7 +46,7 @@ export const useTreeView = ({
|
|
|
46
46
|
const instance = useRefWithInit(() => ({})).current;
|
|
47
47
|
const publicAPI = useTreeViewApiInitialization(apiRef);
|
|
48
48
|
const innerRootRef = React.useRef(null);
|
|
49
|
-
const handleRootRef =
|
|
49
|
+
const handleRootRef = useMergedRefs(innerRootRef, rootRef);
|
|
50
50
|
const store = useRefWithInit(() => {
|
|
51
51
|
const initialState = {};
|
|
52
52
|
for (const plugin of plugins) {
|
|
@@ -4,7 +4,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
|
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import { useStore } from '@mui/x-internals/store';
|
|
6
6
|
import extractEventHandlers from '@mui/utils/extractEventHandlers';
|
|
7
|
-
import
|
|
7
|
+
import { useMergedRefs } from '@base-ui-components/utils/useMergedRefs';
|
|
8
8
|
import { useTreeViewContext } from "../internals/TreeViewProvider/index.js";
|
|
9
9
|
import { useTreeItemUtils } from "../hooks/useTreeItemUtils/index.js";
|
|
10
10
|
import { TreeViewItemDepthContext } from "../internals/TreeViewItemDepthContext/index.js";
|
|
@@ -50,8 +50,8 @@ export const useTreeItem = parameters => {
|
|
|
50
50
|
});
|
|
51
51
|
const rootRefObject = React.useRef(null);
|
|
52
52
|
const contentRefObject = React.useRef(null);
|
|
53
|
-
const handleRootRef =
|
|
54
|
-
const handleContentRef =
|
|
53
|
+
const handleRootRef = useMergedRefs(rootRef, pluginRootRef, rootRefObject);
|
|
54
|
+
const handleContentRef = useMergedRefs(contentRef, contentRefObject);
|
|
55
55
|
const checkboxRef = React.useRef(null);
|
|
56
56
|
const treeId = useStore(store, idSelectors.treeId);
|
|
57
57
|
const isSelectionEnabledForItem = useStore(store, selectionSelectors.canItemBeSelected, itemId);
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
3
|
Object.defineProperty(exports, "__esModule", {
|
|
5
4
|
value: true
|
|
6
5
|
});
|
|
7
6
|
exports.useApplyPropagationToSelectedItemsOnMount = useApplyPropagationToSelectedItemsOnMount;
|
|
8
|
-
var
|
|
7
|
+
var _useRefWithInit = require("@base-ui-components/utils/useRefWithInit");
|
|
9
8
|
var _useTreeViewSelection = require("../internals/plugins/useTreeViewSelection/useTreeViewSelection.utils");
|
|
10
9
|
const defaultGetItemId = item => item.id;
|
|
11
10
|
const defaultGetItemChildren = item => item.children;
|
|
@@ -59,7 +58,7 @@ function useApplyPropagationToSelectedItemsOnMount(parameters) {
|
|
|
59
58
|
selectedItems,
|
|
60
59
|
selectionPropagation
|
|
61
60
|
} = parameters;
|
|
62
|
-
return (0,
|
|
61
|
+
return (0, _useRefWithInit.useRefWithInit)(() => {
|
|
63
62
|
const lookup = (0, _useTreeViewSelection.getLookupFromArray)(selectedItems);
|
|
64
63
|
function walk(items, isParentSelected) {
|
|
65
64
|
for (const item of items) {
|
package/index.js
CHANGED
package/internals/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export { TreeViewProvider, useTreeViewContext } from "./TreeViewProvider/index.j
|
|
|
3
3
|
export { RichTreeViewItems } from "./components/RichTreeViewItems.js";
|
|
4
4
|
export type { RichTreeViewItemsSlots, RichTreeViewItemsSlotProps } from "./components/RichTreeViewItems.js";
|
|
5
5
|
export { unstable_resetCleanupTracking, useInstanceEventHandler } from "./hooks/useInstanceEventHandler.js";
|
|
6
|
-
export type { TreeViewPlugin, TreeViewPluginSignature, ConvertPluginsIntoSignatures, MergeSignaturesProperty, TreeViewPublicAPI, TreeViewState, TreeViewItemMeta, TreeViewInstance, TreeViewItemPlugin, TreeViewUsedStore } from "./models/index.js";
|
|
6
|
+
export type { TreeViewPlugin, TreeViewPluginSignature, ConvertPluginsIntoSignatures, MergeSignaturesProperty, TreeViewPublicAPI, TreeViewState, TreeViewItemMeta, TreeViewInstance, TreeViewItemPlugin, TreeViewUsedStore, TreeViewUsedInstance, TreeViewUsedParamsWithDefaults } from "./models/index.js";
|
|
7
7
|
export type { TreeViewCorePluginParameters } from "./corePlugins/index.js";
|
|
8
8
|
export { useTreeViewExpansion, expansionSelectors } from "./plugins/useTreeViewExpansion/index.js";
|
|
9
9
|
export type { UseTreeViewExpansionSignature, UseTreeViewExpansionParameters } from "./plugins/useTreeViewExpansion/index.js";
|
|
@@ -17,7 +17,7 @@ export { useTreeViewItems, buildSiblingIndexes, itemsSelectors, TREE_VIEW_ROOT_P
|
|
|
17
17
|
export type { UseTreeViewItemsSignature, UseTreeViewItemsParameters, UseTreeViewItemsState } from "./plugins/useTreeViewItems/index.js";
|
|
18
18
|
export { useTreeViewLabel, labelSelectors } from "./plugins/useTreeViewLabel/index.js";
|
|
19
19
|
export type { UseTreeViewLabelSignature, UseTreeViewLabelParameters } from "./plugins/useTreeViewLabel/index.js";
|
|
20
|
-
export type { UseTreeViewLazyLoadingSignature, UseTreeViewLazyLoadingParameters, UseTreeViewLazyLoadingInstance } from "./plugins/useTreeViewLazyLoading/index.js";
|
|
20
|
+
export type { UseTreeViewLazyLoadingSignature, UseTreeViewLazyLoadingParameters, UseTreeViewLazyLoadingInstance, DataSource } from "./plugins/useTreeViewLazyLoading/index.js";
|
|
21
21
|
export { lazyLoadingSelectors } from "./plugins/useTreeViewLazyLoading/index.js";
|
|
22
22
|
export { useTreeViewJSXItems } from "./plugins/useTreeViewJSXItems/index.js";
|
|
23
23
|
export type { UseTreeViewJSXItemsSignature, UseTreeViewJSXItemsParameters } from "./plugins/useTreeViewJSXItems/index.js";
|
|
@@ -7,8 +7,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.useTreeViewExpansion = void 0;
|
|
8
8
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
9
|
var _useAssertModelConsistency = require("@mui/x-internals/useAssertModelConsistency");
|
|
10
|
-
var _useEventCallback =
|
|
11
|
-
var
|
|
10
|
+
var _useEventCallback = require("@base-ui-components/utils/useEventCallback");
|
|
11
|
+
var _useIsoLayoutEffect = require("@base-ui-components/utils/useIsoLayoutEffect");
|
|
12
12
|
var _useTreeViewExpansion = require("./useTreeViewExpansion.selectors");
|
|
13
13
|
var _useTreeViewExpansion2 = require("./useTreeViewExpansion.utils");
|
|
14
14
|
var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
|
|
@@ -24,7 +24,7 @@ const useTreeViewExpansion = ({
|
|
|
24
24
|
controlled: params.expandedItems,
|
|
25
25
|
defaultValue: params.defaultExpandedItems
|
|
26
26
|
});
|
|
27
|
-
(0,
|
|
27
|
+
(0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
|
|
28
28
|
const newExpansionTrigger = (0, _useTreeViewExpansion2.getExpansionTrigger)({
|
|
29
29
|
isItemEditable: params.isItemEditable,
|
|
30
30
|
expansionTrigger: params.expansionTrigger
|
|
@@ -44,10 +44,10 @@ const useTreeViewExpansion = ({
|
|
|
44
44
|
}
|
|
45
45
|
params.onExpandedItemsChange?.(event, value);
|
|
46
46
|
};
|
|
47
|
-
const resetItemExpansion = (0, _useEventCallback.
|
|
47
|
+
const resetItemExpansion = (0, _useEventCallback.useEventCallback)(() => {
|
|
48
48
|
setExpandedItems(null, []);
|
|
49
49
|
});
|
|
50
|
-
const applyItemExpansion = (0, _useEventCallback.
|
|
50
|
+
const applyItemExpansion = (0, _useEventCallback.useEventCallback)(({
|
|
51
51
|
itemId,
|
|
52
52
|
event,
|
|
53
53
|
shouldBeExpanded
|
|
@@ -64,7 +64,7 @@ const useTreeViewExpansion = ({
|
|
|
64
64
|
}
|
|
65
65
|
setExpandedItems(event, newExpanded);
|
|
66
66
|
});
|
|
67
|
-
const setItemExpansion = (0, _useEventCallback.
|
|
67
|
+
const setItemExpansion = (0, _useEventCallback.useEventCallback)(({
|
|
68
68
|
itemId,
|
|
69
69
|
event = null,
|
|
70
70
|
shouldBeExpanded
|
|
@@ -90,7 +90,7 @@ const useTreeViewExpansion = ({
|
|
|
90
90
|
shouldBeExpanded: cleanShouldBeExpanded
|
|
91
91
|
});
|
|
92
92
|
});
|
|
93
|
-
const isItemExpanded = (0, _useEventCallback.
|
|
93
|
+
const isItemExpanded = (0, _useEventCallback.useEventCallback)(itemId => {
|
|
94
94
|
return _useTreeViewExpansion.expansionSelectors.isItemExpanded(store.state, itemId);
|
|
95
95
|
});
|
|
96
96
|
const expandAllSiblings = (event, itemId) => {
|
|
@@ -114,7 +114,7 @@ const useTreeViewExpansion = ({
|
|
|
114
114
|
/**
|
|
115
115
|
* Update the controlled model when the `expandedItems` prop changes.
|
|
116
116
|
*/
|
|
117
|
-
(0,
|
|
117
|
+
(0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
|
|
118
118
|
const expandedItems = params.expandedItems;
|
|
119
119
|
if (expandedItems !== undefined) {
|
|
120
120
|
store.set('expansion', (0, _extends2.default)({}, store.state.expansion, {
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.useTreeViewFocus = void 0;
|
|
8
8
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
-
var _useEventCallback =
|
|
9
|
+
var _useEventCallback = require("@base-ui-components/utils/useEventCallback");
|
|
10
10
|
var _store = require("@mui/x-internals/store");
|
|
11
11
|
var _useTreeViewFocus = require("./useTreeViewFocus.selectors");
|
|
12
12
|
var _useTreeViewExpansion = require("../useTreeViewExpansion/useTreeViewExpansion.selectors");
|
|
@@ -16,7 +16,7 @@ const useTreeViewFocus = ({
|
|
|
16
16
|
params,
|
|
17
17
|
store
|
|
18
18
|
}) => {
|
|
19
|
-
const setFocusedItemId = (0, _useEventCallback.
|
|
19
|
+
const setFocusedItemId = (0, _useEventCallback.useEventCallback)(itemId => {
|
|
20
20
|
const focusedItemId = _useTreeViewFocus.focusSelectors.focusedItemId(store.state);
|
|
21
21
|
if (focusedItemId === itemId) {
|
|
22
22
|
return;
|
|
@@ -39,13 +39,13 @@ const useTreeViewFocus = ({
|
|
|
39
39
|
params.onItemFocus(event, itemId);
|
|
40
40
|
}
|
|
41
41
|
};
|
|
42
|
-
const focusItem = (0, _useEventCallback.
|
|
42
|
+
const focusItem = (0, _useEventCallback.useEventCallback)((event, itemId) => {
|
|
43
43
|
// If we receive an itemId, and it is visible, the focus will be set to it
|
|
44
44
|
if (isItemVisible(itemId)) {
|
|
45
45
|
innerFocusItem(event, itemId);
|
|
46
46
|
}
|
|
47
47
|
});
|
|
48
|
-
const removeFocusedItem = (0, _useEventCallback.
|
|
48
|
+
const removeFocusedItem = (0, _useEventCallback.useEventCallback)(() => {
|
|
49
49
|
const focusedItemId = _useTreeViewFocus.focusSelectors.focusedItemId(store.state);
|
|
50
50
|
if (focusedItemId == null) {
|
|
51
51
|
return;
|
|
@@ -9,101 +9,30 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
9
9
|
exports.useTreeViewItems = void 0;
|
|
10
10
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
11
11
|
var React = _interopRequireWildcard(require("react"));
|
|
12
|
-
var _useEventCallback =
|
|
12
|
+
var _useEventCallback = require("@base-ui-components/utils/useEventCallback");
|
|
13
13
|
var _useTreeViewItems = require("./useTreeViewItems.utils");
|
|
14
14
|
var _TreeViewItemDepthContext = require("../../TreeViewItemDepthContext");
|
|
15
15
|
var _useTreeViewItems2 = require("./useTreeViewItems.selectors");
|
|
16
16
|
var _useTreeViewId = require("../../corePlugins/useTreeViewId");
|
|
17
17
|
var _useTreeViewId2 = require("../../corePlugins/useTreeViewId/useTreeViewId.utils");
|
|
18
18
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
19
|
-
const checkId = (id, item, itemMetaLookup) => {
|
|
20
|
-
if (id == null) {
|
|
21
|
-
throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', 'An item was provided without id in the `items` prop:', JSON.stringify(item)].join('\n'));
|
|
22
|
-
}
|
|
23
|
-
if (itemMetaLookup[id] != null) {
|
|
24
|
-
throw new Error(['MUI X: The Tree View component requires all items to have a unique `id` property.', 'Alternatively, you can use the `getItemId` prop to specify a custom id for each item.', `Two items were provided with the same id in the \`items\` prop: "${id}"`].join('\n'));
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
const processItemsLookups = ({
|
|
28
|
-
disabledItemsFocusable,
|
|
29
|
-
items,
|
|
30
|
-
isItemDisabled,
|
|
31
|
-
getItemLabel,
|
|
32
|
-
getItemChildren,
|
|
33
|
-
getItemId,
|
|
34
|
-
initialDepth = 0,
|
|
35
|
-
initialParentId = null,
|
|
36
|
-
getChildrenCount,
|
|
37
|
-
ignoreChildren = false
|
|
38
|
-
}) => {
|
|
39
|
-
const itemMetaLookup = {};
|
|
40
|
-
const itemModelLookup = {};
|
|
41
|
-
const itemOrderedChildrenIdsLookup = {
|
|
42
|
-
[_useTreeViewItems.TREE_VIEW_ROOT_PARENT_ID]: []
|
|
43
|
-
};
|
|
44
|
-
const processItem = (item, depth, parentId) => {
|
|
45
|
-
const id = getItemId ? getItemId(item) : item.id;
|
|
46
|
-
checkId(id, item, itemMetaLookup);
|
|
47
|
-
const label = getItemLabel ? getItemLabel(item) : item.label;
|
|
48
|
-
if (label == null) {
|
|
49
|
-
throw new Error(['MUI X: The Tree View component requires all items to have a `label` property.', 'Alternatively, you can use the `getItemLabel` prop to specify a custom label for each item.', 'An item was provided without label in the `items` prop:', JSON.stringify(item)].join('\n'));
|
|
50
|
-
}
|
|
51
|
-
const children = getItemChildren ? getItemChildren(item) : item.children;
|
|
52
|
-
itemMetaLookup[id] = {
|
|
53
|
-
id,
|
|
54
|
-
label,
|
|
55
|
-
parentId,
|
|
56
|
-
idAttribute: undefined,
|
|
57
|
-
expandable: getChildrenCount ? getChildrenCount(item) > 0 : !!children?.length,
|
|
58
|
-
disabled: isItemDisabled ? isItemDisabled(item) : false,
|
|
59
|
-
depth
|
|
60
|
-
};
|
|
61
|
-
itemModelLookup[id] = item;
|
|
62
|
-
const parentIdWithDefault = parentId ?? _useTreeViewItems.TREE_VIEW_ROOT_PARENT_ID;
|
|
63
|
-
if (!itemOrderedChildrenIdsLookup[parentIdWithDefault]) {
|
|
64
|
-
itemOrderedChildrenIdsLookup[parentIdWithDefault] = [];
|
|
65
|
-
}
|
|
66
|
-
itemOrderedChildrenIdsLookup[parentIdWithDefault].push(id);
|
|
67
|
-
|
|
68
|
-
// if lazy loading is enabled, we don't want to process children passed through the `items` prop
|
|
69
|
-
if (!ignoreChildren) {
|
|
70
|
-
children?.forEach(child => processItem(child, depth + 1, id));
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
items?.forEach(item => processItem(item, initialDepth, initialParentId));
|
|
74
|
-
const itemChildrenIndexesLookup = {};
|
|
75
|
-
Object.keys(itemOrderedChildrenIdsLookup).forEach(parentId => {
|
|
76
|
-
itemChildrenIndexesLookup[parentId] = (0, _useTreeViewItems.buildSiblingIndexes)(itemOrderedChildrenIdsLookup[parentId]);
|
|
77
|
-
});
|
|
78
|
-
return {
|
|
79
|
-
disabledItemsFocusable,
|
|
80
|
-
itemMetaLookup,
|
|
81
|
-
itemModelLookup,
|
|
82
|
-
itemOrderedChildrenIdsLookup,
|
|
83
|
-
itemChildrenIndexesLookup
|
|
84
|
-
};
|
|
85
|
-
};
|
|
86
19
|
const useTreeViewItems = ({
|
|
87
20
|
instance,
|
|
88
21
|
params,
|
|
89
22
|
store
|
|
90
23
|
}) => {
|
|
24
|
+
const itemsConfig = React.useMemo(() => ({
|
|
25
|
+
isItemDisabled: params.isItemDisabled,
|
|
26
|
+
getItemLabel: params.getItemLabel,
|
|
27
|
+
getItemChildren: params.getItemChildren,
|
|
28
|
+
getItemId: params.getItemId
|
|
29
|
+
}), [params.isItemDisabled, params.getItemLabel, params.getItemChildren, params.getItemId]);
|
|
91
30
|
const getItem = React.useCallback(itemId => _useTreeViewItems2.itemsSelectors.itemModel(store.state, itemId), [store]);
|
|
92
31
|
const getParentId = React.useCallback(itemId => {
|
|
93
32
|
const itemMeta = _useTreeViewItems2.itemsSelectors.itemMeta(store.state, itemId);
|
|
94
33
|
return itemMeta?.parentId || null;
|
|
95
34
|
}, [store]);
|
|
96
|
-
const
|
|
97
|
-
store.set('items', (0, _extends2.default)({}, store.state.items, {
|
|
98
|
-
loading: isLoading
|
|
99
|
-
}));
|
|
100
|
-
});
|
|
101
|
-
const setTreeViewError = (0, _useEventCallback.default)(error => {
|
|
102
|
-
store.set('items', (0, _extends2.default)({}, store.state.items, {
|
|
103
|
-
error
|
|
104
|
-
}));
|
|
105
|
-
});
|
|
106
|
-
const setIsItemDisabled = (0, _useEventCallback.default)(({
|
|
35
|
+
const setIsItemDisabled = (0, _useEventCallback.useEventCallback)(({
|
|
107
36
|
itemId,
|
|
108
37
|
shouldBeDisabled
|
|
109
38
|
}) => {
|
|
@@ -150,89 +79,84 @@ const useTreeViewItems = ({
|
|
|
150
79
|
areItemUpdatesPreventedRef.current = true;
|
|
151
80
|
}, []);
|
|
152
81
|
const areItemUpdatesPrevented = React.useCallback(() => areItemUpdatesPreventedRef.current, []);
|
|
153
|
-
const
|
|
82
|
+
const setItemChildren = ({
|
|
154
83
|
items,
|
|
155
84
|
parentId,
|
|
156
|
-
depth,
|
|
157
85
|
getChildrenCount
|
|
158
86
|
}) => {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
itemChildrenIndexesLookup: newState.itemChildrenIndexesLookup
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
store.set('items', (0, _extends2.default)({}, store.state.items, newItems));
|
|
189
|
-
}
|
|
87
|
+
const parentIdWithDefault = parentId ?? _useTreeViewItems.TREE_VIEW_ROOT_PARENT_ID;
|
|
88
|
+
const parentDepth = parentId == null ? -1 : _useTreeViewItems2.itemsSelectors.itemDepth(store.state, parentId);
|
|
89
|
+
const {
|
|
90
|
+
metaLookup,
|
|
91
|
+
modelLookup,
|
|
92
|
+
orderedChildrenIds,
|
|
93
|
+
childrenIndexes
|
|
94
|
+
} = (0, _useTreeViewItems.buildItemsLookups)({
|
|
95
|
+
config: itemsConfig,
|
|
96
|
+
items,
|
|
97
|
+
parentId,
|
|
98
|
+
depth: parentDepth + 1,
|
|
99
|
+
isItemExpandable: getChildrenCount ? item => getChildrenCount(item) > 0 : () => false,
|
|
100
|
+
otherItemsMetaLookup: _useTreeViewItems2.itemsSelectors.itemMetaLookup(store.state)
|
|
101
|
+
});
|
|
102
|
+
const lookups = {
|
|
103
|
+
itemModelLookup: (0, _extends2.default)({}, store.state.items.itemModelLookup, modelLookup),
|
|
104
|
+
itemMetaLookup: (0, _extends2.default)({}, store.state.items.itemMetaLookup, metaLookup),
|
|
105
|
+
itemOrderedChildrenIdsLookup: (0, _extends2.default)({}, store.state.items.itemOrderedChildrenIdsLookup, {
|
|
106
|
+
[parentIdWithDefault]: orderedChildrenIds
|
|
107
|
+
}),
|
|
108
|
+
itemChildrenIndexesLookup: (0, _extends2.default)({}, store.state.items.itemChildrenIndexesLookup, {
|
|
109
|
+
[parentIdWithDefault]: childrenIndexes
|
|
110
|
+
})
|
|
111
|
+
};
|
|
112
|
+
store.set('items', (0, _extends2.default)({}, store.state.items, lookups));
|
|
190
113
|
};
|
|
191
|
-
const removeChildren = parentId => {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
114
|
+
const removeChildren = (0, _useEventCallback.useEventCallback)(parentId => {
|
|
115
|
+
const newMetaMap = Object.keys(store.state.items.itemMetaLookup).reduce((acc, key) => {
|
|
116
|
+
const item = store.state.items.itemMetaLookup[key];
|
|
117
|
+
if (item.parentId === parentId) {
|
|
118
|
+
return acc;
|
|
119
|
+
}
|
|
120
|
+
return (0, _extends2.default)({}, acc, {
|
|
121
|
+
[item.id]: item
|
|
122
|
+
});
|
|
123
|
+
}, {});
|
|
124
|
+
const newItemOrderedChildrenIdsLookup = (0, _extends2.default)({}, store.state.items.itemOrderedChildrenIdsLookup);
|
|
125
|
+
const newItemChildrenIndexesLookup = (0, _extends2.default)({}, store.state.items.itemChildrenIndexesLookup);
|
|
126
|
+
const cleanId = parentId ?? _useTreeViewItems.TREE_VIEW_ROOT_PARENT_ID;
|
|
127
|
+
delete newItemChildrenIndexesLookup[cleanId];
|
|
128
|
+
delete newItemOrderedChildrenIdsLookup[cleanId];
|
|
129
|
+
store.set('items', (0, _extends2.default)({}, store.state.items, {
|
|
130
|
+
itemMetaLookup: newMetaMap,
|
|
131
|
+
itemOrderedChildrenIdsLookup: newItemOrderedChildrenIdsLookup,
|
|
132
|
+
itemChildrenIndexesLookup: newItemChildrenIndexesLookup
|
|
133
|
+
}));
|
|
134
|
+
});
|
|
135
|
+
const addExpandableItems = (0, _useEventCallback.useEventCallback)(items => {
|
|
136
|
+
const newItemMetaLookup = (0, _extends2.default)({}, store.state.items.itemMetaLookup);
|
|
137
|
+
for (const itemId of items) {
|
|
138
|
+
newItemMetaLookup[itemId] = (0, _extends2.default)({}, newItemMetaLookup[itemId], {
|
|
139
|
+
expandable: true
|
|
140
|
+
});
|
|
217
141
|
}
|
|
218
|
-
|
|
142
|
+
store.set('items', (0, _extends2.default)({}, store.state.items, {
|
|
143
|
+
itemMetaLookup: newItemMetaLookup
|
|
144
|
+
}));
|
|
145
|
+
});
|
|
219
146
|
React.useEffect(() => {
|
|
220
147
|
if (instance.areItemUpdatesPrevented()) {
|
|
221
148
|
return;
|
|
222
149
|
}
|
|
223
|
-
const newState =
|
|
150
|
+
const newState = (0, _useTreeViewItems.buildItemsState)({
|
|
224
151
|
disabledItemsFocusable: params.disabledItemsFocusable,
|
|
225
152
|
items: params.items,
|
|
226
|
-
|
|
227
|
-
getItemId: params.getItemId,
|
|
228
|
-
getItemLabel: params.getItemLabel,
|
|
229
|
-
getItemChildren: params.getItemChildren
|
|
153
|
+
config: itemsConfig
|
|
230
154
|
});
|
|
231
155
|
store.set('items', (0, _extends2.default)({}, store.state.items, newState));
|
|
232
|
-
}, [instance, store, params.items, params.disabledItemsFocusable,
|
|
156
|
+
}, [instance, store, params.items, params.disabledItemsFocusable, itemsConfig]);
|
|
233
157
|
|
|
234
158
|
// Wrap `props.onItemClick` with `useEventCallback` to prevent unneeded context updates.
|
|
235
|
-
const handleItemClick = (0, _useEventCallback.
|
|
159
|
+
const handleItemClick = (0, _useEventCallback.useEventCallback)((event, itemId) => {
|
|
236
160
|
if (params.onItemClick) {
|
|
237
161
|
params.onItemClick(event, itemId);
|
|
238
162
|
}
|
|
@@ -255,27 +179,24 @@ const useTreeViewItems = ({
|
|
|
255
179
|
getItemDOMElement,
|
|
256
180
|
preventItemUpdates,
|
|
257
181
|
areItemUpdatesPrevented,
|
|
258
|
-
|
|
259
|
-
setTreeViewLoading,
|
|
260
|
-
setTreeViewError,
|
|
182
|
+
setItemChildren,
|
|
261
183
|
removeChildren,
|
|
184
|
+
addExpandableItems,
|
|
262
185
|
handleItemClick
|
|
263
186
|
}
|
|
264
187
|
};
|
|
265
188
|
};
|
|
266
189
|
exports.useTreeViewItems = useTreeViewItems;
|
|
267
190
|
useTreeViewItems.getInitialState = params => ({
|
|
268
|
-
items: (0,
|
|
269
|
-
disabledItemsFocusable: params.disabledItemsFocusable,
|
|
191
|
+
items: (0, _useTreeViewItems.buildItemsState)({
|
|
270
192
|
items: params.items,
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
domStructure: 'nested'
|
|
193
|
+
disabledItemsFocusable: params.disabledItemsFocusable,
|
|
194
|
+
config: {
|
|
195
|
+
isItemDisabled: params.isItemDisabled,
|
|
196
|
+
getItemId: params.getItemId,
|
|
197
|
+
getItemLabel: params.getItemLabel,
|
|
198
|
+
getItemChildren: params.getItemChildren
|
|
199
|
+
}
|
|
279
200
|
})
|
|
280
201
|
});
|
|
281
202
|
useTreeViewItems.applyDefaultValuesToParams = ({
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
import { TreeViewItemMeta, TreeViewState } from "../../models/index.js";
|
|
2
2
|
import { UseTreeViewItemsSignature } from "./useTreeViewItems.types.js";
|
|
3
3
|
export declare const itemsSelectors: {
|
|
4
|
-
/**
|
|
5
|
-
* Gets the loading state for the Tree View.
|
|
6
|
-
*/
|
|
7
|
-
isLoading: (state: TreeViewState<[UseTreeViewItemsSignature]>) => boolean;
|
|
8
|
-
/**
|
|
9
|
-
* Gets the error state for the Tree View.
|
|
10
|
-
*/
|
|
11
|
-
error: (state: TreeViewState<[UseTreeViewItemsSignature]>) => Error | null;
|
|
12
4
|
/**
|
|
13
5
|
* Gets the DOM structure of the Tree View.
|
|
14
6
|
*/
|
|
@@ -8,14 +8,6 @@ var _store = require("@mui/x-internals/store");
|
|
|
8
8
|
var _useTreeViewItems = require("./useTreeViewItems.utils");
|
|
9
9
|
const EMPTY_CHILDREN = [];
|
|
10
10
|
const itemsSelectors = exports.itemsSelectors = {
|
|
11
|
-
/**
|
|
12
|
-
* Gets the loading state for the Tree View.
|
|
13
|
-
*/
|
|
14
|
-
isLoading: (0, _store.createSelector)(state => state.items.loading),
|
|
15
|
-
/**
|
|
16
|
-
* Gets the error state for the Tree View.
|
|
17
|
-
*/
|
|
18
|
-
error: (0, _store.createSelector)(state => state.items.error),
|
|
19
11
|
/**
|
|
20
12
|
* Gets the DOM structure of the Tree View.
|
|
21
13
|
*/
|