@itwin/itwinui-react 3.19.2 → 3.19.4
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 +16 -0
- package/DEV-cjs/core/ComboBox/ComboBox.js +6 -4
- package/DEV-cjs/core/Menu/Menu.js +1 -0
- package/DEV-cjs/core/Popover/Popover.js +1 -1
- package/DEV-cjs/core/Select/Select.js +9 -7
- package/DEV-cjs/core/Tree/Tree.js +37 -2
- package/DEV-cjs/core/Tree/TreeContext.js +4 -0
- package/DEV-cjs/core/Tree/TreeNode.js +6 -1
- package/DEV-cjs/styles.js +1 -1
- package/DEV-esm/core/ComboBox/ComboBox.js +6 -4
- package/DEV-esm/core/Menu/Menu.js +1 -0
- package/DEV-esm/core/Popover/Popover.js +1 -1
- package/DEV-esm/core/Select/Select.js +9 -7
- package/DEV-esm/core/Tree/Tree.js +38 -3
- package/DEV-esm/core/Tree/TreeContext.js +1 -0
- package/DEV-esm/core/Tree/TreeNode.js +7 -2
- package/DEV-esm/styles.js +1 -1
- package/cjs/core/ComboBox/ComboBox.js +6 -4
- package/cjs/core/Menu/Menu.js +1 -0
- package/cjs/core/Popover/Popover.js +1 -1
- package/cjs/core/Select/Select.js +9 -7
- package/cjs/core/Tree/Tree.js +37 -2
- package/cjs/core/Tree/TreeContext.d.ts +5 -0
- package/cjs/core/Tree/TreeContext.js +4 -0
- package/cjs/core/Tree/TreeNode.js +6 -1
- package/cjs/styles.js +1 -1
- package/esm/core/ComboBox/ComboBox.js +6 -4
- package/esm/core/Menu/Menu.js +1 -0
- package/esm/core/Popover/Popover.js +1 -1
- package/esm/core/Select/Select.js +9 -7
- package/esm/core/Tree/Tree.js +38 -3
- package/esm/core/Tree/TreeContext.d.ts +5 -0
- package/esm/core/Tree/TreeContext.js +1 -0
- package/esm/core/Tree/TreeNode.js +7 -2
- package/esm/styles.js +1 -1
- package/package.json +1 -1
- package/styles.css +10 -10
|
@@ -230,14 +230,16 @@ let CustomSelect = React.forwardRef((props, forwardedRef) => {
|
|
|
230
230
|
React.createElement(SelectTag, {
|
|
231
231
|
key: option.label,
|
|
232
232
|
label: option.label,
|
|
233
|
-
onRemove:
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
233
|
+
onRemove: disabled
|
|
234
|
+
? void 0
|
|
235
|
+
: () => {
|
|
236
|
+
handleOptionSelection(option, {
|
|
237
|
+
isSelected: true,
|
|
238
|
+
});
|
|
239
|
+
selectRef.current?.focus();
|
|
240
|
+
},
|
|
239
241
|
}),
|
|
240
|
-
[handleOptionSelection],
|
|
242
|
+
[disabled, handleOptionSelection],
|
|
241
243
|
);
|
|
242
244
|
let popover = usePopover({
|
|
243
245
|
visible: isOpen,
|
package/esm/core/Tree/Tree.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
useMergedRefs,
|
|
9
9
|
useLayoutEffect,
|
|
10
10
|
} from '../../utils/index.js';
|
|
11
|
-
import { TreeContext } from './TreeContext.js';
|
|
11
|
+
import { TreeContext, VirtualizedTreeContext } from './TreeContext.js';
|
|
12
12
|
export const Tree = (props) => {
|
|
13
13
|
let {
|
|
14
14
|
data,
|
|
@@ -191,15 +191,32 @@ let TreeElement = polymorphic.div('iui-tree', {
|
|
|
191
191
|
let VirtualizedTree = React.forwardRef(
|
|
192
192
|
({ flatNodesList, itemRenderer, scrollToIndex, ...rest }, ref) => {
|
|
193
193
|
let parentRef = React.useRef(null);
|
|
194
|
+
let virtualizerRootRef = React.useRef(null);
|
|
194
195
|
let getItemKey = React.useCallback(
|
|
195
196
|
(index) => flatNodesList[index].nodeProps.nodeId,
|
|
196
197
|
[flatNodesList],
|
|
197
198
|
);
|
|
199
|
+
let onVirtualizerChange = React.useMemo(
|
|
200
|
+
() =>
|
|
201
|
+
debounce((virtualizer) => {
|
|
202
|
+
if (!virtualizer || !virtualizerRootRef.current) return;
|
|
203
|
+
virtualizerRootRef.current.style.width = '';
|
|
204
|
+
let widestNodeWidth = 0;
|
|
205
|
+
virtualizer.elementsCache.forEach((el) => {
|
|
206
|
+
if (el.clientWidth > widestNodeWidth)
|
|
207
|
+
widestNodeWidth = el.clientWidth;
|
|
208
|
+
});
|
|
209
|
+
if (widestNodeWidth)
|
|
210
|
+
virtualizerRootRef.current.style.width = `${widestNodeWidth}px`;
|
|
211
|
+
}, 100),
|
|
212
|
+
[],
|
|
213
|
+
);
|
|
198
214
|
let { virtualizer, css: virtualizerCss } = useVirtualScroll({
|
|
199
215
|
count: flatNodesList.length,
|
|
200
216
|
getScrollElement: () => parentRef.current,
|
|
201
217
|
estimateSize: () => 39,
|
|
202
218
|
getItemKey,
|
|
219
|
+
onChange: onVirtualizerChange,
|
|
203
220
|
});
|
|
204
221
|
useLayoutEffect(() => {
|
|
205
222
|
if (scrollToIndex) virtualizer.scrollToIndex(scrollToIndex);
|
|
@@ -229,13 +246,22 @@ let VirtualizedTree = React.forwardRef(
|
|
|
229
246
|
style: {
|
|
230
247
|
minBlockSize: virtualizer.getTotalSize(),
|
|
231
248
|
},
|
|
249
|
+
ref: virtualizerRootRef,
|
|
232
250
|
},
|
|
233
251
|
React.createElement('slot', null),
|
|
234
252
|
),
|
|
235
253
|
),
|
|
236
254
|
React.createElement(
|
|
237
|
-
|
|
238
|
-
|
|
255
|
+
VirtualizedTreeContext.Provider,
|
|
256
|
+
{
|
|
257
|
+
value: React.useMemo(
|
|
258
|
+
() => ({
|
|
259
|
+
virtualizer,
|
|
260
|
+
onVirtualizerChange,
|
|
261
|
+
}),
|
|
262
|
+
[virtualizer, onVirtualizerChange],
|
|
263
|
+
),
|
|
264
|
+
},
|
|
239
265
|
virtualizer
|
|
240
266
|
.getVirtualItems()
|
|
241
267
|
.map((virtualItem) =>
|
|
@@ -246,3 +272,12 @@ let VirtualizedTree = React.forwardRef(
|
|
|
246
272
|
);
|
|
247
273
|
},
|
|
248
274
|
);
|
|
275
|
+
function debounce(callback, delay) {
|
|
276
|
+
let timeoutId;
|
|
277
|
+
return (...args) => {
|
|
278
|
+
if (timeoutId) window.clearTimeout(timeoutId);
|
|
279
|
+
timeoutId = window.setTimeout(() => {
|
|
280
|
+
callback(...args);
|
|
281
|
+
}, delay);
|
|
282
|
+
};
|
|
283
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
import type { Virtualizer } from '@tanstack/react-virtual';
|
|
2
3
|
export type TreeContextProps = {
|
|
3
4
|
/**
|
|
4
5
|
* Depth of the node.
|
|
@@ -31,3 +32,7 @@ export type TreeContextProps = {
|
|
|
31
32
|
};
|
|
32
33
|
export declare const TreeContext: React.Context<TreeContextProps | undefined>;
|
|
33
34
|
export declare const useTreeContext: () => TreeContextProps;
|
|
35
|
+
export declare const VirtualizedTreeContext: React.Context<{
|
|
36
|
+
virtualizer?: Virtualizer<Element, Element>;
|
|
37
|
+
onVirtualizerChange?: (virtualizer?: Virtualizer<Element, Element>) => void;
|
|
38
|
+
} | undefined>;
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from '../../utils/index.js';
|
|
8
8
|
import cx from 'classnames';
|
|
9
9
|
import { TreeNodeExpander } from './TreeNodeExpander.js';
|
|
10
|
-
import { useTreeContext } from './TreeContext.js';
|
|
10
|
+
import { useTreeContext, VirtualizedTreeContext } from './TreeContext.js';
|
|
11
11
|
export const TreeNode = React.forwardRef((props, forwardedRef) => {
|
|
12
12
|
let {
|
|
13
13
|
nodeId,
|
|
@@ -43,6 +43,8 @@ export const TreeNode = React.forwardRef((props, forwardedRef) => {
|
|
|
43
43
|
groupSize,
|
|
44
44
|
indexInGroup,
|
|
45
45
|
} = useTreeContext();
|
|
46
|
+
let { virtualizer, onVirtualizerChange } =
|
|
47
|
+
React.useContext(VirtualizedTreeContext) ?? {};
|
|
46
48
|
let [isFocused, setIsFocused] = React.useState(false);
|
|
47
49
|
let nodeRef = React.useRef(null);
|
|
48
50
|
let onKeyDown = (event) => {
|
|
@@ -55,6 +57,7 @@ export const TreeNode = React.forwardRef((props, forwardedRef) => {
|
|
|
55
57
|
if (isNodeFocused) {
|
|
56
58
|
if (isExpanded) {
|
|
57
59
|
onExpanded(nodeId, false);
|
|
60
|
+
onVirtualizerChange?.(virtualizer);
|
|
58
61
|
break;
|
|
59
62
|
}
|
|
60
63
|
if (parentNodeId) scrollToParent?.();
|
|
@@ -74,6 +77,7 @@ export const TreeNode = React.forwardRef((props, forwardedRef) => {
|
|
|
74
77
|
if (isNodeFocused) {
|
|
75
78
|
if (!isExpanded && hasSubNodes) {
|
|
76
79
|
onExpanded(nodeId, true);
|
|
80
|
+
onVirtualizerChange?.(virtualizer);
|
|
77
81
|
break;
|
|
78
82
|
}
|
|
79
83
|
focusableElements[0]?.focus();
|
|
@@ -100,9 +104,10 @@ export const TreeNode = React.forwardRef((props, forwardedRef) => {
|
|
|
100
104
|
let onExpanderClick = React.useCallback(
|
|
101
105
|
(event) => {
|
|
102
106
|
onExpanded(nodeId, !isExpanded);
|
|
107
|
+
onVirtualizerChange?.(virtualizer);
|
|
103
108
|
event.stopPropagation();
|
|
104
109
|
},
|
|
105
|
-
[isExpanded, nodeId, onExpanded],
|
|
110
|
+
[isExpanded, nodeId, onExpanded, onVirtualizerChange, virtualizer],
|
|
106
111
|
);
|
|
107
112
|
return React.createElement(
|
|
108
113
|
Box,
|
package/esm/styles.js
CHANGED