@mui/x-tree-view 8.0.0-alpha.0 → 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 +2215 -119
- package/README.md +3 -3
- package/RichTreeView/RichTreeView.js +2 -4
- package/RichTreeView/RichTreeView.types.d.ts +6 -19
- package/SimpleTreeView/SimpleTreeView.types.d.ts +3 -3
- package/TreeItem/TreeItem.d.ts +1 -1
- package/TreeItem/TreeItem.js +4 -4
- package/TreeItem/TreeItem.types.d.ts +4 -2
- 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 +26 -11
- package/TreeItemProvider/TreeItemProvider.types.d.ts +1 -0
- package/hooks/index.d.ts +1 -0
- package/hooks/index.js +2 -1
- package/hooks/useTreeItemModel.d.ts +2 -0
- package/hooks/useTreeItemModel.js +11 -0
- package/hooks/useTreeItemUtils/useTreeItemUtils.d.ts +6 -5
- package/hooks/useTreeItemUtils/useTreeItemUtils.js +31 -15
- package/hooks/useTreeViewApiRef.d.ts +2 -1
- package/index.js +1 -1
- package/internals/TreeViewItemDepthContext/TreeViewItemDepthContext.d.ts +3 -1
- package/internals/TreeViewProvider/TreeViewChildrenItemProvider.d.ts +2 -1
- package/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
- package/internals/TreeViewProvider/TreeViewProvider.js +1 -2
- package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +5 -3
- package/internals/components/RichTreeViewItems.d.ts +3 -5
- package/internals/components/RichTreeViewItems.js +42 -30
- package/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
- package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.d.ts +36 -0
- package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
- package/internals/corePlugins/useTreeViewId/useTreeViewId.types.d.ts +1 -5
- package/internals/hooks/useInstanceEventHandler.js +1 -1
- package/internals/hooks/useSelector.d.ts +4 -0
- package/internals/hooks/useSelector.js +6 -0
- package/internals/index.d.ts +6 -1
- package/internals/index.js +5 -1
- package/internals/models/itemPlugin.d.ts +7 -7
- package/internals/models/plugin.d.ts +22 -10
- package/internals/models/treeView.d.ts +6 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +41 -30
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +180 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +24 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +6 -18
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.d.ts +4 -0
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +19 -0
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.d.ts +182 -0
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +4 -16
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
- package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/index.d.ts +1 -1
- package/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -98
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +886 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
- package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +36 -55
- package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
- package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +74 -0
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
- package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +7 -24
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -17
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +45 -34
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +32 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +6 -6
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +6 -6
- package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +23 -13
- package/internals/useTreeView/useTreeView.d.ts +1 -1
- package/internals/useTreeView/useTreeView.js +30 -17
- package/internals/useTreeView/useTreeView.types.d.ts +3 -4
- package/internals/useTreeView/useTreeViewBuildContext.d.ts +4 -2
- package/internals/useTreeView/useTreeViewBuildContext.js +24 -18
- package/internals/utils/TreeViewStore.d.ts +12 -0
- package/internals/utils/TreeViewStore.js +24 -0
- package/internals/utils/selectors.d.ts +9 -0
- package/internals/utils/selectors.js +37 -0
- package/internals/utils/tree.d.ts +8 -8
- package/internals/utils/tree.js +51 -43
- package/models/items.d.ts +3 -2
- package/modern/RichTreeView/RichTreeView.js +2 -4
- package/modern/TreeItem/TreeItem.js +4 -4
- package/modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +1 -1
- package/modern/TreeItemProvider/TreeItemProvider.js +26 -11
- package/modern/hooks/index.js +2 -1
- package/modern/hooks/useTreeItemModel.js +11 -0
- package/modern/hooks/useTreeItemUtils/useTreeItemUtils.js +31 -15
- package/modern/index.js +1 -1
- package/modern/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
- package/modern/internals/TreeViewProvider/TreeViewProvider.js +1 -2
- package/modern/internals/components/RichTreeViewItems.js +42 -30
- package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
- package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
- package/modern/internals/hooks/useInstanceEventHandler.js +1 -1
- package/modern/internals/hooks/useSelector.js +6 -0
- package/modern/internals/index.js +5 -1
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +41 -30
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +24 -0
- package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +19 -0
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
- package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
- package/modern/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -98
- package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
- package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
- package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
- package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
- package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
- package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -17
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +45 -34
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
- package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +23 -13
- package/modern/internals/useTreeView/useTreeView.js +30 -17
- package/modern/internals/useTreeView/useTreeViewBuildContext.js +24 -18
- package/modern/internals/utils/TreeViewStore.js +24 -0
- package/modern/internals/utils/selectors.js +37 -0
- package/modern/internals/utils/tree.js +51 -43
- package/modern/useTreeItem/useTreeItem.js +29 -16
- package/node/RichTreeView/RichTreeView.js +2 -4
- package/node/TreeItem/TreeItem.js +4 -4
- package/node/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +2 -2
- package/node/TreeItemProvider/TreeItemProvider.js +26 -10
- package/node/hooks/index.js +8 -1
- package/node/hooks/useTreeItemModel.js +17 -0
- package/node/hooks/useTreeItemUtils/useTreeItemUtils.js +32 -15
- package/node/index.js +1 -1
- package/node/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
- package/node/internals/TreeViewProvider/TreeViewProvider.js +1 -2
- package/node/internals/components/RichTreeViewItems.js +42 -30
- package/node/internals/corePlugins/useTreeViewId/useTreeViewId.js +12 -13
- package/node/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +15 -0
- package/node/internals/hooks/useInstanceEventHandler.js +1 -1
- package/node/internals/hooks/useSelector.js +13 -0
- package/node/internals/index.js +47 -1
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +41 -31
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +30 -0
- package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +27 -0
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
- package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +40 -0
- package/node/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +16 -13
- package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +60 -100
- package/node/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +109 -0
- package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +30 -27
- package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
- package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
- package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
- package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +32 -0
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -17
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +46 -35
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +15 -0
- package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +24 -14
- package/node/internals/useTreeView/useTreeView.js +30 -17
- package/node/internals/useTreeView/useTreeViewBuildContext.js +25 -18
- package/node/internals/utils/TreeViewStore.js +31 -0
- package/node/internals/utils/selectors.js +44 -0
- package/node/internals/utils/tree.js +51 -43
- package/node/useTreeItem/useTreeItem.js +29 -16
- package/package.json +8 -6
- package/useTreeItem/useTreeItem.js +29 -16
- package/useTreeItem/useTreeItem.types.d.ts +10 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { TreeViewRootSelector } from '../../utils/selectors';
|
|
2
|
+
import { UseTreeViewExpansionSignature } from './useTreeViewExpansion.types';
|
|
3
|
+
/**
|
|
4
|
+
* Check if an item is expanded.
|
|
5
|
+
* @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
|
|
6
|
+
* @returns {boolean} `true` if the item is expanded, `false` otherwise.
|
|
7
|
+
*/
|
|
8
|
+
export declare const selectorIsItemExpanded: ((state: any, itemId: string) => boolean) & {
|
|
9
|
+
clearCache: () => void;
|
|
10
|
+
resultsCount: () => number;
|
|
11
|
+
resetResultsCount: () => void;
|
|
12
|
+
} & {
|
|
13
|
+
resultFunc: (resultFuncArgs_0: {
|
|
14
|
+
expandedItemsMap: Map<string, true>;
|
|
15
|
+
expansionTrigger: "content" | "iconContainer";
|
|
16
|
+
}, resultFuncArgs_1: string) => boolean;
|
|
17
|
+
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
18
|
+
expandedItemsMap: Map<string, true>;
|
|
19
|
+
expansionTrigger: "content" | "iconContainer";
|
|
20
|
+
}, resultFuncArgs_1: string) => boolean) & {
|
|
21
|
+
clearCache: () => void;
|
|
22
|
+
resultsCount: () => number;
|
|
23
|
+
resetResultsCount: () => void;
|
|
24
|
+
};
|
|
25
|
+
lastResult: () => boolean;
|
|
26
|
+
dependencies: [TreeViewRootSelector<UseTreeViewExpansionSignature>, (_: any, itemId: string) => string];
|
|
27
|
+
recomputations: () => number;
|
|
28
|
+
resetRecomputations: () => void;
|
|
29
|
+
dependencyRecomputations: () => number;
|
|
30
|
+
resetDependencyRecomputations: () => void;
|
|
31
|
+
} & {
|
|
32
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
33
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Check if an item is expandable.
|
|
37
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
38
|
+
* @returns {boolean} `true` if the item is expandable, `false` otherwise.
|
|
39
|
+
*/
|
|
40
|
+
export declare const selectorIsItemExpandable: ((state: any, itemId: string | null) => boolean) & {
|
|
41
|
+
clearCache: () => void;
|
|
42
|
+
resultsCount: () => number;
|
|
43
|
+
resetResultsCount: () => void;
|
|
44
|
+
} & {
|
|
45
|
+
resultFunc: (resultFuncArgs_0: import("../..").TreeViewItemMeta | null) => boolean;
|
|
46
|
+
memoizedResultFunc: ((resultFuncArgs_0: import("../..").TreeViewItemMeta | null) => boolean) & {
|
|
47
|
+
clearCache: () => void;
|
|
48
|
+
resultsCount: () => number;
|
|
49
|
+
resetResultsCount: () => void;
|
|
50
|
+
};
|
|
51
|
+
lastResult: () => boolean;
|
|
52
|
+
dependencies: [((state: any, itemId: string | null) => import("../..").TreeViewItemMeta | null) & {
|
|
53
|
+
clearCache: () => void;
|
|
54
|
+
resultsCount: () => number;
|
|
55
|
+
resetResultsCount: () => void;
|
|
56
|
+
} & {
|
|
57
|
+
resultFunc: (resultFuncArgs_0: {
|
|
58
|
+
[itemId: string]: import("../..").TreeViewItemMeta;
|
|
59
|
+
}, resultFuncArgs_1: string | null) => import("../..").TreeViewItemMeta | null;
|
|
60
|
+
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
61
|
+
[itemId: string]: import("../..").TreeViewItemMeta;
|
|
62
|
+
}, resultFuncArgs_1: string | null) => import("../..").TreeViewItemMeta | null) & {
|
|
63
|
+
clearCache: () => void;
|
|
64
|
+
resultsCount: () => number;
|
|
65
|
+
resetResultsCount: () => void;
|
|
66
|
+
};
|
|
67
|
+
lastResult: () => import("../..").TreeViewItemMeta | null;
|
|
68
|
+
dependencies: [((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types").UseTreeViewIdState & import("../useTreeViewItems").UseTreeViewItemsState<import("../../..").TreeViewDefaultItemModelProperties> & Partial<{}> & {
|
|
69
|
+
cacheKey: import("../../models").TreeViewStateCacheKey;
|
|
70
|
+
}) => {
|
|
71
|
+
[itemId: string]: import("../..").TreeViewItemMeta;
|
|
72
|
+
}) & {
|
|
73
|
+
clearCache: () => void;
|
|
74
|
+
resultsCount: () => number;
|
|
75
|
+
resetResultsCount: () => void;
|
|
76
|
+
} & {
|
|
77
|
+
resultFunc: (resultFuncArgs_0: {
|
|
78
|
+
disabledItemsFocusable: boolean;
|
|
79
|
+
itemModelLookup: {
|
|
80
|
+
[itemId: string]: import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>;
|
|
81
|
+
};
|
|
82
|
+
itemMetaLookup: {
|
|
83
|
+
[itemId: string]: import("../..").TreeViewItemMeta;
|
|
84
|
+
};
|
|
85
|
+
itemOrderedChildrenIdsLookup: {
|
|
86
|
+
[parentItemId: string]: string[];
|
|
87
|
+
};
|
|
88
|
+
itemChildrenIndexesLookup: {
|
|
89
|
+
[parentItemId: string]: {
|
|
90
|
+
[itemId: string]: number;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
}) => {
|
|
94
|
+
[itemId: string]: import("../..").TreeViewItemMeta;
|
|
95
|
+
};
|
|
96
|
+
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
97
|
+
disabledItemsFocusable: boolean;
|
|
98
|
+
itemModelLookup: {
|
|
99
|
+
[itemId: string]: import("../../..").TreeViewBaseItem<import("../../..").TreeViewDefaultItemModelProperties>;
|
|
100
|
+
};
|
|
101
|
+
itemMetaLookup: {
|
|
102
|
+
[itemId: string]: import("../..").TreeViewItemMeta;
|
|
103
|
+
};
|
|
104
|
+
itemOrderedChildrenIdsLookup: {
|
|
105
|
+
[parentItemId: string]: string[];
|
|
106
|
+
};
|
|
107
|
+
itemChildrenIndexesLookup: {
|
|
108
|
+
[parentItemId: string]: {
|
|
109
|
+
[itemId: string]: number;
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
}) => {
|
|
113
|
+
[itemId: string]: import("../..").TreeViewItemMeta;
|
|
114
|
+
}) & {
|
|
115
|
+
clearCache: () => void;
|
|
116
|
+
resultsCount: () => number;
|
|
117
|
+
resetResultsCount: () => void;
|
|
118
|
+
};
|
|
119
|
+
lastResult: () => {
|
|
120
|
+
[itemId: string]: import("../..").TreeViewItemMeta;
|
|
121
|
+
};
|
|
122
|
+
dependencies: [TreeViewRootSelector<import("../useTreeViewItems").UseTreeViewItemsSignature>];
|
|
123
|
+
recomputations: () => number;
|
|
124
|
+
resetRecomputations: () => void;
|
|
125
|
+
dependencyRecomputations: () => number;
|
|
126
|
+
resetDependencyRecomputations: () => void;
|
|
127
|
+
} & {
|
|
128
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
129
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
130
|
+
}, (_: any, itemId: string | null) => string | null];
|
|
131
|
+
recomputations: () => number;
|
|
132
|
+
resetRecomputations: () => void;
|
|
133
|
+
dependencyRecomputations: () => number;
|
|
134
|
+
resetDependencyRecomputations: () => void;
|
|
135
|
+
} & {
|
|
136
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
137
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
138
|
+
}];
|
|
139
|
+
recomputations: () => number;
|
|
140
|
+
resetRecomputations: () => void;
|
|
141
|
+
dependencyRecomputations: () => number;
|
|
142
|
+
resetDependencyRecomputations: () => void;
|
|
143
|
+
} & {
|
|
144
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
145
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Get the slot that triggers the item's expansion when clicked.
|
|
149
|
+
* @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
|
|
150
|
+
* @returns {'content' | 'iconContainer'} The slot that triggers the item's expansion when clicked. Is `null` if the item is not expandable.
|
|
151
|
+
*/
|
|
152
|
+
export declare const selectorItemExpansionTrigger: ((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types").UseTreeViewIdState & import("./useTreeViewExpansion.types").UseTreeViewExpansionState & Partial<{}> & {
|
|
153
|
+
cacheKey: import("../../models").TreeViewStateCacheKey;
|
|
154
|
+
}) => "content" | "iconContainer") & {
|
|
155
|
+
clearCache: () => void;
|
|
156
|
+
resultsCount: () => number;
|
|
157
|
+
resetResultsCount: () => void;
|
|
158
|
+
} & {
|
|
159
|
+
resultFunc: (resultFuncArgs_0: {
|
|
160
|
+
expandedItemsMap: Map<string, true>;
|
|
161
|
+
expansionTrigger: "content" | "iconContainer";
|
|
162
|
+
}) => "content" | "iconContainer";
|
|
163
|
+
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
164
|
+
expandedItemsMap: Map<string, true>;
|
|
165
|
+
expansionTrigger: "content" | "iconContainer";
|
|
166
|
+
}) => "content" | "iconContainer") & {
|
|
167
|
+
clearCache: () => void;
|
|
168
|
+
resultsCount: () => number;
|
|
169
|
+
resetResultsCount: () => void;
|
|
170
|
+
};
|
|
171
|
+
lastResult: () => "content" | "iconContainer";
|
|
172
|
+
dependencies: [TreeViewRootSelector<UseTreeViewExpansionSignature>];
|
|
173
|
+
recomputations: () => number;
|
|
174
|
+
resetRecomputations: () => void;
|
|
175
|
+
dependencyRecomputations: () => number;
|
|
176
|
+
resetDependencyRecomputations: () => void;
|
|
177
|
+
} & {
|
|
178
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
179
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
180
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createSelector } from "../../utils/selectors.js";
|
|
2
|
+
import { selectorItemMeta } from "../useTreeViewItems/useTreeViewItems.selectors.js";
|
|
3
|
+
const selectorExpansion = state => state.expansion;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Check if an item is expanded.
|
|
7
|
+
* @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
|
|
8
|
+
* @returns {boolean} `true` if the item is expanded, `false` otherwise.
|
|
9
|
+
*/
|
|
10
|
+
export const selectorIsItemExpanded = createSelector([selectorExpansion, (_, itemId) => itemId], (expansionState, itemId) => expansionState.expandedItemsMap.has(itemId));
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Check if an item is expandable.
|
|
14
|
+
* @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
|
|
15
|
+
* @returns {boolean} `true` if the item is expandable, `false` otherwise.
|
|
16
|
+
*/
|
|
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);
|
|
@@ -14,20 +14,6 @@ export interface UseTreeViewExpansionPublicAPI {
|
|
|
14
14
|
setItemExpansion: (event: React.SyntheticEvent, itemId: string, isExpanded: boolean) => void;
|
|
15
15
|
}
|
|
16
16
|
export interface UseTreeViewExpansionInstance extends UseTreeViewExpansionPublicAPI {
|
|
17
|
-
/**
|
|
18
|
-
* Check if an item is expanded.
|
|
19
|
-
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
20
|
-
* @returns {boolean} `true` if the item is expanded, `false` otherwise.
|
|
21
|
-
*/
|
|
22
|
-
isItemExpanded: (itemId: TreeViewItemId) => boolean;
|
|
23
|
-
/**
|
|
24
|
-
* Check if an item is expandable.
|
|
25
|
-
* Currently, an item is expandable if it has children.
|
|
26
|
-
* In the future, the user should be able to flag an item as expandable even if it has no loaded children to support children lazy loading.
|
|
27
|
-
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
28
|
-
* @returns {boolean} `true` if the item can be expanded, `false` otherwise.
|
|
29
|
-
*/
|
|
30
|
-
isItemExpandable: (itemId: TreeViewItemId) => boolean;
|
|
31
17
|
/**
|
|
32
18
|
* Toggle the current expansion of an item.
|
|
33
19
|
* If it is expanded, it will be collapsed, and vice versa.
|
|
@@ -74,8 +60,11 @@ export interface UseTreeViewExpansionParameters {
|
|
|
74
60
|
expansionTrigger?: 'content' | 'iconContainer';
|
|
75
61
|
}
|
|
76
62
|
export type UseTreeViewExpansionDefaultizedParameters = DefaultizedProps<UseTreeViewExpansionParameters, 'defaultExpandedItems'>;
|
|
77
|
-
interface
|
|
78
|
-
expansion:
|
|
63
|
+
export interface UseTreeViewExpansionState {
|
|
64
|
+
expansion: {
|
|
65
|
+
expandedItemsMap: Map<string, true>;
|
|
66
|
+
expansionTrigger: 'content' | 'iconContainer';
|
|
67
|
+
};
|
|
79
68
|
}
|
|
80
69
|
export type UseTreeViewExpansionSignature = TreeViewPluginSignature<{
|
|
81
70
|
params: UseTreeViewExpansionParameters;
|
|
@@ -83,8 +72,7 @@ export type UseTreeViewExpansionSignature = TreeViewPluginSignature<{
|
|
|
83
72
|
instance: UseTreeViewExpansionInstance;
|
|
84
73
|
publicAPI: UseTreeViewExpansionPublicAPI;
|
|
85
74
|
modelNames: 'expandedItems';
|
|
86
|
-
|
|
75
|
+
state: UseTreeViewExpansionState;
|
|
87
76
|
dependencies: [UseTreeViewItemsSignature];
|
|
88
77
|
optionalDependencies: [UseTreeViewLabelSignature];
|
|
89
78
|
}>;
|
|
90
|
-
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { TreeViewUsedDefaultizedParams } from '../../models';
|
|
2
|
+
import { UseTreeViewExpansionSignature } from './useTreeViewExpansion.types';
|
|
3
|
+
export declare const createExpandedItemsMap: (expandedItems: string[]) => Map<string, true>;
|
|
4
|
+
export declare const getExpansionTrigger: ({ isItemEditable, expansionTrigger, }: Pick<TreeViewUsedDefaultizedParams<UseTreeViewExpansionSignature>, "isItemEditable" | "expansionTrigger">) => "content" | "iconContainer";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const createExpandedItemsMap = expandedItems => {
|
|
2
|
+
const expandedItemsMap = new Map();
|
|
3
|
+
expandedItems.forEach(id => {
|
|
4
|
+
expandedItemsMap.set(id, true);
|
|
5
|
+
});
|
|
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';
|
|
19
|
+
};
|
|
@@ -1,46 +1,56 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import useEventCallback from '@mui/utils/useEventCallback';
|
|
4
|
-
import ownerDocument from '@mui/utils/ownerDocument';
|
|
5
4
|
import { useInstanceEventHandler } from "../../hooks/useInstanceEventHandler.js";
|
|
6
|
-
import { getActiveElement } from "../../utils/utils.js";
|
|
7
5
|
import { getFirstNavigableItem } from "../../utils/tree.js";
|
|
8
6
|
import { convertSelectedItemsToArray } from "../useTreeViewSelection/useTreeViewSelection.utils.js";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
return false;
|
|
13
|
-
}
|
|
14
|
-
const itemMeta = instance.getItemMeta(itemId);
|
|
15
|
-
return itemMeta && (itemMeta.parentId == null || instance.isItemExpanded(itemMeta.parentId));
|
|
16
|
-
});
|
|
17
|
-
if (tabbableItemId == null) {
|
|
18
|
-
tabbableItemId = getFirstNavigableItem(instance);
|
|
19
|
-
}
|
|
20
|
-
return tabbableItemId;
|
|
21
|
-
};
|
|
7
|
+
import { selectorDefaultFocusableItemId, selectorFocusedItemId } from "./useTreeViewFocus.selectors.js";
|
|
8
|
+
import { selectorIsItemExpanded } from "../useTreeViewExpansion/useTreeViewExpansion.selectors.js";
|
|
9
|
+
import { selectorCanItemBeFocused, selectorItemMeta } from "../useTreeViewItems/useTreeViewItems.selectors.js";
|
|
22
10
|
export const useTreeViewFocus = ({
|
|
23
11
|
instance,
|
|
24
12
|
params,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
models,
|
|
28
|
-
rootRef
|
|
13
|
+
store,
|
|
14
|
+
models
|
|
29
15
|
}) => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
16
|
+
React.useEffect(() => {
|
|
17
|
+
let defaultFocusableItemId = convertSelectedItemsToArray(models.selectedItems.value).find(itemId => {
|
|
18
|
+
if (!selectorCanItemBeFocused(store.value, itemId)) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const itemMeta = selectorItemMeta(store.value, itemId);
|
|
22
|
+
return itemMeta && (itemMeta.parentId == null || selectorIsItemExpanded(store.value, itemMeta.parentId));
|
|
23
|
+
});
|
|
24
|
+
if (defaultFocusableItemId == null) {
|
|
25
|
+
defaultFocusableItemId = getFirstNavigableItem(store.value) ?? null;
|
|
37
26
|
}
|
|
27
|
+
store.update(prevState => {
|
|
28
|
+
if (defaultFocusableItemId === prevState.focus.defaultFocusableItemId) {
|
|
29
|
+
return prevState;
|
|
30
|
+
}
|
|
31
|
+
return _extends({}, prevState, {
|
|
32
|
+
focus: _extends({}, prevState.focus, {
|
|
33
|
+
defaultFocusableItemId
|
|
34
|
+
})
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}, [store, models.selectedItems.value]);
|
|
38
|
+
const setFocusedItemId = useEventCallback(itemId => {
|
|
39
|
+
store.update(prevState => {
|
|
40
|
+
const focusedItemId = selectorFocusedItemId(prevState);
|
|
41
|
+
if (focusedItemId === itemId) {
|
|
42
|
+
return prevState;
|
|
43
|
+
}
|
|
44
|
+
return _extends({}, prevState, {
|
|
45
|
+
focus: _extends({}, prevState.focus, {
|
|
46
|
+
focusedItemId: itemId
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
});
|
|
38
50
|
});
|
|
39
|
-
const isTreeViewFocused = React.useCallback(() => !!rootRef.current && rootRef.current.contains(getActiveElement(ownerDocument(rootRef.current))), [rootRef]);
|
|
40
|
-
const isItemFocused = React.useCallback(itemId => state.focusedItemId === itemId && isTreeViewFocused(), [state.focusedItemId, isTreeViewFocused]);
|
|
41
51
|
const isItemVisible = itemId => {
|
|
42
|
-
const itemMeta =
|
|
43
|
-
return itemMeta && (itemMeta.parentId == null ||
|
|
52
|
+
const itemMeta = selectorItemMeta(store.value, itemId);
|
|
53
|
+
return itemMeta && (itemMeta.parentId == null || selectorIsItemExpanded(store.value, itemMeta.parentId));
|
|
44
54
|
};
|
|
45
55
|
const innerFocusItem = (event, itemId) => {
|
|
46
56
|
const itemElement = instance.getItemDOMElement(itemId);
|
|
@@ -59,23 +69,25 @@ export const useTreeViewFocus = ({
|
|
|
59
69
|
}
|
|
60
70
|
});
|
|
61
71
|
const removeFocusedItem = useEventCallback(() => {
|
|
62
|
-
|
|
72
|
+
const focusedItemId = selectorFocusedItemId(store.value);
|
|
73
|
+
if (focusedItemId == null) {
|
|
63
74
|
return;
|
|
64
75
|
}
|
|
65
|
-
const itemMeta =
|
|
76
|
+
const itemMeta = selectorItemMeta(store.value, focusedItemId);
|
|
66
77
|
if (itemMeta) {
|
|
67
|
-
const itemElement = instance.getItemDOMElement(
|
|
78
|
+
const itemElement = instance.getItemDOMElement(focusedItemId);
|
|
68
79
|
if (itemElement) {
|
|
69
80
|
itemElement.blur();
|
|
70
81
|
}
|
|
71
82
|
}
|
|
72
83
|
setFocusedItemId(null);
|
|
73
84
|
});
|
|
74
|
-
const canItemBeTabbed = itemId => itemId === defaultFocusableItemId;
|
|
75
85
|
useInstanceEventHandler(instance, 'removeItem', ({
|
|
76
86
|
id
|
|
77
87
|
}) => {
|
|
78
|
-
|
|
88
|
+
const focusedItemId = selectorFocusedItemId(store.value);
|
|
89
|
+
const defaultFocusableItemId = selectorDefaultFocusableItemId(store.value);
|
|
90
|
+
if (focusedItemId === id && defaultFocusableItemId != null) {
|
|
79
91
|
innerFocusItem(null, defaultFocusableItemId);
|
|
80
92
|
}
|
|
81
93
|
});
|
|
@@ -86,27 +98,37 @@ export const useTreeViewFocus = ({
|
|
|
86
98
|
}
|
|
87
99
|
|
|
88
100
|
// if the event bubbled (which is React specific) we don't want to steal focus
|
|
89
|
-
|
|
101
|
+
const defaultFocusableItemId = selectorDefaultFocusableItemId(store.value);
|
|
102
|
+
if (event.target === event.currentTarget && defaultFocusableItemId != null) {
|
|
90
103
|
innerFocusItem(event, defaultFocusableItemId);
|
|
91
104
|
}
|
|
92
105
|
};
|
|
106
|
+
const createRootHandleBlur = otherHandlers => event => {
|
|
107
|
+
otherHandlers.onBlur?.(event);
|
|
108
|
+
if (event.defaultMuiPrevented) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
setFocusedItemId(null);
|
|
112
|
+
};
|
|
93
113
|
return {
|
|
94
114
|
getRootProps: otherHandlers => ({
|
|
95
|
-
onFocus: createRootHandleFocus(otherHandlers)
|
|
115
|
+
onFocus: createRootHandleFocus(otherHandlers),
|
|
116
|
+
onBlur: createRootHandleBlur(otherHandlers)
|
|
96
117
|
}),
|
|
97
118
|
publicAPI: {
|
|
98
119
|
focusItem
|
|
99
120
|
},
|
|
100
121
|
instance: {
|
|
101
|
-
isItemFocused,
|
|
102
|
-
canItemBeTabbed,
|
|
103
122
|
focusItem,
|
|
104
123
|
removeFocusedItem
|
|
105
124
|
}
|
|
106
125
|
};
|
|
107
126
|
};
|
|
108
127
|
useTreeViewFocus.getInitialState = () => ({
|
|
109
|
-
|
|
128
|
+
focus: {
|
|
129
|
+
focusedItemId: null,
|
|
130
|
+
defaultFocusableItemId: null
|
|
131
|
+
}
|
|
110
132
|
});
|
|
111
133
|
useTreeViewFocus.params = {
|
|
112
134
|
onItemFocus: true
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { UseTreeViewFocusSignature } from './useTreeViewFocus.types';
|
|
2
|
+
import { TreeViewRootSelector } from '../../utils/selectors';
|
|
3
|
+
/**
|
|
4
|
+
* Get the item that should be sequentially focusable (usually with the Tab key).
|
|
5
|
+
* At any point in time, there is a single item that can be sequentially focused in the Tree View.
|
|
6
|
+
* This item is the first selected item (that is both visible and navigable), if any, or the first navigable item if no item is selected.
|
|
7
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
8
|
+
* @returns {TreeViewItemId | null} The id of the item that should be sequentially focusable.
|
|
9
|
+
*/
|
|
10
|
+
export declare const selectorDefaultFocusableItemId: ((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types").UseTreeViewIdState & import("./useTreeViewFocus.types").UseTreeViewFocusState & Partial<{}> & {
|
|
11
|
+
cacheKey: import("../../models").TreeViewStateCacheKey;
|
|
12
|
+
}) => string | null) & {
|
|
13
|
+
clearCache: () => void;
|
|
14
|
+
resultsCount: () => number;
|
|
15
|
+
resetResultsCount: () => void;
|
|
16
|
+
} & {
|
|
17
|
+
resultFunc: (resultFuncArgs_0: {
|
|
18
|
+
focusedItemId: string | null;
|
|
19
|
+
defaultFocusableItemId: string | null;
|
|
20
|
+
}) => string | null;
|
|
21
|
+
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
22
|
+
focusedItemId: string | null;
|
|
23
|
+
defaultFocusableItemId: string | null;
|
|
24
|
+
}) => string | null) & {
|
|
25
|
+
clearCache: () => void;
|
|
26
|
+
resultsCount: () => number;
|
|
27
|
+
resetResultsCount: () => void;
|
|
28
|
+
};
|
|
29
|
+
lastResult: () => string | null;
|
|
30
|
+
dependencies: [TreeViewRootSelector<UseTreeViewFocusSignature>];
|
|
31
|
+
recomputations: () => number;
|
|
32
|
+
resetRecomputations: () => void;
|
|
33
|
+
dependencyRecomputations: () => number;
|
|
34
|
+
resetDependencyRecomputations: () => void;
|
|
35
|
+
} & {
|
|
36
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
37
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Check if an item is the default focusable item.
|
|
41
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
42
|
+
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
43
|
+
* @returns {boolean} `true` if the item is the default focusable item, `false` otherwise.
|
|
44
|
+
*/
|
|
45
|
+
export declare const selectorIsItemTheDefaultFocusableItem: ((state: any, itemId: string) => boolean) & {
|
|
46
|
+
clearCache: () => void;
|
|
47
|
+
resultsCount: () => number;
|
|
48
|
+
resetResultsCount: () => void;
|
|
49
|
+
} & {
|
|
50
|
+
resultFunc: (resultFuncArgs_0: string | null, resultFuncArgs_1: string) => boolean;
|
|
51
|
+
memoizedResultFunc: ((resultFuncArgs_0: string | null, resultFuncArgs_1: string) => boolean) & {
|
|
52
|
+
clearCache: () => void;
|
|
53
|
+
resultsCount: () => number;
|
|
54
|
+
resetResultsCount: () => void;
|
|
55
|
+
};
|
|
56
|
+
lastResult: () => boolean;
|
|
57
|
+
dependencies: [((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types").UseTreeViewIdState & import("./useTreeViewFocus.types").UseTreeViewFocusState & Partial<{}> & {
|
|
58
|
+
cacheKey: import("../../models").TreeViewStateCacheKey;
|
|
59
|
+
}) => string | null) & {
|
|
60
|
+
clearCache: () => void;
|
|
61
|
+
resultsCount: () => number;
|
|
62
|
+
resetResultsCount: () => void;
|
|
63
|
+
} & {
|
|
64
|
+
resultFunc: (resultFuncArgs_0: {
|
|
65
|
+
focusedItemId: string | null;
|
|
66
|
+
defaultFocusableItemId: string | null;
|
|
67
|
+
}) => string | null;
|
|
68
|
+
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
69
|
+
focusedItemId: string | null;
|
|
70
|
+
defaultFocusableItemId: string | null;
|
|
71
|
+
}) => string | null) & {
|
|
72
|
+
clearCache: () => void;
|
|
73
|
+
resultsCount: () => number;
|
|
74
|
+
resetResultsCount: () => void;
|
|
75
|
+
};
|
|
76
|
+
lastResult: () => string | null;
|
|
77
|
+
dependencies: [TreeViewRootSelector<UseTreeViewFocusSignature>];
|
|
78
|
+
recomputations: () => number;
|
|
79
|
+
resetRecomputations: () => void;
|
|
80
|
+
dependencyRecomputations: () => number;
|
|
81
|
+
resetDependencyRecomputations: () => void;
|
|
82
|
+
} & {
|
|
83
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
84
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
85
|
+
}, (_: any, itemId: string) => string];
|
|
86
|
+
recomputations: () => number;
|
|
87
|
+
resetRecomputations: () => void;
|
|
88
|
+
dependencyRecomputations: () => number;
|
|
89
|
+
resetDependencyRecomputations: () => void;
|
|
90
|
+
} & {
|
|
91
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
92
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Get the id of the item that is currently focused.
|
|
96
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
97
|
+
* @returns {TreeViewItemId | null} The id of the item that is currently focused.
|
|
98
|
+
*/
|
|
99
|
+
export declare const selectorFocusedItemId: ((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types").UseTreeViewIdState & import("./useTreeViewFocus.types").UseTreeViewFocusState & Partial<{}> & {
|
|
100
|
+
cacheKey: import("../../models").TreeViewStateCacheKey;
|
|
101
|
+
}) => string | null) & {
|
|
102
|
+
clearCache: () => void;
|
|
103
|
+
resultsCount: () => number;
|
|
104
|
+
resetResultsCount: () => void;
|
|
105
|
+
} & {
|
|
106
|
+
resultFunc: (resultFuncArgs_0: {
|
|
107
|
+
focusedItemId: string | null;
|
|
108
|
+
defaultFocusableItemId: string | null;
|
|
109
|
+
}) => string | null;
|
|
110
|
+
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
111
|
+
focusedItemId: string | null;
|
|
112
|
+
defaultFocusableItemId: string | null;
|
|
113
|
+
}) => string | null) & {
|
|
114
|
+
clearCache: () => void;
|
|
115
|
+
resultsCount: () => number;
|
|
116
|
+
resetResultsCount: () => void;
|
|
117
|
+
};
|
|
118
|
+
lastResult: () => string | null;
|
|
119
|
+
dependencies: [TreeViewRootSelector<UseTreeViewFocusSignature>];
|
|
120
|
+
recomputations: () => number;
|
|
121
|
+
resetRecomputations: () => void;
|
|
122
|
+
dependencyRecomputations: () => number;
|
|
123
|
+
resetDependencyRecomputations: () => void;
|
|
124
|
+
} & {
|
|
125
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
126
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Check if an item is focused.
|
|
130
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
131
|
+
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
132
|
+
* @returns {boolean} `true` if the item is focused, `false` otherwise.
|
|
133
|
+
*/
|
|
134
|
+
export declare const selectorIsItemFocused: ((state: any, itemId: string) => boolean) & {
|
|
135
|
+
clearCache: () => void;
|
|
136
|
+
resultsCount: () => number;
|
|
137
|
+
resetResultsCount: () => void;
|
|
138
|
+
} & {
|
|
139
|
+
resultFunc: (resultFuncArgs_0: string | null, resultFuncArgs_1: string) => boolean;
|
|
140
|
+
memoizedResultFunc: ((resultFuncArgs_0: string | null, resultFuncArgs_1: string) => boolean) & {
|
|
141
|
+
clearCache: () => void;
|
|
142
|
+
resultsCount: () => number;
|
|
143
|
+
resetResultsCount: () => void;
|
|
144
|
+
};
|
|
145
|
+
lastResult: () => boolean;
|
|
146
|
+
dependencies: [((state: import("../../corePlugins/useTreeViewId/useTreeViewId.types").UseTreeViewIdState & import("./useTreeViewFocus.types").UseTreeViewFocusState & Partial<{}> & {
|
|
147
|
+
cacheKey: import("../../models").TreeViewStateCacheKey;
|
|
148
|
+
}) => string | null) & {
|
|
149
|
+
clearCache: () => void;
|
|
150
|
+
resultsCount: () => number;
|
|
151
|
+
resetResultsCount: () => void;
|
|
152
|
+
} & {
|
|
153
|
+
resultFunc: (resultFuncArgs_0: {
|
|
154
|
+
focusedItemId: string | null;
|
|
155
|
+
defaultFocusableItemId: string | null;
|
|
156
|
+
}) => string | null;
|
|
157
|
+
memoizedResultFunc: ((resultFuncArgs_0: {
|
|
158
|
+
focusedItemId: string | null;
|
|
159
|
+
defaultFocusableItemId: string | null;
|
|
160
|
+
}) => string | null) & {
|
|
161
|
+
clearCache: () => void;
|
|
162
|
+
resultsCount: () => number;
|
|
163
|
+
resetResultsCount: () => void;
|
|
164
|
+
};
|
|
165
|
+
lastResult: () => string | null;
|
|
166
|
+
dependencies: [TreeViewRootSelector<UseTreeViewFocusSignature>];
|
|
167
|
+
recomputations: () => number;
|
|
168
|
+
resetRecomputations: () => void;
|
|
169
|
+
dependencyRecomputations: () => number;
|
|
170
|
+
resetDependencyRecomputations: () => void;
|
|
171
|
+
} & {
|
|
172
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
173
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
174
|
+
}, (_: any, itemId: string) => string];
|
|
175
|
+
recomputations: () => number;
|
|
176
|
+
resetRecomputations: () => void;
|
|
177
|
+
dependencyRecomputations: () => number;
|
|
178
|
+
resetDependencyRecomputations: () => void;
|
|
179
|
+
} & {
|
|
180
|
+
argsMemoize: typeof import("reselect").weakMapMemoize;
|
|
181
|
+
memoize: typeof import("reselect").weakMapMemoize;
|
|
182
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createSelector } from "../../utils/selectors.js";
|
|
2
|
+
const selectorTreeViewFocusState = state => state.focus;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Get the item that should be sequentially focusable (usually with the Tab key).
|
|
6
|
+
* At any point in time, there is a single item that can be sequentially focused in the Tree View.
|
|
7
|
+
* This item is the first selected item (that is both visible and navigable), if any, or the first navigable item if no item is selected.
|
|
8
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
9
|
+
* @returns {TreeViewItemId | null} The id of the item that should be sequentially focusable.
|
|
10
|
+
*/
|
|
11
|
+
export const selectorDefaultFocusableItemId = createSelector(selectorTreeViewFocusState, focus => focus.defaultFocusableItemId);
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Check if an item is the default focusable item.
|
|
15
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
16
|
+
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
17
|
+
* @returns {boolean} `true` if the item is the default focusable item, `false` otherwise.
|
|
18
|
+
*/
|
|
19
|
+
export const selectorIsItemTheDefaultFocusableItem = createSelector([selectorDefaultFocusableItemId, (_, itemId) => itemId], (defaultFocusableItemId, itemId) => defaultFocusableItemId === itemId);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Get the id of the item that is currently focused.
|
|
23
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
24
|
+
* @returns {TreeViewItemId | null} The id of the item that is currently focused.
|
|
25
|
+
*/
|
|
26
|
+
export const selectorFocusedItemId = createSelector(selectorTreeViewFocusState, focus => focus.focusedItemId);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Check if an item is focused.
|
|
30
|
+
* @param {TreeViewState<[UseTreeViewFocusSignature]>} state The state of the tree view.
|
|
31
|
+
* @param {TreeViewItemId} itemId The id of the item to check.
|
|
32
|
+
* @returns {boolean} `true` if the item is focused, `false` otherwise.
|
|
33
|
+
*/
|
|
34
|
+
export const selectorIsItemFocused = createSelector([selectorFocusedItemId, (_, itemId) => itemId], (focusedItemId, itemId) => focusedItemId === itemId);
|