@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.
Files changed (37) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/DEV-cjs/core/ComboBox/ComboBox.js +6 -4
  3. package/DEV-cjs/core/Menu/Menu.js +1 -0
  4. package/DEV-cjs/core/Popover/Popover.js +1 -1
  5. package/DEV-cjs/core/Select/Select.js +9 -7
  6. package/DEV-cjs/core/Tree/Tree.js +37 -2
  7. package/DEV-cjs/core/Tree/TreeContext.js +4 -0
  8. package/DEV-cjs/core/Tree/TreeNode.js +6 -1
  9. package/DEV-cjs/styles.js +1 -1
  10. package/DEV-esm/core/ComboBox/ComboBox.js +6 -4
  11. package/DEV-esm/core/Menu/Menu.js +1 -0
  12. package/DEV-esm/core/Popover/Popover.js +1 -1
  13. package/DEV-esm/core/Select/Select.js +9 -7
  14. package/DEV-esm/core/Tree/Tree.js +38 -3
  15. package/DEV-esm/core/Tree/TreeContext.js +1 -0
  16. package/DEV-esm/core/Tree/TreeNode.js +7 -2
  17. package/DEV-esm/styles.js +1 -1
  18. package/cjs/core/ComboBox/ComboBox.js +6 -4
  19. package/cjs/core/Menu/Menu.js +1 -0
  20. package/cjs/core/Popover/Popover.js +1 -1
  21. package/cjs/core/Select/Select.js +9 -7
  22. package/cjs/core/Tree/Tree.js +37 -2
  23. package/cjs/core/Tree/TreeContext.d.ts +5 -0
  24. package/cjs/core/Tree/TreeContext.js +4 -0
  25. package/cjs/core/Tree/TreeNode.js +6 -1
  26. package/cjs/styles.js +1 -1
  27. package/esm/core/ComboBox/ComboBox.js +6 -4
  28. package/esm/core/Menu/Menu.js +1 -0
  29. package/esm/core/Popover/Popover.js +1 -1
  30. package/esm/core/Select/Select.js +9 -7
  31. package/esm/core/Tree/Tree.js +38 -3
  32. package/esm/core/Tree/TreeContext.d.ts +5 -0
  33. package/esm/core/Tree/TreeContext.js +1 -0
  34. package/esm/core/Tree/TreeNode.js +7 -2
  35. package/esm/styles.js +1 -1
  36. package/package.json +1 -1
  37. 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
- handleOptionSelection(option, {
235
- isSelected: true,
236
- });
237
- selectRef.current?.focus();
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,
@@ -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
- React.Fragment,
238
- null,
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>;
@@ -6,3 +6,4 @@ export const useTreeContext = () => {
6
6
  throw new Error('TreeContext must be used within a TreeContext.Provider');
7
7
  return context;
8
8
  };
9
+ export const VirtualizedTreeContext = React.createContext(void 0);
@@ -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
@@ -1,4 +1,4 @@
1
- const t = '3.19.2';
1
+ const t = '3.19.4';
2
2
  const u = new Proxy(
3
3
  {},
4
4
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/itwinui-react",
3
- "version": "3.19.2",
3
+ "version": "3.19.4",
4
4
  "author": "Bentley Systems",
5
5
  "license": "MIT",
6
6
  "type": "module",