@mui/x-tree-view 8.22.0 → 8.23.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 +202 -0
- package/RichTreeView/RichTreeView.js +7 -0
- package/SimpleTreeView/SimpleTreeView.plugins.d.ts +1 -1
- package/TreeItem/TreeItem.js +9 -2
- package/esm/RichTreeView/RichTreeView.js +7 -0
- package/esm/SimpleTreeView/SimpleTreeView.plugins.d.ts +1 -1
- package/esm/TreeItem/TreeItem.js +9 -2
- package/esm/hooks/useApplyPropagationToSelectedItemsOnMount.js +1 -1
- package/esm/hooks/useTreeItemUtils/useTreeItemUtils.js +1 -1
- package/esm/hooks/useTreeViewApiRef.d.ts +1 -1
- package/esm/hooks/useTreeViewApiRef.js +1 -1
- package/esm/index.js +1 -1
- package/esm/internals/models/treeView.d.ts +1 -0
- package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +6 -6
- package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +4 -4
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.js +13 -8
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +4 -0
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +5 -1
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +7 -0
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.utils.d.ts +1 -1
- package/esm/internals/plugins/useTreeViewItems/useTreeViewItems.utils.js +1 -0
- package/esm/internals/plugins/useTreeViewJSXItems/itemPlugin.js +6 -4
- package/esm/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +3 -3
- package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +4 -4
- package/esm/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
- package/esm/internals/plugins/useTreeViewSelection/itemPlugin.js +5 -5
- package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +3 -2
- package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +6 -1
- package/esm/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +7 -2
- package/esm/internals/useTreeView/useTreeView.js +2 -2
- package/esm/useTreeItem/useTreeItem.js +1 -1
- package/esm/useTreeItem/useTreeItem.types.d.ts +5 -0
- package/hooks/useApplyPropagationToSelectedItemsOnMount.js +1 -1
- package/hooks/useTreeItemUtils/useTreeItemUtils.js +1 -1
- package/hooks/useTreeViewApiRef.d.ts +1 -1
- package/hooks/useTreeViewApiRef.js +1 -1
- package/index.js +1 -1
- package/internals/models/treeView.d.ts +1 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +6 -6
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +4 -4
- package/internals/plugins/useTreeViewItems/useTreeViewItems.js +13 -8
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +4 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +5 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +7 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.utils.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.utils.js +1 -0
- package/internals/plugins/useTreeViewJSXItems/itemPlugin.js +6 -4
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +3 -3
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +4 -4
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +1 -1
- package/internals/plugins/useTreeViewSelection/itemPlugin.js +5 -5
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +3 -2
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +6 -1
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +7 -2
- package/internals/useTreeView/useTreeView.js +2 -2
- package/package.json +3 -3
- package/useTreeItem/useTreeItem.js +1 -1
- package/useTreeItem/useTreeItem.types.d.ts +5 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
4
4
|
import * as React from 'react';
|
|
5
|
-
import {
|
|
5
|
+
import { useStableCallback } from '@base-ui/utils/useStableCallback';
|
|
6
6
|
import { TreeViewChildrenItemProvider } from "../../TreeViewProvider/TreeViewChildrenItemProvider.js";
|
|
7
7
|
import { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from "../useTreeViewItems/useTreeViewItems.utils.js";
|
|
8
8
|
import { TreeViewItemDepthContext } from "../../TreeViewItemDepthContext/index.js";
|
|
@@ -13,7 +13,7 @@ export const useTreeViewJSXItems = ({
|
|
|
13
13
|
store
|
|
14
14
|
}) => {
|
|
15
15
|
instance.preventItemUpdates();
|
|
16
|
-
const insertJSXItem =
|
|
16
|
+
const insertJSXItem = useStableCallback(item => {
|
|
17
17
|
if (store.state.items.itemMetaLookup[item.id] != null) {
|
|
18
18
|
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: "${item.id}"`].join('\n'));
|
|
19
19
|
}
|
|
@@ -51,7 +51,7 @@ export const useTreeViewJSXItems = ({
|
|
|
51
51
|
})
|
|
52
52
|
}));
|
|
53
53
|
};
|
|
54
|
-
const mapLabelFromJSX =
|
|
54
|
+
const mapLabelFromJSX = useStableCallback((itemId, label) => {
|
|
55
55
|
instance.updateLabelMap(labelMap => {
|
|
56
56
|
labelMap[itemId] = label;
|
|
57
57
|
return labelMap;
|
package/esm/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { useStore } from '@mui/x-internals/store';
|
|
5
5
|
import { useRtl } from '@mui/system/RtlProvider';
|
|
6
|
-
import { useTimeout } from '@base-ui
|
|
7
|
-
import {
|
|
6
|
+
import { useTimeout } from '@base-ui/utils/useTimeout';
|
|
7
|
+
import { useStableCallback } from '@base-ui/utils/useStableCallback';
|
|
8
8
|
import { getFirstNavigableItem, getLastNavigableItem, getNextNavigableItem, getPreviousNavigableItem, isTargetInDescendants } from "../../utils/tree.js";
|
|
9
9
|
import { hasPlugin } from "../../utils/plugins.js";
|
|
10
10
|
import { useTreeViewLabel } from "../useTreeViewLabel/index.js";
|
|
@@ -25,7 +25,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
25
25
|
const labelMap = React.useRef({});
|
|
26
26
|
const typeaheadQueryRef = React.useRef('');
|
|
27
27
|
const typeaheadTimeout = useTimeout();
|
|
28
|
-
const updateLabelMap =
|
|
28
|
+
const updateLabelMap = useStableCallback(callback => {
|
|
29
29
|
labelMap.current = callback(labelMap.current);
|
|
30
30
|
});
|
|
31
31
|
const itemMetaLookup = useStore(store, itemsSelectors.itemMetaLookup);
|
|
@@ -85,7 +85,7 @@ export const useTreeViewKeyboardNavigation = ({
|
|
|
85
85
|
typeaheadQueryRef.current = '';
|
|
86
86
|
return null;
|
|
87
87
|
};
|
|
88
|
-
const canToggleItemSelection = itemId => selectionSelectors.
|
|
88
|
+
const canToggleItemSelection = itemId => selectionSelectors.canItemBeSelected(store.state, itemId);
|
|
89
89
|
const canToggleItemExpansion = itemId => {
|
|
90
90
|
return !itemsSelectors.isItemDisabled(store.state, itemId) && expansionSelectors.isItemExpandable(store.state, itemId);
|
|
91
91
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
-
import { useIsoLayoutEffect } from '@base-ui
|
|
2
|
+
import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';
|
|
3
3
|
import { useTreeViewLabelItemPlugin } from "./itemPlugin.js";
|
|
4
4
|
import { labelSelectors } from "./useTreeViewLabel.selectors.js";
|
|
5
5
|
export const useTreeViewLabel = ({
|
|
@@ -44,9 +44,9 @@ export const useTreeViewSelectionItemPlugin = ({
|
|
|
44
44
|
store
|
|
45
45
|
} = useTreeViewContext();
|
|
46
46
|
const isCheckboxSelectionEnabled = useStore(store, selectionSelectors.isCheckboxSelectionEnabled);
|
|
47
|
-
const
|
|
47
|
+
const isFeatureEnabledForItem = useStore(store, selectionSelectors.isFeatureEnabledForItem, itemId);
|
|
48
|
+
const canItemBeSelected = useStore(store, selectionSelectors.canItemBeSelected, itemId);
|
|
48
49
|
const selectionStatus = useStore(store, selectorCheckboxSelectionStatus, itemId);
|
|
49
|
-
const isSelectionEnabledForItem = useStore(store, selectionSelectors.canItemBeSelected, itemId);
|
|
50
50
|
return {
|
|
51
51
|
propsEnhancers: {
|
|
52
52
|
root: () => {
|
|
@@ -57,7 +57,7 @@ export const useTreeViewSelectionItemPlugin = ({
|
|
|
57
57
|
ariaChecked = true;
|
|
58
58
|
} else if (selectionStatus === 'indeterminate') {
|
|
59
59
|
ariaChecked = 'mixed';
|
|
60
|
-
} else if (!
|
|
60
|
+
} else if (!canItemBeSelected) {
|
|
61
61
|
// - if the tree contains nodes that are not selectable, aria-checked is not present on those nodes.
|
|
62
62
|
ariaChecked = undefined;
|
|
63
63
|
} else {
|
|
@@ -85,8 +85,8 @@ export const useTreeViewSelectionItemPlugin = ({
|
|
|
85
85
|
return {
|
|
86
86
|
tabIndex: -1,
|
|
87
87
|
onChange: handleChange,
|
|
88
|
-
visible: isCheckboxSelectionEnabled,
|
|
89
|
-
disabled: !
|
|
88
|
+
visible: isCheckboxSelectionEnabled && isFeatureEnabledForItem,
|
|
89
|
+
disabled: !canItemBeSelected,
|
|
90
90
|
checked: selectionStatus === 'checked',
|
|
91
91
|
indeterminate: selectionStatus === 'indeterminate'
|
|
92
92
|
};
|
|
@@ -1,10 +1,11 @@
|
|
|
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 { useIsoLayoutEffect } from '@base-ui
|
|
4
|
+
import { useIsoLayoutEffect } from '@base-ui/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";
|
|
8
|
+
import { itemsSelectors } from "../useTreeViewItems/useTreeViewItems.selectors.js";
|
|
8
9
|
import { useTreeViewSelectionItemPlugin } from "./itemPlugin.js";
|
|
9
10
|
export const useTreeViewSelection = ({
|
|
10
11
|
store,
|
|
@@ -115,7 +116,7 @@ export const useTreeViewSelection = ({
|
|
|
115
116
|
|
|
116
117
|
// Add to the model the items that are part of the new range and not already part of the model.
|
|
117
118
|
const selectedItemsLookup = getLookupFromArray(newSelectedItems);
|
|
118
|
-
const range = getNonDisabledItemsInRange(store.state, start, end);
|
|
119
|
+
const range = getNonDisabledItemsInRange(store.state, start, end).filter(id => itemsSelectors.isItemSelectable(store.state, id));
|
|
119
120
|
const itemsToAddToModel = range.filter(id => !selectedItemsLookup[id]);
|
|
120
121
|
newSelectedItems = newSelectedItems.concat(itemsToAddToModel);
|
|
121
122
|
setSelectedItems(event, newSelectedItems);
|
|
@@ -34,7 +34,12 @@ export declare const selectionSelectors: {
|
|
|
34
34
|
*/
|
|
35
35
|
isItemSelected: (args_0: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewSelection.types.js").UseTreeViewSelectionState & Partial<{}>, itemId: string) => boolean;
|
|
36
36
|
/**
|
|
37
|
-
* Checks whether
|
|
37
|
+
* Checks whether the selection feature is enabled for an item.
|
|
38
|
+
* Returns `true` when selection is enabled on the Tree View and the item is selectable (even if the item is disabled).
|
|
39
|
+
*/
|
|
40
|
+
isFeatureEnabledForItem: (args_0: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewSelection.types.js").UseTreeViewSelectionState & Partial<{}>, _itemId: string) => boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Checks whether an item can be selected (if selection is enabled, if the item is not disabled, and if the item is selectable).
|
|
38
43
|
*/
|
|
39
44
|
canItemBeSelected: (args_0: import("../../corePlugins/useTreeViewId/useTreeViewId.types.js").UseTreeViewIdState & import("./useTreeViewSelection.types.js").UseTreeViewSelectionState & Partial<{}>, _itemId: string) => boolean;
|
|
40
45
|
};
|
|
@@ -50,7 +50,12 @@ export const selectionSelectors = {
|
|
|
50
50
|
*/
|
|
51
51
|
isItemSelected: createSelector(selectedItemsMapSelector, (selectedItemsMap, itemId) => selectedItemsMap.has(itemId)),
|
|
52
52
|
/**
|
|
53
|
-
* Checks whether
|
|
53
|
+
* Checks whether the selection feature is enabled for an item.
|
|
54
|
+
* Returns `true` when selection is enabled on the Tree View and the item is selectable (even if the item is disabled).
|
|
54
55
|
*/
|
|
55
|
-
|
|
56
|
+
isFeatureEnabledForItem: createSelector(itemsSelectors.isItemSelectable, state => state.selection.isEnabled, (isItemSelectable, isSelectionEnabled, _itemId) => isSelectionEnabled && isItemSelectable),
|
|
57
|
+
/**
|
|
58
|
+
* Checks whether an item can be selected (if selection is enabled, if the item is not disabled, and if the item is selectable).
|
|
59
|
+
*/
|
|
60
|
+
canItemBeSelected: createSelector(itemsSelectors.isItemDisabled, itemsSelectors.isItemSelectable, state => state.selection.isEnabled, (isItemDisabled, isItemSelectable, isSelectionEnabled, _itemId) => isSelectionEnabled && !isItemDisabled && isItemSelectable)
|
|
56
61
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import { useRefWithInit } from '@base-ui
|
|
3
|
+
import { useRefWithInit } from '@base-ui/utils/useRefWithInit';
|
|
4
4
|
import { Store } from '@mui/x-internals/store';
|
|
5
|
-
import { useMergedRefs } from '@base-ui
|
|
5
|
+
import { useMergedRefs } from '@base-ui/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";
|
|
@@ -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 { useMergedRefs } from '@base-ui
|
|
7
|
+
import { useMergedRefs } from '@base-ui/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";
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.useApplyPropagationToSelectedItemsOnMount = useApplyPropagationToSelectedItemsOnMount;
|
|
7
|
-
var _useRefWithInit = require("@base-ui
|
|
7
|
+
var _useRefWithInit = require("@base-ui/utils/useRefWithInit");
|
|
8
8
|
var _useTreeViewSelection = require("../internals/plugins/useTreeViewSelection/useTreeViewSelection.utils");
|
|
9
9
|
const defaultGetItemId = item => item.id;
|
|
10
10
|
const defaultGetItemChildren = item => item.children;
|
|
@@ -3,6 +3,6 @@ import { TreeViewAnyPluginSignature, TreeViewPublicAPI } from "../internals/mode
|
|
|
3
3
|
import { RichTreeViewPluginSignatures } from "../RichTreeView/RichTreeView.plugins.js";
|
|
4
4
|
/**
|
|
5
5
|
* Hook that instantiates a [[TreeViewApiRef]].
|
|
6
|
-
* @deprecated Use `useRichTreeViewApiRef`, `useRichTreeViewProApiRef` or `useSimpleTreeViewApiRef` instead.
|
|
6
|
+
* @deprecated Use `useRichTreeViewApiRef()`, `useRichTreeViewProApiRef()` or `useSimpleTreeViewApiRef()` instead.
|
|
7
7
|
*/
|
|
8
8
|
export declare const useTreeViewApiRef: <TSignatures extends readonly TreeViewAnyPluginSignature[] = RichTreeViewPluginSignatures>() => React.RefObject<TreeViewPublicAPI<TSignatures> | undefined>;
|
|
@@ -9,7 +9,7 @@ exports.useTreeViewApiRef = void 0;
|
|
|
9
9
|
var React = _interopRequireWildcard(require("react"));
|
|
10
10
|
/**
|
|
11
11
|
* Hook that instantiates a [[TreeViewApiRef]].
|
|
12
|
-
* @deprecated Use `useRichTreeViewApiRef`, `useRichTreeViewProApiRef` or `useSimpleTreeViewApiRef` instead.
|
|
12
|
+
* @deprecated Use `useRichTreeViewApiRef()`, `useRichTreeViewProApiRef()` or `useSimpleTreeViewApiRef()` instead.
|
|
13
13
|
*/
|
|
14
14
|
const useTreeViewApiRef = () => React.useRef(undefined);
|
|
15
15
|
exports.useTreeViewApiRef = useTreeViewApiRef;
|
package/index.js
CHANGED
|
@@ -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
|
|
11
|
-
var _useIsoLayoutEffect = require("@base-ui
|
|
10
|
+
var _useStableCallback = require("@base-ui/utils/useStableCallback");
|
|
11
|
+
var _useIsoLayoutEffect = require("@base-ui/utils/useIsoLayoutEffect");
|
|
12
12
|
var _useTreeViewExpansion = require("./useTreeViewExpansion.selectors");
|
|
13
13
|
var _useTreeViewExpansion2 = require("./useTreeViewExpansion.utils");
|
|
14
14
|
var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
|
|
@@ -44,10 +44,10 @@ const useTreeViewExpansion = ({
|
|
|
44
44
|
}
|
|
45
45
|
params.onExpandedItemsChange?.(event, value);
|
|
46
46
|
};
|
|
47
|
-
const resetItemExpansion = (0,
|
|
47
|
+
const resetItemExpansion = (0, _useStableCallback.useStableCallback)(() => {
|
|
48
48
|
setExpandedItems(null, []);
|
|
49
49
|
});
|
|
50
|
-
const applyItemExpansion = (0,
|
|
50
|
+
const applyItemExpansion = (0, _useStableCallback.useStableCallback)(({
|
|
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,
|
|
67
|
+
const setItemExpansion = (0, _useStableCallback.useStableCallback)(({
|
|
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,
|
|
93
|
+
const isItemExpanded = (0, _useStableCallback.useStableCallback)(itemId => {
|
|
94
94
|
return _useTreeViewExpansion.expansionSelectors.isItemExpanded(store.state, itemId);
|
|
95
95
|
});
|
|
96
96
|
const expandAllSiblings = (event, itemId) => {
|
|
@@ -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
|
|
9
|
+
var _useStableCallback = require("@base-ui/utils/useStableCallback");
|
|
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,
|
|
19
|
+
const setFocusedItemId = (0, _useStableCallback.useStableCallback)(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,
|
|
42
|
+
const focusItem = (0, _useStableCallback.useStableCallback)((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,
|
|
48
|
+
const removeFocusedItem = (0, _useStableCallback.useStableCallback)(() => {
|
|
49
49
|
const focusedItemId = _useTreeViewFocus.focusSelectors.focusedItemId(store.state);
|
|
50
50
|
if (focusedItemId == null) {
|
|
51
51
|
return;
|
|
@@ -9,13 +9,14 @@ 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
|
|
12
|
+
var _useStableCallback = require("@base-ui/utils/useStableCallback");
|
|
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 defaultIsItemSelectionDisabled = item => item.disableSelection === true;
|
|
19
20
|
const useTreeViewItems = ({
|
|
20
21
|
instance,
|
|
21
22
|
params,
|
|
@@ -23,16 +24,17 @@ const useTreeViewItems = ({
|
|
|
23
24
|
}) => {
|
|
24
25
|
const itemsConfig = React.useMemo(() => ({
|
|
25
26
|
isItemDisabled: params.isItemDisabled,
|
|
27
|
+
isItemSelectionDisabled: params.isItemSelectionDisabled,
|
|
26
28
|
getItemLabel: params.getItemLabel,
|
|
27
29
|
getItemChildren: params.getItemChildren,
|
|
28
30
|
getItemId: params.getItemId
|
|
29
|
-
}), [params.isItemDisabled, params.getItemLabel, params.getItemChildren, params.getItemId]);
|
|
31
|
+
}), [params.isItemDisabled, params.isItemSelectionDisabled, params.getItemLabel, params.getItemChildren, params.getItemId]);
|
|
30
32
|
const getItem = React.useCallback(itemId => _useTreeViewItems2.itemsSelectors.itemModel(store.state, itemId), [store]);
|
|
31
33
|
const getParentId = React.useCallback(itemId => {
|
|
32
34
|
const itemMeta = _useTreeViewItems2.itemsSelectors.itemMeta(store.state, itemId);
|
|
33
35
|
return itemMeta?.parentId || null;
|
|
34
36
|
}, [store]);
|
|
35
|
-
const setIsItemDisabled = (0,
|
|
37
|
+
const setIsItemDisabled = (0, _useStableCallback.useStableCallback)(({
|
|
36
38
|
itemId,
|
|
37
39
|
shouldBeDisabled
|
|
38
40
|
}) => {
|
|
@@ -111,7 +113,7 @@ const useTreeViewItems = ({
|
|
|
111
113
|
};
|
|
112
114
|
store.set('items', (0, _extends2.default)({}, store.state.items, lookups));
|
|
113
115
|
};
|
|
114
|
-
const removeChildren = (0,
|
|
116
|
+
const removeChildren = (0, _useStableCallback.useStableCallback)(parentId => {
|
|
115
117
|
const newMetaMap = Object.keys(store.state.items.itemMetaLookup).reduce((acc, key) => {
|
|
116
118
|
const item = store.state.items.itemMetaLookup[key];
|
|
117
119
|
if (item.parentId === parentId) {
|
|
@@ -132,7 +134,7 @@ const useTreeViewItems = ({
|
|
|
132
134
|
itemChildrenIndexesLookup: newItemChildrenIndexesLookup
|
|
133
135
|
}));
|
|
134
136
|
});
|
|
135
|
-
const addExpandableItems = (0,
|
|
137
|
+
const addExpandableItems = (0, _useStableCallback.useStableCallback)(items => {
|
|
136
138
|
const newItemMetaLookup = (0, _extends2.default)({}, store.state.items.itemMetaLookup);
|
|
137
139
|
for (const itemId of items) {
|
|
138
140
|
newItemMetaLookup[itemId] = (0, _extends2.default)({}, newItemMetaLookup[itemId], {
|
|
@@ -155,8 +157,8 @@ const useTreeViewItems = ({
|
|
|
155
157
|
store.set('items', (0, _extends2.default)({}, store.state.items, newState));
|
|
156
158
|
}, [instance, store, params.items, params.disabledItemsFocusable, itemsConfig]);
|
|
157
159
|
|
|
158
|
-
// Wrap `props.onItemClick` with `
|
|
159
|
-
const handleItemClick = (0,
|
|
160
|
+
// Wrap `props.onItemClick` with `useStableCallback` to prevent unneeded context updates.
|
|
161
|
+
const handleItemClick = (0, _useStableCallback.useStableCallback)((event, itemId) => {
|
|
160
162
|
if (params.onItemClick) {
|
|
161
163
|
params.onItemClick(event, itemId);
|
|
162
164
|
}
|
|
@@ -193,6 +195,7 @@ useTreeViewItems.getInitialState = params => ({
|
|
|
193
195
|
disabledItemsFocusable: params.disabledItemsFocusable,
|
|
194
196
|
config: {
|
|
195
197
|
isItemDisabled: params.isItemDisabled,
|
|
198
|
+
isItemSelectionDisabled: params.isItemSelectionDisabled,
|
|
196
199
|
getItemId: params.getItemId,
|
|
197
200
|
getItemLabel: params.getItemLabel,
|
|
198
201
|
getItemChildren: params.getItemChildren
|
|
@@ -203,7 +206,8 @@ useTreeViewItems.applyDefaultValuesToParams = ({
|
|
|
203
206
|
params
|
|
204
207
|
}) => (0, _extends2.default)({}, params, {
|
|
205
208
|
disabledItemsFocusable: params.disabledItemsFocusable ?? false,
|
|
206
|
-
itemChildrenIndentation: params.itemChildrenIndentation ?? '12px'
|
|
209
|
+
itemChildrenIndentation: params.itemChildrenIndentation ?? '12px',
|
|
210
|
+
isItemSelectionDisabled: params.isItemSelectionDisabled ?? defaultIsItemSelectionDisabled
|
|
207
211
|
});
|
|
208
212
|
useTreeViewItems.wrapRoot = ({
|
|
209
213
|
children
|
|
@@ -218,6 +222,7 @@ useTreeViewItems.params = {
|
|
|
218
222
|
disabledItemsFocusable: true,
|
|
219
223
|
items: true,
|
|
220
224
|
isItemDisabled: true,
|
|
225
|
+
isItemSelectionDisabled: true,
|
|
221
226
|
getItemLabel: true,
|
|
222
227
|
getItemChildren: true,
|
|
223
228
|
getItemId: true,
|
|
@@ -53,4 +53,8 @@ export declare const itemsSelectors: {
|
|
|
53
53
|
* Checks whether an item can be focused.
|
|
54
54
|
*/
|
|
55
55
|
canItemBeFocused: (state: TreeViewState<[UseTreeViewItemsSignature]>, itemId: string) => boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Checks whether an item is selectable based on the `isItemSelectionDisabled` prop.
|
|
58
|
+
*/
|
|
59
|
+
isItemSelectable: (state: TreeViewState<[UseTreeViewItemsSignature]>, itemId: string) => boolean;
|
|
56
60
|
};
|
|
@@ -62,5 +62,9 @@ const itemsSelectors = exports.itemsSelectors = {
|
|
|
62
62
|
/**
|
|
63
63
|
* Checks whether an item can be focused.
|
|
64
64
|
*/
|
|
65
|
-
canItemBeFocused: (0, _store.createSelector)((state, itemId) => state.items.disabledItemsFocusable || !(0, _useTreeViewItems.isItemDisabled)(state.items.itemMetaLookup, itemId))
|
|
65
|
+
canItemBeFocused: (0, _store.createSelector)((state, itemId) => state.items.disabledItemsFocusable || !(0, _useTreeViewItems.isItemDisabled)(state.items.itemMetaLookup, itemId)),
|
|
66
|
+
/**
|
|
67
|
+
* Checks whether an item is selectable based on the `isItemSelectionDisabled` prop.
|
|
68
|
+
*/
|
|
69
|
+
isItemSelectable: (0, _store.createSelector)((state, itemId) => state.items.itemMetaLookup[itemId]?.selectable ?? true)
|
|
66
70
|
};
|
|
@@ -100,6 +100,13 @@ export interface UseTreeViewItemsParameters<R extends {
|
|
|
100
100
|
* @returns {boolean} `true` if the item should be disabled.
|
|
101
101
|
*/
|
|
102
102
|
isItemDisabled?: (item: R) => boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Used to determine if a given item should have selection disabled.
|
|
105
|
+
* @template R
|
|
106
|
+
* @param {R} item The item to check.
|
|
107
|
+
* @returns {boolean} `true` if the item should have selection disabled.
|
|
108
|
+
*/
|
|
109
|
+
isItemSelectionDisabled?: (item: R) => boolean;
|
|
103
110
|
/**
|
|
104
111
|
* Used to determine the string label for a given item.
|
|
105
112
|
*
|
|
@@ -45,5 +45,5 @@ interface BuildItemsLookupsParameters {
|
|
|
45
45
|
[itemId: string]: TreeViewItemMeta;
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
|
-
export interface BuildItemsLookupConfig extends Pick<UseTreeViewItemsParametersWithDefaults<TreeViewBaseItem>, 'isItemDisabled' | 'getItemLabel' | 'getItemChildren' | 'getItemId'> {}
|
|
48
|
+
export interface BuildItemsLookupConfig extends Pick<UseTreeViewItemsParametersWithDefaults<TreeViewBaseItem>, 'isItemDisabled' | 'isItemSelectionDisabled' | 'getItemLabel' | 'getItemChildren' | 'getItemId'> {}
|
|
49
49
|
export {};
|
|
@@ -131,6 +131,7 @@ function buildItemsLookups(parameters) {
|
|
|
131
131
|
idAttribute: undefined,
|
|
132
132
|
expandable: isItemExpandable(item, children),
|
|
133
133
|
disabled: config.isItemDisabled ? config.isItemDisabled(item) : false,
|
|
134
|
+
selectable: config.isItemSelectionDisabled ? !config.isItemSelectionDisabled(item) : true,
|
|
134
135
|
depth
|
|
135
136
|
};
|
|
136
137
|
orderedChildrenIds.push(id);
|
|
@@ -8,8 +8,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
8
8
|
exports.useTreeViewJSXItemsItemPlugin = void 0;
|
|
9
9
|
var React = _interopRequireWildcard(require("react"));
|
|
10
10
|
var _store = require("@mui/x-internals/store");
|
|
11
|
-
var _useMergedRefs = require("@base-ui
|
|
12
|
-
var _useIsoLayoutEffect = require("@base-ui
|
|
11
|
+
var _useMergedRefs = require("@base-ui/utils/useMergedRefs");
|
|
12
|
+
var _useIsoLayoutEffect = require("@base-ui/utils/useIsoLayoutEffect");
|
|
13
13
|
var _TreeViewProvider = require("../../TreeViewProvider");
|
|
14
14
|
var _TreeViewChildrenItemProvider = require("../../TreeViewProvider/TreeViewChildrenItemProvider");
|
|
15
15
|
var _useTreeItemUtils = require("../../../hooks/useTreeItemUtils/useTreeItemUtils");
|
|
@@ -27,6 +27,7 @@ const useTreeViewJSXItemsItemPlugin = ({
|
|
|
27
27
|
const {
|
|
28
28
|
children,
|
|
29
29
|
disabled = false,
|
|
30
|
+
disableSelection = false,
|
|
30
31
|
label,
|
|
31
32
|
itemId,
|
|
32
33
|
id
|
|
@@ -64,9 +65,10 @@ const useTreeViewJSXItemsItemPlugin = ({
|
|
|
64
65
|
idAttribute: id,
|
|
65
66
|
parentId,
|
|
66
67
|
expandable,
|
|
67
|
-
disabled
|
|
68
|
+
disabled,
|
|
69
|
+
selectable: !disableSelection
|
|
68
70
|
});
|
|
69
|
-
}, [instance, parentId, itemId, expandable, disabled, id]);
|
|
71
|
+
}, [instance, parentId, itemId, expandable, disabled, disableSelection, id]);
|
|
70
72
|
React.useEffect(() => {
|
|
71
73
|
if (label) {
|
|
72
74
|
return instance.mapLabelFromJSX(itemId, (pluginContentRef.current?.textContent ?? '').toLowerCase());
|
|
@@ -9,7 +9,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
9
9
|
exports.useTreeViewJSXItems = void 0;
|
|
10
10
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
11
11
|
var React = _interopRequireWildcard(require("react"));
|
|
12
|
-
var
|
|
12
|
+
var _useStableCallback = require("@base-ui/utils/useStableCallback");
|
|
13
13
|
var _TreeViewChildrenItemProvider = require("../../TreeViewProvider/TreeViewChildrenItemProvider");
|
|
14
14
|
var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.utils");
|
|
15
15
|
var _TreeViewItemDepthContext = require("../../TreeViewItemDepthContext");
|
|
@@ -20,7 +20,7 @@ const useTreeViewJSXItems = ({
|
|
|
20
20
|
store
|
|
21
21
|
}) => {
|
|
22
22
|
instance.preventItemUpdates();
|
|
23
|
-
const insertJSXItem = (0,
|
|
23
|
+
const insertJSXItem = (0, _useStableCallback.useStableCallback)(item => {
|
|
24
24
|
if (store.state.items.itemMetaLookup[item.id] != null) {
|
|
25
25
|
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: "${item.id}"`].join('\n'));
|
|
26
26
|
}
|
|
@@ -58,7 +58,7 @@ const useTreeViewJSXItems = ({
|
|
|
58
58
|
})
|
|
59
59
|
}));
|
|
60
60
|
};
|
|
61
|
-
const mapLabelFromJSX = (0,
|
|
61
|
+
const mapLabelFromJSX = (0, _useStableCallback.useStableCallback)((itemId, label) => {
|
|
62
62
|
instance.updateLabelMap(labelMap => {
|
|
63
63
|
labelMap[itemId] = label;
|
|
64
64
|
return labelMap;
|
|
@@ -9,8 +9,8 @@ exports.useTreeViewKeyboardNavigation = void 0;
|
|
|
9
9
|
var React = _interopRequireWildcard(require("react"));
|
|
10
10
|
var _store = require("@mui/x-internals/store");
|
|
11
11
|
var _RtlProvider = require("@mui/system/RtlProvider");
|
|
12
|
-
var _useTimeout = require("@base-ui
|
|
13
|
-
var
|
|
12
|
+
var _useTimeout = require("@base-ui/utils/useTimeout");
|
|
13
|
+
var _useStableCallback = require("@base-ui/utils/useStableCallback");
|
|
14
14
|
var _tree = require("../../utils/tree");
|
|
15
15
|
var _plugins = require("../../utils/plugins");
|
|
16
16
|
var _useTreeViewLabel = require("../useTreeViewLabel");
|
|
@@ -31,7 +31,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
31
31
|
const labelMap = React.useRef({});
|
|
32
32
|
const typeaheadQueryRef = React.useRef('');
|
|
33
33
|
const typeaheadTimeout = (0, _useTimeout.useTimeout)();
|
|
34
|
-
const updateLabelMap = (0,
|
|
34
|
+
const updateLabelMap = (0, _useStableCallback.useStableCallback)(callback => {
|
|
35
35
|
labelMap.current = callback(labelMap.current);
|
|
36
36
|
});
|
|
37
37
|
const itemMetaLookup = (0, _store.useStore)(store, _useTreeViewItems.itemsSelectors.itemMetaLookup);
|
|
@@ -91,7 +91,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
91
91
|
typeaheadQueryRef.current = '';
|
|
92
92
|
return null;
|
|
93
93
|
};
|
|
94
|
-
const canToggleItemSelection = itemId => _useTreeViewSelection.selectionSelectors.
|
|
94
|
+
const canToggleItemSelection = itemId => _useTreeViewSelection.selectionSelectors.canItemBeSelected(store.state, itemId);
|
|
95
95
|
const canToggleItemExpansion = itemId => {
|
|
96
96
|
return !_useTreeViewItems.itemsSelectors.isItemDisabled(store.state, itemId) && _useTreeViewExpansion.expansionSelectors.isItemExpandable(store.state, itemId);
|
|
97
97
|
};
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.useTreeViewLabel = void 0;
|
|
8
8
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
-
var _useIsoLayoutEffect = require("@base-ui
|
|
9
|
+
var _useIsoLayoutEffect = require("@base-ui/utils/useIsoLayoutEffect");
|
|
10
10
|
var _itemPlugin = require("./itemPlugin");
|
|
11
11
|
var _useTreeViewLabel = require("./useTreeViewLabel.selectors");
|
|
12
12
|
const useTreeViewLabel = ({
|
|
@@ -50,9 +50,9 @@ const useTreeViewSelectionItemPlugin = ({
|
|
|
50
50
|
store
|
|
51
51
|
} = (0, _TreeViewProvider.useTreeViewContext)();
|
|
52
52
|
const isCheckboxSelectionEnabled = (0, _store.useStore)(store, _useTreeViewSelection.selectionSelectors.isCheckboxSelectionEnabled);
|
|
53
|
-
const
|
|
53
|
+
const isFeatureEnabledForItem = (0, _store.useStore)(store, _useTreeViewSelection.selectionSelectors.isFeatureEnabledForItem, itemId);
|
|
54
|
+
const canItemBeSelected = (0, _store.useStore)(store, _useTreeViewSelection.selectionSelectors.canItemBeSelected, itemId);
|
|
54
55
|
const selectionStatus = (0, _store.useStore)(store, selectorCheckboxSelectionStatus, itemId);
|
|
55
|
-
const isSelectionEnabledForItem = (0, _store.useStore)(store, _useTreeViewSelection.selectionSelectors.canItemBeSelected, itemId);
|
|
56
56
|
return {
|
|
57
57
|
propsEnhancers: {
|
|
58
58
|
root: () => {
|
|
@@ -63,7 +63,7 @@ const useTreeViewSelectionItemPlugin = ({
|
|
|
63
63
|
ariaChecked = true;
|
|
64
64
|
} else if (selectionStatus === 'indeterminate') {
|
|
65
65
|
ariaChecked = 'mixed';
|
|
66
|
-
} else if (!
|
|
66
|
+
} else if (!canItemBeSelected) {
|
|
67
67
|
// - if the tree contains nodes that are not selectable, aria-checked is not present on those nodes.
|
|
68
68
|
ariaChecked = undefined;
|
|
69
69
|
} else {
|
|
@@ -91,8 +91,8 @@ const useTreeViewSelectionItemPlugin = ({
|
|
|
91
91
|
return {
|
|
92
92
|
tabIndex: -1,
|
|
93
93
|
onChange: handleChange,
|
|
94
|
-
visible: isCheckboxSelectionEnabled,
|
|
95
|
-
disabled: !
|
|
94
|
+
visible: isCheckboxSelectionEnabled && isFeatureEnabledForItem,
|
|
95
|
+
disabled: !canItemBeSelected,
|
|
96
96
|
checked: selectionStatus === 'checked',
|
|
97
97
|
indeterminate: selectionStatus === 'indeterminate'
|
|
98
98
|
};
|
|
@@ -9,10 +9,11 @@ exports.useTreeViewSelection = void 0;
|
|
|
9
9
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
10
10
|
var React = _interopRequireWildcard(require("react"));
|
|
11
11
|
var _useAssertModelConsistency = require("@mui/x-internals/useAssertModelConsistency");
|
|
12
|
-
var _useIsoLayoutEffect = require("@base-ui
|
|
12
|
+
var _useIsoLayoutEffect = require("@base-ui/utils/useIsoLayoutEffect");
|
|
13
13
|
var _tree = require("../../utils/tree");
|
|
14
14
|
var _useTreeViewSelection = require("./useTreeViewSelection.utils");
|
|
15
15
|
var _useTreeViewSelection2 = require("./useTreeViewSelection.selectors");
|
|
16
|
+
var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
|
|
16
17
|
var _itemPlugin = require("./itemPlugin");
|
|
17
18
|
const useTreeViewSelection = ({
|
|
18
19
|
store,
|
|
@@ -123,7 +124,7 @@ const useTreeViewSelection = ({
|
|
|
123
124
|
|
|
124
125
|
// Add to the model the items that are part of the new range and not already part of the model.
|
|
125
126
|
const selectedItemsLookup = (0, _useTreeViewSelection.getLookupFromArray)(newSelectedItems);
|
|
126
|
-
const range = (0, _tree.getNonDisabledItemsInRange)(store.state, start, end);
|
|
127
|
+
const range = (0, _tree.getNonDisabledItemsInRange)(store.state, start, end).filter(id => _useTreeViewItems.itemsSelectors.isItemSelectable(store.state, id));
|
|
127
128
|
const itemsToAddToModel = range.filter(id => !selectedItemsLookup[id]);
|
|
128
129
|
newSelectedItems = newSelectedItems.concat(itemsToAddToModel);
|
|
129
130
|
setSelectedItems(event, newSelectedItems);
|