@mui/x-tree-view 7.2.0 → 7.3.1

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 (65) hide show
  1. package/CHANGELOG.md +204 -2
  2. package/TreeItem/TreeItem.js +1 -2
  3. package/TreeItem/TreeItemContent.js +1 -2
  4. package/TreeItem/useTreeItemState.js +1 -3
  5. package/TreeItem2/TreeItem2.js +1 -2
  6. package/hooks/useTreeItem2Utils/useTreeItem2Utils.js +1 -3
  7. package/index.js +1 -1
  8. package/internals/TreeViewProvider/useTreeViewContext.d.ts +1 -1
  9. package/internals/hooks/useInstanceEventHandler.d.ts +2 -2
  10. package/internals/models/treeView.d.ts +0 -6
  11. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +6 -5
  12. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +7 -7
  13. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +31 -63
  14. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +82 -94
  15. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +32 -5
  16. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +9 -0
  17. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +21 -0
  18. package/internals/useTreeView/useTreeView.types.d.ts +1 -1
  19. package/internals/useTreeView/useTreeViewModels.d.ts +1 -1
  20. package/internals/utils/extractPluginParamsFromProps.d.ts +1 -1
  21. package/internals/utils/publishTreeViewEvent.d.ts +1 -1
  22. package/internals/utils/tree.d.ts +17 -1
  23. package/internals/utils/tree.js +34 -4
  24. package/modern/TreeItem/TreeItem.js +1 -2
  25. package/modern/TreeItem/TreeItemContent.js +1 -2
  26. package/modern/TreeItem/useTreeItemState.js +1 -3
  27. package/modern/TreeItem2/TreeItem2.js +1 -2
  28. package/modern/hooks/useTreeItem2Utils/useTreeItem2Utils.js +1 -3
  29. package/modern/index.js +1 -1
  30. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +6 -5
  31. package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +7 -7
  32. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +31 -63
  33. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +82 -94
  34. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +21 -0
  35. package/modern/internals/utils/tree.js +34 -4
  36. package/node/RichTreeView/RichTreeView.js +1 -1
  37. package/node/SimpleTreeView/SimpleTreeView.js +1 -1
  38. package/node/TreeItem/TreeItem.js +1 -1
  39. package/node/TreeItem/TreeItemContent.js +1 -1
  40. package/node/TreeItem/useTreeItemState.js +1 -3
  41. package/node/TreeItem2/TreeItem2.js +1 -1
  42. package/node/TreeItem2Icon/TreeItem2Icon.js +1 -1
  43. package/node/TreeView/TreeView.js +1 -1
  44. package/node/hooks/useTreeItem2Utils/useTreeItem2Utils.js +1 -3
  45. package/node/hooks/useTreeViewApiRef.js +1 -1
  46. package/node/icons/icons.js +1 -1
  47. package/node/index.js +1 -1
  48. package/node/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +1 -1
  49. package/node/internals/TreeViewProvider/TreeViewContext.js +1 -1
  50. package/node/internals/TreeViewProvider/TreeViewProvider.js +1 -1
  51. package/node/internals/TreeViewProvider/useTreeViewContext.js +1 -1
  52. package/node/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.js +1 -1
  53. package/node/internals/hooks/useInstanceEventHandler.js +1 -1
  54. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +1 -1
  55. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +7 -6
  56. package/node/internals/plugins/useTreeViewId/useTreeViewId.js +1 -1
  57. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +1 -1
  58. package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +8 -8
  59. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +32 -64
  60. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +82 -94
  61. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +29 -0
  62. package/node/internals/useTreeView/useTreeView.js +1 -1
  63. package/node/internals/useTreeView/useTreeViewModels.js +1 -1
  64. package/node/internals/utils/tree.js +37 -5
  65. package/package.json +3 -5
package/CHANGELOG.md CHANGED
@@ -3,6 +3,158 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## 7.3.1
7
+
8
+ _Apr 26, 2024_
9
+
10
+ We'd like to offer a big thanks to the 13 contributors who made this release possible. Here are some highlights ✨:
11
+
12
+ - 🎁 Scatter Charts get a [z-axis to allow coloring data points independently from their coordinates](https://mui.com/x/react-charts/scatter/#color-scale)
13
+ - 🌍 Improve Catalan (ca-ES) and Spanish (es-ES) locales on the Date and Time Pickers
14
+ - 🐞 Bugfixes
15
+ - 📚 Documentation improvements
16
+
17
+ ### Data Grid
18
+
19
+ #### `@mui/x-data-grid@7.3.1`
20
+
21
+ - [DataGrid] Fix date filtering for negative timezone offsets (#12836) @cherniavskii
22
+ - [DataGrid] Fix flex column width when used with pinned columns (#12849) @romgrk
23
+ - [DataGrid] Fix group header resize (#12863) @arminmeh
24
+ - [DataGrid] Pass slot props to `columnHeaders` slot (#12768) @cherniavskii
25
+
26
+ #### `@mui/x-data-grid-pro@7.3.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
27
+
28
+ Same changes as in `@mui/x-data-grid@7.3.1`.
29
+
30
+ #### `@mui/x-data-grid-premium@7.3.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
31
+
32
+ Same changes as in `@mui/x-data-grid-pro@7.3.1`.
33
+
34
+ ### Date and Time Pickers
35
+
36
+ #### `@mui/x-date-pickers@7.3.1`
37
+
38
+ - [l10n] Improve Catalan (ca-ES) locale (#12856) @soler1212
39
+ - [l10n] Improve Spanish (es-ES) locale (#12858) @soler1212
40
+
41
+ #### `@mui/x-date-pickers-pro@7.3.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
42
+
43
+ Same changes as in `@mui/x-date-pickers@7.3.1`.
44
+
45
+ ### Charts
46
+
47
+ #### `@mui/x-charts@7.3.1`
48
+
49
+ - [charts] Add documentation on border radius alternative for `BarCharts` (#12859) @JCQuintas
50
+ - [charts] Add z-axis to colorize scatter charts (#12738) @alexfauquette
51
+ - [charts] Fix left/bottomAxis not picking up default axis id (#12894) @JCQuintas
52
+ - [charts] Improve default tooltip content (#12257) @oliviertassinari
53
+ - [charts] Round y values for bar chart (#12846) @alexfauquette
54
+
55
+ ### Tree View
56
+
57
+ #### `@mui/x-tree-view@7.3.1`
58
+
59
+ - [TreeView] Remove un-needed `aria-activedescendant` attribute (#12867) @flaviendelangle
60
+ - [TreeView] Rework the selection internals (#12703) @flaviendelangle
61
+ - [TreeView] Use the order in which the items are displayed for `type-ahead` (#12827) @flaviendelangle
62
+
63
+ ### Docs
64
+
65
+ - [docs] Add demo for styling charts with `sx` props (#12791) @derek-0000
66
+ - [docs] Cover webpack 4 support in migration guide (#12710) @cherniavskii
67
+ - [docs] Document interfaces for charts (#12656) @alexfauquette
68
+ - [docs] Fix Vale regression (#12862) @oliviertassinari
69
+ - [docs] Improve Data Grid migration guide (#12879) @MBilalShafi
70
+ - [docs] Update Column features availability (#12865) @DanailH
71
+
72
+ ### Core
73
+
74
+ - [core] Fix `l10n` GH workflow (#12895) @LukasTy
75
+ - [core] Match Base UI and Toolpad @oliviertassinari
76
+ - [core] Remove redundant `setupFiles` entries in `package.json` (#12899) @LukasTy
77
+ - [core] Use `describeTreeView` for focus tests (#12698) @flaviendelangle
78
+ - [core] Use `describeTreeView` for type-ahead tests (#12811) @flaviendelangle
79
+ - [code-infra] Change package manager to `pnpm` (#11875) @LukasTy
80
+ - [code-infra] Closer sync with eslint config of codebase (#12864) @oliviertassinari
81
+ - [support-infra] Add release announcement to GitHub workflows (#11867) (#12843) @michelengelen
82
+
83
+ ## 7.3.0
84
+
85
+ _Apr 18, 2024_
86
+
87
+ We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨:
88
+
89
+ - 📄 Support [unknown and estimated row count in server-side pagination](https://mui.com/x/react-data-grid/pagination/#index-based-pagination) (#12490) @MBilalShafi
90
+ - 🎨 Support color scales in Charts (#12490) @alexfauquette
91
+ Add a [`colorMap` configuration](https://mui.com/x/react-charts/styling/#values-color) to an axis, and the chart will use it to select colors.
92
+ Each impacted chart ([bar charts](https://mui.com/x/react-charts/bars/#color-scale), [line charts](https://mui.com/x/react-charts/lines/#color-scale), [scatter charts](https://mui.com/x/react-charts/scatter/#color-scale)) has a dedicated section explaining how this color map is impacting it.
93
+
94
+ <img src="https://github.com/mui/mui-x/assets/45398769/f0066606-3486-4c4e-b3be-7fdd56d763c3" alt="scatter chart with gradient along y-axis" />
95
+
96
+ - 🌍 Improve Danish (da-DK) locale on the Data Grid
97
+ - 🐞 Bugfixes
98
+ - 📚 Documentation improvements
99
+
100
+ ### Data Grid
101
+
102
+ #### `@mui/x-data-grid@7.3.0`
103
+
104
+ - [DataGrid] Fix calling `onCellEditStop` on error (#12747) @sai6855
105
+ - [DataGrid] Fix column resize (#12792) @romgrk
106
+ - [DataGrid] Fix column separators (#12808) @romgrk
107
+ - [DataGrid] Limit panel width to not exceed screen width (#12799) @cherniavskii
108
+ - [DataGrid] Support advanced server-side pagination use cases (#12474) @MBilalShafi
109
+ - [DataGrid] Support state export and restore on grid density (#12671) @MBilalShafi
110
+ - [l10n] Improve Danish (da-DK) locale (#12784) @EmilBahnsen
111
+
112
+ #### `@mui/x-data-grid-pro@7.3.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
113
+
114
+ Same changes as in `@mui/x-data-grid@7.3.0`, plus:
115
+
116
+ - [DataGridPro] Implement header filter height (#12666) @romgrk
117
+
118
+ #### `@mui/x-data-grid-premium@7.3.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
119
+
120
+ Same changes as in `@mui/x-data-grid-pro@7.3.0`.
121
+
122
+ ### Charts
123
+
124
+ #### Breaking change
125
+
126
+ A typo fix:
127
+
128
+ ```diff
129
+ - ContinuouseScaleName
130
+ + ContinuousScaleName
131
+ ```
132
+
133
+ #### `@mui/x-charts@7.3.0`
134
+
135
+ - [charts] Add `dataIndex` to series `valueFormatter` (#12745) @JCQuintas
136
+ - [charts] Add color scale (#12490) @alexfauquette
137
+ - [charts] Do not document the usage of `DEFAULT_X_AXIS_KEY` and `DEFAULT_Y_AXIS_KEY` (#12780) @alexfauquette
138
+ - [charts] Export more utils (#12744) @alexfauquette
139
+ - [charts] Fix passing slot props down to `PieArcLabel` (#12806) @JCQuintas
140
+
141
+ ### Tree View
142
+
143
+ #### `@mui/x-tree-view@7.3.0`
144
+
145
+ - [TreeView] Support `defaultMuiPrevented` on the `onFocus` prop of the root slot (#12813) @flaviendelangle
146
+
147
+ ### Docs
148
+
149
+ - [docs] Add grid cell display example to the migration guide (#12793) @romgrk
150
+ - [docs] Use charts classes objects (#12781) @alexfauquette
151
+ - [docs] Fix layout shift on demos (#12816) @zanivan
152
+ - [test] Increase timeout for test that sometimes fail on `DateTimeRangePicker` (#12786) @LukasTy
153
+
154
+ ### Core
155
+
156
+ - [docs-infra] Prepare infra to document charts interfaces (#12653) @alexfauquette
157
+
6
158
  ## 7.2.0
7
159
 
8
160
  _Apr 12, 2024_
@@ -168,7 +320,7 @@ Same changes as in `@mui/x-date-pickers@7.1.1`, plus:
168
320
  - [docs] Fix type arguments in Custom Field page (#12619) @Juneezee
169
321
  - [docs] Fix typo in `getItemId` prop description (#12637) @flaviendelangle
170
322
  - [docs] Make the Charts `margin` usage more visible (#12591) @alexfauquette
171
- - [docs] Match IE 11 spacing with Material UI @oliviertassinari
323
+ - [docs] Match IE 11 spacing with Material UI @oliviertassinari
172
324
  - [docs] Move data grid interfaces to standard API page layout (#12016) @alexfauquette
173
325
  - [docs] Remove ` around @default values (#12158) @alexfauquette
174
326
  - [docs] Remove `day` from the default `dayOfWeekFormatter` function params (#12644) @LukasTy
@@ -431,7 +583,7 @@ Same changes as in `@mui/x-date-pickers@7.0.0`, plus:
431
583
  - [docs] Update links to v6 (#12496) @cherniavskii
432
584
  - [docs] Update links to v7 docs (#12500) @noraleonte
433
585
  - [docs] Update supported versions (#12508) @joserodolfofreitas
434
- - [docs] Update "What's new in MUI X" page #12527 @cherniavskii
586
+ - [docs] Update "What's new in MUI X" page #12527 @cherniavskii
435
587
 
436
588
  ### Core
437
589
 
@@ -3058,6 +3210,56 @@ Here is an example of the renaming for the `<ChartsTooltip />` component.
3058
3210
  - [core] Update release instructions as per v7 configuration (#10962) @MBilalShafi
3059
3211
  - [license] Correctly throw errors (#10924) @oliviertassinari
3060
3212
 
3213
+ ## 6.19.11
3214
+
3215
+ _Apr 18, 2024_
3216
+
3217
+ We'd like to offer a big thanks to the 1 contributor who made this release possible. Here are some highlights ✨:
3218
+
3219
+ - 🐞 Bugfixes
3220
+
3221
+ ### Data Grid
3222
+
3223
+ #### `@mui/x-data-grid@6.19.11`
3224
+
3225
+ - [DataGrid] Fix virtualization memory leak (#12812) @romgrk
3226
+
3227
+ #### `@mui/x-data-grid-pro@6.19.11` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
3228
+
3229
+ Same changes as in `@mui/x-data-grid@6.19.11`.
3230
+
3231
+ #### `@mui/x-data-grid-premium@6.19.11` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
3232
+
3233
+ Same changes as in `@mui/x-data-grid-pro@6.19.11`.
3234
+
3235
+ ## 6.19.10
3236
+
3237
+ _Apr 12, 2024_
3238
+
3239
+ We'd like to offer a big thanks to the 2 contributors who made this release possible. Here are some highlights ✨:
3240
+
3241
+ - 🐞 Bugfixes
3242
+ - 📚 Documentation improvements
3243
+
3244
+ ### Data Grid
3245
+
3246
+ #### `@mui/x-data-grid@6.19.10`
3247
+
3248
+ - [DataGrid] Do not escape double quotes when copying to clipboard (#12734) @cherniavskii
3249
+ - [DataGrid] Fix bug in suspense (#12754) @cherniavskii
3250
+
3251
+ #### `@mui/x-data-grid-pro@6.19.10` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
3252
+
3253
+ Same changes as in `@mui/x-data-grid@6.19.10`.
3254
+
3255
+ #### `@mui/x-data-grid-premium@6.19.10` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
3256
+
3257
+ Same changes as in `@mui/x-data-grid-pro@6.19.10`.
3258
+
3259
+ ### Core
3260
+
3261
+ - [core] Update the docs release source branch (#12685) @LukasTy
3262
+
3061
3263
  ## 6.19.9
3062
3264
 
3063
3265
  _Apr 5, 2024_
@@ -19,8 +19,7 @@ import { treeItemClasses, getTreeItemUtilityClass } from './treeItemClasses';
19
19
  import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext';
20
20
  import { TreeViewCollapseIcon, TreeViewExpandIcon } from '../icons';
21
21
  import { TreeItem2Provider } from '../TreeItem2Provider';
22
- import { jsx as _jsx } from "react/jsx-runtime";
23
- import { jsxs as _jsxs } from "react/jsx-runtime";
22
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
24
23
  const useUtilityClasses = ownerState => {
25
24
  const {
26
25
  classes
@@ -5,8 +5,7 @@ import * as React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import clsx from 'clsx';
7
7
  import { useTreeItemState } from './useTreeItemState';
8
- import { jsx as _jsx } from "react/jsx-runtime";
9
- import { jsxs as _jsxs } from "react/jsx-runtime";
8
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
9
  /**
11
10
  * @ignore - internal component.
12
11
  */
@@ -32,9 +32,7 @@ export function useTreeItemState(itemId) {
32
32
  const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
33
33
  if (multiple) {
34
34
  if (event.shiftKey) {
35
- instance.selectRange(event, {
36
- end: itemId
37
- });
35
+ instance.expandSelectionRange(event, itemId);
38
36
  } else {
39
37
  instance.selectItem(event, itemId, true);
40
38
  }
@@ -14,8 +14,7 @@ import { unstable_useTreeItem2 as useTreeItem2 } from '../useTreeItem2';
14
14
  import { getTreeItemUtilityClass, treeItemClasses } from '../TreeItem';
15
15
  import { TreeItem2Icon } from '../TreeItem2Icon';
16
16
  import { TreeItem2Provider } from '../TreeItem2Provider';
17
- import { jsx as _jsx } from "react/jsx-runtime";
18
- import { jsxs as _jsxs } from "react/jsx-runtime";
17
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
18
  export const TreeItem2Root = styled('li', {
20
19
  name: 'MuiTreeItem2',
21
20
  slot: 'Root',
@@ -40,9 +40,7 @@ export const useTreeItem2Utils = ({
40
40
  const multiple = multiSelect && (event.shiftKey || event.ctrlKey || event.metaKey);
41
41
  if (multiple) {
42
42
  if (event.shiftKey) {
43
- instance.selectRange(event, {
44
- end: itemId
45
- });
43
+ instance.expandSelectionRange(event, itemId);
46
44
  } else {
47
45
  instance.selectItem(event, itemId, true);
48
46
  }
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-tree-view v7.2.0
2
+ * @mui/x-tree-view v7.3.1
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -1,3 +1,3 @@
1
1
  import { TreeViewAnyPluginSignature } from '../models';
2
2
  import { TreeViewContextValue } from './TreeViewProvider.types';
3
- export declare const useTreeViewContext: <TPlugins extends readonly TreeViewAnyPluginSignature[]>() => TreeViewContextValue<TPlugins>;
3
+ export declare const useTreeViewContext: <TPlugins extends readonly TreeViewAnyPluginSignature[]>() => NonNullable<TreeViewContextValue<TPlugins>>;
@@ -7,9 +7,9 @@ interface RegistryContainer {
7
7
  }
8
8
  export declare function createUseInstanceEventHandler(registryContainer: RegistryContainer): <Instance extends UseTreeViewInstanceEventsInstance & {
9
9
  $$signature: TreeViewAnyPluginSignature;
10
- }, E extends keyof Instance["$$signature"]["events"] | keyof import("../models").MergePluginsProperty<[import("../corePlugins").TreeViewCorePluginsSignature, ...Instance["$$signature"]["dependantPlugins"]], "events">>(instance: Instance, eventName: E, handler: TreeViewEventListener<TreeViewUsedEvents<Instance["$$signature"]>[E]>) => void;
10
+ }, E extends keyof Instance["$$signature"]["events"] | keyof import("../models").MergePluginsProperty<[import("../corePlugins").TreeViewCorePluginsSignature, ...Instance["$$signature"]["dependantPlugins"]], "events">>(instance: Instance, eventName: E, handler: TreeViewEventListener<TreeViewUsedEvents<Instance['$$signature']>[E]>) => void;
11
11
  export declare const unstable_resetCleanupTracking: () => void;
12
12
  export declare const useInstanceEventHandler: <Instance extends UseTreeViewInstanceEventsInstance & {
13
13
  $$signature: TreeViewAnyPluginSignature;
14
- }, E extends keyof Instance["$$signature"]["events"] | keyof import("../models").MergePluginsProperty<[import("../corePlugins").TreeViewCorePluginsSignature, ...Instance["$$signature"]["dependantPlugins"]], "events">>(instance: Instance, eventName: E, handler: TreeViewEventListener<TreeViewUsedEvents<Instance["$$signature"]>[E]>) => void;
14
+ }, E extends keyof Instance["$$signature"]["events"] | keyof import("../models").MergePluginsProperty<[import("../corePlugins").TreeViewCorePluginsSignature, ...Instance["$$signature"]["dependantPlugins"]], "events">>(instance: Instance, eventName: E, handler: TreeViewEventListener<TreeViewUsedEvents<Instance['$$signature']>[E]>) => void;
15
15
  export {};
@@ -11,12 +11,6 @@ export interface TreeViewItemMeta {
11
11
  */
12
12
  label?: string;
13
13
  }
14
- export interface TreeViewItemRange {
15
- start?: string | null;
16
- end?: string | null;
17
- next?: string | null;
18
- current?: string;
19
- }
20
14
  export interface TreeViewModel<TValue> {
21
15
  name: string;
22
16
  value: TValue;
@@ -94,19 +94,20 @@ export const useTreeViewFocus = ({
94
94
  instance.focusDefaultItem(null);
95
95
  }
96
96
  });
97
- const createHandleFocus = otherHandlers => event => {
97
+ const createRootHandleFocus = otherHandlers => event => {
98
98
  otherHandlers.onFocus?.(event);
99
+ if (event.defaultMuiPrevented) {
100
+ return;
101
+ }
102
+
99
103
  // if the event bubbled (which is React specific) we don't want to steal focus
100
104
  if (event.target === event.currentTarget) {
101
105
  instance.focusDefaultItem(event);
102
106
  }
103
107
  };
104
- const focusedItem = instance.getItemMeta(state.focusedItemId);
105
- const activeDescendant = focusedItem ? instance.getTreeItemIdAttribute(focusedItem.id, focusedItem.idAttribute) : null;
106
108
  return {
107
109
  getRootProps: otherHandlers => ({
108
- onFocus: createHandleFocus(otherHandlers),
109
- 'aria-activedescendant': activeDescendant ?? undefined
110
+ onFocus: createRootHandleFocus(otherHandlers)
110
111
  }),
111
112
  publicAPI: {
112
113
  focusItem
@@ -86,6 +86,12 @@ export const useTreeViewJSXItems = ({
86
86
  }
87
87
  };
88
88
  };
89
+ const isItemExpandable = reactChildren => {
90
+ if (Array.isArray(reactChildren)) {
91
+ return reactChildren.length > 0 && reactChildren.some(isItemExpandable);
92
+ }
93
+ return Boolean(reactChildren);
94
+ };
89
95
  const useTreeViewJSXItemsItemPlugin = ({
90
96
  props,
91
97
  rootRef,
@@ -110,13 +116,7 @@ const useTreeViewJSXItemsItemPlugin = ({
110
116
  unregisterChild,
111
117
  parentId
112
118
  } = parentContext;
113
- const isExpandable = reactChildren => {
114
- if (Array.isArray(reactChildren)) {
115
- return reactChildren.length > 0 && reactChildren.some(isExpandable);
116
- }
117
- return Boolean(reactChildren);
118
- };
119
- const expandable = isExpandable(children);
119
+ const expandable = isItemExpandable(children);
120
120
  const pluginContentRef = React.useRef(null);
121
121
  const handleContentRef = useForkRef(pluginContentRef, contentRef);
122
122
 
@@ -5,14 +5,6 @@ import { getFirstNavigableItem, getLastNavigableItem, getNextNavigableItem, getP
5
5
  function isPrintableCharacter(string) {
6
6
  return !!string && string.length === 1 && !!string.match(/\S/);
7
7
  }
8
- function findNextFirstChar(firstChars, startIndex, char) {
9
- for (let i = startIndex; i < firstChars.length; i += 1) {
10
- if (char === firstChars[i]) {
11
- return i;
12
- }
13
- }
14
- return -1;
15
- }
16
8
  export const useTreeViewKeyboardNavigation = ({
17
9
  instance,
18
10
  params,
@@ -35,42 +27,29 @@ export const useTreeViewKeyboardNavigation = ({
35
27
  Object.values(state.items.itemMetaMap).forEach(processItem);
36
28
  firstCharMap.current = newFirstCharMap;
37
29
  }, [state.items.itemMetaMap, params.getItemId, instance]);
38
- const getFirstMatchingItem = (itemId, firstChar) => {
39
- let start;
40
- let index;
41
- const lowercaseChar = firstChar.toLowerCase();
42
- const firstCharIds = [];
43
- const firstChars = [];
44
- // This really only works since the ids are strings
45
- Object.keys(firstCharMap.current).forEach(mapItemId => {
46
- const map = instance.getItemMeta(mapItemId);
47
- const visible = map.parentId ? instance.isItemExpanded(map.parentId) : true;
48
- const shouldBeSkipped = params.disabledItemsFocusable ? false : instance.isItemDisabled(mapItemId);
49
- if (visible && !shouldBeSkipped) {
50
- firstCharIds.push(mapItemId);
51
- firstChars.push(firstCharMap.current[mapItemId]);
30
+ const getFirstMatchingItem = (itemId, query) => {
31
+ const cleanQuery = query.toLowerCase();
32
+ const getNextItem = itemIdToCheck => {
33
+ const nextItemId = getNextNavigableItem(instance, itemIdToCheck);
34
+ // We reached the end of the tree, check from the beginning
35
+ if (nextItemId === null) {
36
+ return getFirstNavigableItem(instance);
37
+ }
38
+ return nextItemId;
39
+ };
40
+ let matchingItemId = null;
41
+ let currentItemId = getNextItem(itemId);
42
+ const checkedItems = {};
43
+ // The "!checkedItems[currentItemId]" condition avoids an infinite loop when there is no matching item.
44
+ while (matchingItemId == null && !checkedItems[currentItemId]) {
45
+ if (firstCharMap.current[currentItemId] === cleanQuery) {
46
+ matchingItemId = currentItemId;
47
+ } else {
48
+ checkedItems[currentItemId] = true;
49
+ currentItemId = getNextItem(currentItemId);
52
50
  }
53
- });
54
-
55
- // Get start index for search based on position of currentItem
56
- start = firstCharIds.indexOf(itemId) + 1;
57
- if (start >= firstCharIds.length) {
58
- start = 0;
59
- }
60
-
61
- // Check remaining slots in the menu
62
- index = findNextFirstChar(firstChars, start, lowercaseChar);
63
-
64
- // If not found in remaining slots, check from beginning
65
- if (index === -1) {
66
- index = findNextFirstChar(firstChars, 0, lowercaseChar);
67
- }
68
-
69
- // If a match was found...
70
- if (index > -1) {
71
- return firstCharIds[index];
72
51
  }
73
- return null;
52
+ return matchingItemId;
74
53
  };
75
54
  const canToggleItemSelection = itemId => !params.disableSelection && !instance.isItemDisabled(itemId);
76
55
  const canToggleItemExpansion = itemId => {
@@ -95,9 +74,7 @@ export const useTreeViewKeyboardNavigation = ({
95
74
  {
96
75
  event.preventDefault();
97
76
  if (params.multiSelect && event.shiftKey) {
98
- instance.selectRange(event, {
99
- end: itemId
100
- });
77
+ instance.expandSelectionRange(event, itemId);
101
78
  } else if (params.multiSelect) {
102
79
  instance.selectItem(event, itemId, true);
103
80
  } else {
@@ -136,10 +113,7 @@ export const useTreeViewKeyboardNavigation = ({
136
113
  // Multi select behavior when pressing Shift + ArrowDown
137
114
  // Toggles the selection state of the next item
138
115
  if (params.multiSelect && event.shiftKey && canToggleItemSelection(nextItem)) {
139
- instance.selectRange(event, {
140
- end: nextItem,
141
- current: itemId
142
- }, true);
116
+ instance.selectItemFromArrowNavigation(event, itemId, nextItem);
143
117
  }
144
118
  }
145
119
  break;
@@ -156,10 +130,7 @@ export const useTreeViewKeyboardNavigation = ({
156
130
  // Multi select behavior when pressing Shift + ArrowUp
157
131
  // Toggles the selection state of the previous item
158
132
  if (params.multiSelect && event.shiftKey && canToggleItemSelection(previousItem)) {
159
- instance.selectRange(event, {
160
- end: previousItem,
161
- current: itemId
162
- }, true);
133
+ instance.selectItemFromArrowNavigation(event, itemId, previousItem);
163
134
  }
164
135
  }
165
136
  break;
@@ -202,12 +173,12 @@ export const useTreeViewKeyboardNavigation = ({
202
173
  // Focuses the first item in the tree
203
174
  case key === 'Home':
204
175
  {
205
- instance.focusItem(event, getFirstNavigableItem(instance));
206
-
207
176
  // Multi select behavior when pressing Ctrl + Shift + Home
208
177
  // Selects the focused item and all items up to the first item.
209
178
  if (canToggleItemSelection(itemId) && params.multiSelect && ctrlPressed && event.shiftKey) {
210
- instance.rangeSelectToFirst(event, itemId);
179
+ instance.selectRangeFromStartToItem(event, itemId);
180
+ } else {
181
+ instance.focusItem(event, getFirstNavigableItem(instance));
211
182
  }
212
183
  event.preventDefault();
213
184
  break;
@@ -216,12 +187,12 @@ export const useTreeViewKeyboardNavigation = ({
216
187
  // Focuses the last item in the tree
217
188
  case key === 'End':
218
189
  {
219
- instance.focusItem(event, getLastNavigableItem(instance));
220
-
221
190
  // Multi select behavior when pressing Ctrl + Shirt + End
222
191
  // Selects the focused item and all the items down to the last item.
223
192
  if (canToggleItemSelection(itemId) && params.multiSelect && ctrlPressed && event.shiftKey) {
224
- instance.rangeSelectToLast(event, itemId);
193
+ instance.selectRangeFromItemToEnd(event, itemId);
194
+ } else {
195
+ instance.focusItem(event, getLastNavigableItem(instance));
225
196
  }
226
197
  event.preventDefault();
227
198
  break;
@@ -239,10 +210,7 @@ export const useTreeViewKeyboardNavigation = ({
239
210
  // Selects all the items
240
211
  case key === 'a' && ctrlPressed && params.multiSelect && !params.disableSelection:
241
212
  {
242
- instance.selectRange(event, {
243
- start: getFirstNavigableItem(instance),
244
- end: getLastNavigableItem(instance)
245
- });
213
+ instance.selectAllNavigableItems(event);
246
214
  event.preventDefault();
247
215
  break;
248
216
  }