@mui/x-tree-view 8.11.3 → 8.13.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 +296 -6
- 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/TreeItemIcon/TreeItemIcon.js +12 -3
- package/TreeItemIcon/TreeItemIcon.types.d.ts +4 -4
- 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/TreeItemIcon/TreeItemIcon.js +12 -3
- package/esm/TreeItemIcon/TreeItemIcon.types.d.ts +4 -4
- package/esm/hooks/useApplyPropagationToSelectedItemsOnMount.js +2 -2
- package/esm/index.js +1 -1
- package/esm/internals/TreeViewProvider/TreeViewStyleContext.d.ts +3 -3
- package/esm/internals/index.d.ts +2 -2
- package/esm/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +5 -5
- package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +1 -1
- package/esm/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +2 -2
- 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/TreeViewProvider/TreeViewStyleContext.d.ts +3 -3
- package/internals/index.d.ts +2 -2
- package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +9 -9
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +4 -4
- package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +2 -2
- 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
|
@@ -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
|
*/
|
|
@@ -2,11 +2,10 @@ import * as React from 'react';
|
|
|
2
2
|
import { DefaultizedProps } from '@mui/x-internals/types';
|
|
3
3
|
import { TreeViewItemMeta, TreeViewPluginSignature } from "../../models/index.js";
|
|
4
4
|
import { TreeViewBaseItem, TreeViewDefaultItemModelProperties, TreeViewItemId } from "../../../models/index.js";
|
|
5
|
-
export type
|
|
5
|
+
export type SetItemChildrenParameters<R> = {
|
|
6
6
|
items: readonly R[];
|
|
7
|
-
parentId
|
|
8
|
-
|
|
9
|
-
getChildrenCount?: (item: R) => number;
|
|
7
|
+
parentId: TreeViewItemId | null;
|
|
8
|
+
getChildrenCount: (item: R) => number;
|
|
10
9
|
};
|
|
11
10
|
export interface UseTreeViewItemsPublicAPI<R extends {}> {
|
|
12
11
|
/**
|
|
@@ -65,30 +64,25 @@ export interface UseTreeViewItemsInstance<R extends {}> extends Pick<UseTreeView
|
|
|
65
64
|
areItemUpdatesPrevented: () => boolean;
|
|
66
65
|
/**
|
|
67
66
|
* Add an array of items to the tree.
|
|
68
|
-
* @param {
|
|
67
|
+
* @param {SetItemChildrenParameters<R>} args The items to add to the tree and information about their ancestors.
|
|
69
68
|
*/
|
|
70
|
-
|
|
69
|
+
setItemChildren: (args: SetItemChildrenParameters<R>) => void;
|
|
71
70
|
/**
|
|
72
71
|
* Remove the children of an item.
|
|
73
|
-
* @param {TreeViewItemId} parentId The id of the item to remove the children of.
|
|
72
|
+
* @param {TreeViewItemId | null} parentId The id of the item to remove the children of.
|
|
74
73
|
*/
|
|
75
|
-
removeChildren: (parentId
|
|
76
|
-
/**
|
|
77
|
-
* Set the loading state of the tree.
|
|
78
|
-
* @param {boolean} loading True if the tree view is loading.
|
|
79
|
-
*/
|
|
80
|
-
setTreeViewLoading: (loading: boolean) => void;
|
|
81
|
-
/**
|
|
82
|
-
* Set the error state of the tree.
|
|
83
|
-
* @param {Error | null} error The error on the tree view.
|
|
84
|
-
*/
|
|
85
|
-
setTreeViewError: (error: Error | null) => void;
|
|
74
|
+
removeChildren: (parentId: TreeViewItemId | null) => void;
|
|
86
75
|
/**
|
|
87
76
|
* Event handler to fire when the `content` slot of a given Tree Item is clicked.
|
|
88
77
|
* @param {React.MouseEvent} event The DOM event that triggered the change.
|
|
89
78
|
* @param {TreeViewItemId} itemId The id of the item being clicked.
|
|
90
79
|
*/
|
|
91
80
|
handleItemClick: (event: React.MouseEvent, itemId: TreeViewItemId) => void;
|
|
81
|
+
/**
|
|
82
|
+
* Mark a list of items as expandable.
|
|
83
|
+
* @param {TreeViewItemId[]} items The ids of the items to mark as expandable.
|
|
84
|
+
*/
|
|
85
|
+
addExpandableItems: (items: TreeViewItemId[]) => void;
|
|
92
86
|
}
|
|
93
87
|
export interface UseTreeViewItemsParameters<R extends {
|
|
94
88
|
children?: R[];
|
|
@@ -186,14 +180,6 @@ export interface UseTreeViewItemsState<R extends {}> {
|
|
|
186
180
|
[itemId: string]: number;
|
|
187
181
|
};
|
|
188
182
|
};
|
|
189
|
-
/**
|
|
190
|
-
* The loading state of the tree.
|
|
191
|
-
*/
|
|
192
|
-
loading: boolean;
|
|
193
|
-
/**
|
|
194
|
-
* The error state of the tree.
|
|
195
|
-
*/
|
|
196
|
-
error: Error | null;
|
|
197
183
|
/**
|
|
198
184
|
* When equal to 'flat', the tree is rendered as a flat list (children are rendered as siblings of their parents).
|
|
199
185
|
* When equal to 'nested', the tree is rendered with nested children (children are rendered inside the groupTransition slot of their children).
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { TreeViewItemId } from "../../../models/index.js";
|
|
1
|
+
import { TreeViewBaseItem, TreeViewItemId } from "../../../models/index.js";
|
|
2
2
|
import { TreeViewItemMeta } from "../../models/index.js";
|
|
3
|
+
import { UseTreeViewItemsParametersWithDefaults, UseTreeViewItemsState } from "./useTreeViewItems.types.js";
|
|
3
4
|
export declare const TREE_VIEW_ROOT_PARENT_ID = "__TREE_VIEW_ROOT_PARENT_ID__";
|
|
4
5
|
export declare const buildSiblingIndexes: (siblings: string[]) => {
|
|
5
6
|
[itemId: string]: number;
|
|
@@ -12,4 +13,37 @@ export declare const buildSiblingIndexes: (siblings: string[]) => {
|
|
|
12
13
|
*/
|
|
13
14
|
export declare const isItemDisabled: (itemMetaLookup: {
|
|
14
15
|
[itemId: string]: TreeViewItemMeta;
|
|
15
|
-
}, itemId: TreeViewItemId) => boolean;
|
|
16
|
+
}, itemId: TreeViewItemId) => boolean;
|
|
17
|
+
type State = UseTreeViewItemsState<any>['items'];
|
|
18
|
+
export declare function buildItemsState(parameters: BuildItemsStateParameters): State;
|
|
19
|
+
interface BuildItemsStateParameters extends Pick<BuildItemsLookupsParameters, 'items' | 'config'> {
|
|
20
|
+
disabledItemsFocusable: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function buildItemsLookups(parameters: BuildItemsLookupsParameters): {
|
|
23
|
+
metaLookup: {
|
|
24
|
+
[itemId: string]: TreeViewItemMeta;
|
|
25
|
+
};
|
|
26
|
+
modelLookup: {
|
|
27
|
+
[itemId: string]: any;
|
|
28
|
+
};
|
|
29
|
+
orderedChildrenIds: string[];
|
|
30
|
+
childrenIndexes: {
|
|
31
|
+
[itemId: string]: number;
|
|
32
|
+
};
|
|
33
|
+
itemsChildren: {
|
|
34
|
+
id: string | null;
|
|
35
|
+
children: TreeViewBaseItem[];
|
|
36
|
+
}[];
|
|
37
|
+
};
|
|
38
|
+
interface BuildItemsLookupsParameters {
|
|
39
|
+
items: readonly TreeViewBaseItem[];
|
|
40
|
+
config: BuildItemsLookupConfig;
|
|
41
|
+
parentId: string | null;
|
|
42
|
+
depth: number;
|
|
43
|
+
isItemExpandable: (item: TreeViewBaseItem, children: TreeViewBaseItem[] | undefined) => boolean;
|
|
44
|
+
otherItemsMetaLookup: {
|
|
45
|
+
[itemId: string]: TreeViewItemMeta;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface BuildItemsLookupConfig extends Pick<UseTreeViewItemsParametersWithDefaults<TreeViewBaseItem>, 'isItemDisabled' | 'getItemLabel' | 'getItemChildren' | 'getItemId'> {}
|
|
49
|
+
export {};
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.TREE_VIEW_ROOT_PARENT_ID = void 0;
|
|
7
|
+
exports.buildItemsLookups = buildItemsLookups;
|
|
8
|
+
exports.buildItemsState = buildItemsState;
|
|
9
|
+
exports.isItemDisabled = exports.buildSiblingIndexes = void 0;
|
|
7
10
|
const TREE_VIEW_ROOT_PARENT_ID = exports.TREE_VIEW_ROOT_PARENT_ID = '__TREE_VIEW_ROOT_PARENT_ID__';
|
|
8
11
|
const buildSiblingIndexes = siblings => {
|
|
9
12
|
const siblingsIndexLookup = {};
|
|
@@ -44,4 +47,118 @@ const isItemDisabled = (itemMetaLookup, itemId) => {
|
|
|
44
47
|
}
|
|
45
48
|
return false;
|
|
46
49
|
};
|
|
47
|
-
exports.isItemDisabled = isItemDisabled;
|
|
50
|
+
exports.isItemDisabled = isItemDisabled;
|
|
51
|
+
function buildItemsState(parameters) {
|
|
52
|
+
const {
|
|
53
|
+
config,
|
|
54
|
+
items: itemsParam,
|
|
55
|
+
disabledItemsFocusable
|
|
56
|
+
} = parameters;
|
|
57
|
+
const itemMetaLookup = {};
|
|
58
|
+
const itemModelLookup = {};
|
|
59
|
+
const itemOrderedChildrenIdsLookup = {};
|
|
60
|
+
const itemChildrenIndexesLookup = {};
|
|
61
|
+
function processSiblings(items, parentId, depth) {
|
|
62
|
+
const parentIdWithDefault = parentId ?? TREE_VIEW_ROOT_PARENT_ID;
|
|
63
|
+
const {
|
|
64
|
+
metaLookup,
|
|
65
|
+
modelLookup,
|
|
66
|
+
orderedChildrenIds,
|
|
67
|
+
childrenIndexes,
|
|
68
|
+
itemsChildren
|
|
69
|
+
} = buildItemsLookups({
|
|
70
|
+
config,
|
|
71
|
+
items,
|
|
72
|
+
parentId,
|
|
73
|
+
depth,
|
|
74
|
+
isItemExpandable: (item, children) => !!children && children.length > 0,
|
|
75
|
+
otherItemsMetaLookup: itemMetaLookup
|
|
76
|
+
});
|
|
77
|
+
Object.assign(itemMetaLookup, metaLookup);
|
|
78
|
+
Object.assign(itemModelLookup, modelLookup);
|
|
79
|
+
itemOrderedChildrenIdsLookup[parentIdWithDefault] = orderedChildrenIds;
|
|
80
|
+
itemChildrenIndexesLookup[parentIdWithDefault] = childrenIndexes;
|
|
81
|
+
for (const item of itemsChildren) {
|
|
82
|
+
processSiblings(item.children || [], item.id, depth + 1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
processSiblings(itemsParam, null, 0);
|
|
86
|
+
return {
|
|
87
|
+
disabledItemsFocusable,
|
|
88
|
+
itemMetaLookup,
|
|
89
|
+
itemModelLookup,
|
|
90
|
+
itemOrderedChildrenIdsLookup,
|
|
91
|
+
itemChildrenIndexesLookup,
|
|
92
|
+
domStructure: 'nested'
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function buildItemsLookups(parameters) {
|
|
96
|
+
const {
|
|
97
|
+
config,
|
|
98
|
+
items,
|
|
99
|
+
parentId,
|
|
100
|
+
depth,
|
|
101
|
+
isItemExpandable,
|
|
102
|
+
otherItemsMetaLookup
|
|
103
|
+
} = parameters;
|
|
104
|
+
const metaLookup = {};
|
|
105
|
+
const modelLookup = {};
|
|
106
|
+
const orderedChildrenIds = [];
|
|
107
|
+
const itemsChildren = [];
|
|
108
|
+
const processItem = item => {
|
|
109
|
+
const id = config.getItemId ? config.getItemId(item) : item.id;
|
|
110
|
+
checkId({
|
|
111
|
+
id,
|
|
112
|
+
parentId,
|
|
113
|
+
item,
|
|
114
|
+
itemMetaLookup: otherItemsMetaLookup,
|
|
115
|
+
siblingsMetaLookup: metaLookup
|
|
116
|
+
});
|
|
117
|
+
const label = config.getItemLabel ? config.getItemLabel(item) : item.label;
|
|
118
|
+
if (label == null) {
|
|
119
|
+
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'));
|
|
120
|
+
}
|
|
121
|
+
const children = (config.getItemChildren ? config.getItemChildren(item) : item.children) || [];
|
|
122
|
+
itemsChildren.push({
|
|
123
|
+
id,
|
|
124
|
+
children
|
|
125
|
+
});
|
|
126
|
+
modelLookup[id] = item;
|
|
127
|
+
metaLookup[id] = {
|
|
128
|
+
id,
|
|
129
|
+
label,
|
|
130
|
+
parentId,
|
|
131
|
+
idAttribute: undefined,
|
|
132
|
+
expandable: isItemExpandable(item, children),
|
|
133
|
+
disabled: config.isItemDisabled ? config.isItemDisabled(item) : false,
|
|
134
|
+
depth
|
|
135
|
+
};
|
|
136
|
+
orderedChildrenIds.push(id);
|
|
137
|
+
};
|
|
138
|
+
for (const item of items) {
|
|
139
|
+
processItem(item);
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
metaLookup,
|
|
143
|
+
modelLookup,
|
|
144
|
+
orderedChildrenIds,
|
|
145
|
+
childrenIndexes: buildSiblingIndexes(orderedChildrenIds),
|
|
146
|
+
itemsChildren
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function checkId({
|
|
150
|
+
id,
|
|
151
|
+
parentId,
|
|
152
|
+
item,
|
|
153
|
+
itemMetaLookup,
|
|
154
|
+
siblingsMetaLookup
|
|
155
|
+
}) {
|
|
156
|
+
if (id == null) {
|
|
157
|
+
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'));
|
|
158
|
+
}
|
|
159
|
+
if (siblingsMetaLookup[id] != null ||
|
|
160
|
+
// Ignore items with the same parent id, because it's the same item from the previous generation.
|
|
161
|
+
itemMetaLookup[id] != null && itemMetaLookup[id].parentId !== parentId) {
|
|
162
|
+
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'));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -10,9 +10,9 @@ exports.useTreeViewJSXItems = void 0;
|
|
|
10
10
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
11
11
|
var React = _interopRequireWildcard(require("react"));
|
|
12
12
|
var _store = require("@mui/x-internals/store");
|
|
13
|
-
var _useEventCallback =
|
|
14
|
-
var
|
|
15
|
-
var
|
|
13
|
+
var _useEventCallback = require("@base-ui-components/utils/useEventCallback");
|
|
14
|
+
var _useMergedRefs = require("@base-ui-components/utils/useMergedRefs");
|
|
15
|
+
var _useIsoLayoutEffect = require("@base-ui-components/utils/useIsoLayoutEffect");
|
|
16
16
|
var _TreeViewProvider = require("../../TreeViewProvider");
|
|
17
17
|
var _TreeViewChildrenItemProvider = require("../../TreeViewProvider/TreeViewChildrenItemProvider");
|
|
18
18
|
var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.utils");
|
|
@@ -26,7 +26,7 @@ const useTreeViewJSXItems = ({
|
|
|
26
26
|
store
|
|
27
27
|
}) => {
|
|
28
28
|
instance.preventItemUpdates();
|
|
29
|
-
const insertJSXItem = (0, _useEventCallback.
|
|
29
|
+
const insertJSXItem = (0, _useEventCallback.useEventCallback)(item => {
|
|
30
30
|
if (store.state.items.itemMetaLookup[item.id] != null) {
|
|
31
31
|
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'));
|
|
32
32
|
}
|
|
@@ -64,7 +64,7 @@ const useTreeViewJSXItems = ({
|
|
|
64
64
|
})
|
|
65
65
|
}));
|
|
66
66
|
};
|
|
67
|
-
const mapFirstCharFromJSX = (0, _useEventCallback.
|
|
67
|
+
const mapFirstCharFromJSX = (0, _useEventCallback.useEventCallback)((itemId, firstChar) => {
|
|
68
68
|
instance.updateFirstCharMap(firstCharMap => {
|
|
69
69
|
firstCharMap[itemId] = firstChar;
|
|
70
70
|
return firstCharMap;
|
|
@@ -113,11 +113,11 @@ const useTreeViewJSXItemsItemPlugin = ({
|
|
|
113
113
|
} = parentContext;
|
|
114
114
|
const expandable = (0, _useTreeItemUtils.itemHasChildren)(children);
|
|
115
115
|
const pluginContentRef = React.useRef(null);
|
|
116
|
-
const handleContentRef = (0,
|
|
116
|
+
const handleContentRef = (0, _useMergedRefs.useMergedRefs)(pluginContentRef, contentRef);
|
|
117
117
|
const treeId = (0, _store.useStore)(store, _useTreeViewId2.idSelectors.treeId);
|
|
118
118
|
|
|
119
119
|
// Prevent any flashing
|
|
120
|
-
(0,
|
|
120
|
+
(0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
|
|
121
121
|
const idAttribute = (0, _useTreeViewId.generateTreeItemIdAttribute)({
|
|
122
122
|
itemId,
|
|
123
123
|
treeId,
|
|
@@ -129,7 +129,7 @@ const useTreeViewJSXItemsItemPlugin = ({
|
|
|
129
129
|
unregisterChild(idAttribute);
|
|
130
130
|
};
|
|
131
131
|
}, [store, instance, registerChild, unregisterChild, itemId, id, treeId]);
|
|
132
|
-
(0,
|
|
132
|
+
(0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
|
|
133
133
|
return instance.insertJSXItem({
|
|
134
134
|
id: itemId,
|
|
135
135
|
idAttribute: id,
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
'use client';
|
|
3
3
|
|
|
4
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
4
|
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
6
5
|
Object.defineProperty(exports, "__esModule", {
|
|
7
6
|
value: true
|
|
@@ -10,7 +9,7 @@ exports.useTreeViewKeyboardNavigation = void 0;
|
|
|
10
9
|
var React = _interopRequireWildcard(require("react"));
|
|
11
10
|
var _store = require("@mui/x-internals/store");
|
|
12
11
|
var _RtlProvider = require("@mui/system/RtlProvider");
|
|
13
|
-
var _useEventCallback =
|
|
12
|
+
var _useEventCallback = require("@base-ui-components/utils/useEventCallback");
|
|
14
13
|
var _tree = require("../../utils/tree");
|
|
15
14
|
var _plugins = require("../../utils/plugins");
|
|
16
15
|
var _useTreeViewLabel = require("../useTreeViewLabel");
|
|
@@ -28,7 +27,7 @@ const useTreeViewKeyboardNavigation = ({
|
|
|
28
27
|
}) => {
|
|
29
28
|
const isRtl = (0, _RtlProvider.useRtl)();
|
|
30
29
|
const firstCharMap = React.useRef({});
|
|
31
|
-
const updateFirstCharMap = (0, _useEventCallback.
|
|
30
|
+
const updateFirstCharMap = (0, _useEventCallback.useEventCallback)(callback => {
|
|
32
31
|
firstCharMap.current = callback(firstCharMap.current);
|
|
33
32
|
});
|
|
34
33
|
const itemMetaLookup = (0, _store.useStore)(store, _useTreeViewItems.itemsSelectors.itemMetaLookup);
|