@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
@@ -7,7 +7,7 @@ exports.useTreeViewContext = void 0;
7
7
  var React = _interopRequireWildcard(require("react"));
8
8
  var _TreeViewContext = require("./TreeViewContext");
9
9
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
10
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
10
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
11
11
  const useTreeViewContext = () => {
12
12
  const context = React.useContext(_TreeViewContext.TreeViewContext);
13
13
  if (context == null) {
@@ -7,7 +7,7 @@ exports.useTreeViewInstanceEvents = void 0;
7
7
  var React = _interopRequireWildcard(require("react"));
8
8
  var _EventManager = require("../../utils/EventManager");
9
9
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
10
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
10
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
11
11
  const isSyntheticEvent = event => {
12
12
  return event.isPropagationStopped !== undefined;
13
13
  };
@@ -9,7 +9,7 @@ var React = _interopRequireWildcard(require("react"));
9
9
  var _TimerBasedCleanupTracking = require("../utils/cleanupTracking/TimerBasedCleanupTracking");
10
10
  var _FinalizationRegistryBasedCleanupTracking = require("../utils/cleanupTracking/FinalizationRegistryBasedCleanupTracking");
11
11
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
12
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
12
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
13
13
  // We use class to make it easier to detect in heap snapshots by name
14
14
  class ObjectToBeRetainedByReact {}
15
15
 
@@ -9,7 +9,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
11
11
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
12
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
12
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
13
13
  const useTreeViewExpansion = ({
14
14
  instance,
15
15
  params,
@@ -13,7 +13,7 @@ var _useInstanceEventHandler = require("../../hooks/useInstanceEventHandler");
13
13
  var _utils = require("../../utils/utils");
14
14
  var _tree = require("../../utils/tree");
15
15
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
16
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
17
17
  const useTabbableItemId = (instance, selectedItems) => {
18
18
  const isItemVisible = itemId => {
19
19
  const itemMeta = instance.getItemMeta(itemId);
@@ -103,19 +103,20 @@ const useTreeViewFocus = ({
103
103
  instance.focusDefaultItem(null);
104
104
  }
105
105
  });
106
- const createHandleFocus = otherHandlers => event => {
106
+ const createRootHandleFocus = otherHandlers => event => {
107
107
  otherHandlers.onFocus?.(event);
108
+ if (event.defaultMuiPrevented) {
109
+ return;
110
+ }
111
+
108
112
  // if the event bubbled (which is React specific) we don't want to steal focus
109
113
  if (event.target === event.currentTarget) {
110
114
  instance.focusDefaultItem(event);
111
115
  }
112
116
  };
113
- const focusedItem = instance.getItemMeta(state.focusedItemId);
114
- const activeDescendant = focusedItem ? instance.getTreeItemIdAttribute(focusedItem.id, focusedItem.idAttribute) : null;
115
117
  return {
116
118
  getRootProps: otherHandlers => ({
117
- onFocus: createHandleFocus(otherHandlers),
118
- 'aria-activedescendant': activeDescendant ?? undefined
119
+ onFocus: createRootHandleFocus(otherHandlers)
119
120
  }),
120
121
  publicAPI: {
121
122
  focusItem
@@ -8,7 +8,7 @@ exports.useTreeViewId = void 0;
8
8
  var React = _interopRequireWildcard(require("react"));
9
9
  var _useId = _interopRequireDefault(require("@mui/utils/useId"));
10
10
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
11
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
11
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
12
12
  const useTreeViewId = ({
13
13
  params
14
14
  }) => {
@@ -10,7 +10,7 @@ var React = _interopRequireWildcard(require("react"));
10
10
  var _publishTreeViewEvent = require("../../utils/publishTreeViewEvent");
11
11
  var _useTreeViewItems = require("./useTreeViewItems.utils");
12
12
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
13
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
13
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
14
14
  const updateItemsState = ({
15
15
  items,
16
16
  isItemDisabled,
@@ -16,7 +16,7 @@ var _TreeViewChildrenItemProvider = require("../../TreeViewProvider/TreeViewChil
16
16
  var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.utils");
17
17
  var _jsxRuntime = require("react/jsx-runtime");
18
18
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
19
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
19
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
20
20
  const useTreeViewJSXItems = ({
21
21
  instance,
22
22
  setState
@@ -96,6 +96,12 @@ const useTreeViewJSXItems = ({
96
96
  };
97
97
  };
98
98
  exports.useTreeViewJSXItems = useTreeViewJSXItems;
99
+ const isItemExpandable = reactChildren => {
100
+ if (Array.isArray(reactChildren)) {
101
+ return reactChildren.length > 0 && reactChildren.some(isItemExpandable);
102
+ }
103
+ return Boolean(reactChildren);
104
+ };
99
105
  const useTreeViewJSXItemsItemPlugin = ({
100
106
  props,
101
107
  rootRef,
@@ -120,13 +126,7 @@ const useTreeViewJSXItemsItemPlugin = ({
120
126
  unregisterChild,
121
127
  parentId
122
128
  } = parentContext;
123
- const isExpandable = reactChildren => {
124
- if (Array.isArray(reactChildren)) {
125
- return reactChildren.length > 0 && reactChildren.some(isExpandable);
126
- }
127
- return Boolean(reactChildren);
128
- };
129
- const expandable = isExpandable(children);
129
+ const expandable = isItemExpandable(children);
130
130
  const pluginContentRef = React.useRef(null);
131
131
  const handleContentRef = (0, _useForkRef.default)(pluginContentRef, contentRef);
132
132
 
@@ -10,18 +10,10 @@ var _styles = require("@mui/material/styles");
10
10
  var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
11
11
  var _tree = require("../../utils/tree");
12
12
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
13
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
13
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
14
14
  function isPrintableCharacter(string) {
15
15
  return !!string && string.length === 1 && !!string.match(/\S/);
16
16
  }
17
- function findNextFirstChar(firstChars, startIndex, char) {
18
- for (let i = startIndex; i < firstChars.length; i += 1) {
19
- if (char === firstChars[i]) {
20
- return i;
21
- }
22
- }
23
- return -1;
24
- }
25
17
  const useTreeViewKeyboardNavigation = ({
26
18
  instance,
27
19
  params,
@@ -44,42 +36,29 @@ const useTreeViewKeyboardNavigation = ({
44
36
  Object.values(state.items.itemMetaMap).forEach(processItem);
45
37
  firstCharMap.current = newFirstCharMap;
46
38
  }, [state.items.itemMetaMap, params.getItemId, instance]);
47
- const getFirstMatchingItem = (itemId, firstChar) => {
48
- let start;
49
- let index;
50
- const lowercaseChar = firstChar.toLowerCase();
51
- const firstCharIds = [];
52
- const firstChars = [];
53
- // This really only works since the ids are strings
54
- Object.keys(firstCharMap.current).forEach(mapItemId => {
55
- const map = instance.getItemMeta(mapItemId);
56
- const visible = map.parentId ? instance.isItemExpanded(map.parentId) : true;
57
- const shouldBeSkipped = params.disabledItemsFocusable ? false : instance.isItemDisabled(mapItemId);
58
- if (visible && !shouldBeSkipped) {
59
- firstCharIds.push(mapItemId);
60
- firstChars.push(firstCharMap.current[mapItemId]);
39
+ const getFirstMatchingItem = (itemId, query) => {
40
+ const cleanQuery = query.toLowerCase();
41
+ const getNextItem = itemIdToCheck => {
42
+ const nextItemId = (0, _tree.getNextNavigableItem)(instance, itemIdToCheck);
43
+ // We reached the end of the tree, check from the beginning
44
+ if (nextItemId === null) {
45
+ return (0, _tree.getFirstNavigableItem)(instance);
46
+ }
47
+ return nextItemId;
48
+ };
49
+ let matchingItemId = null;
50
+ let currentItemId = getNextItem(itemId);
51
+ const checkedItems = {};
52
+ // The "!checkedItems[currentItemId]" condition avoids an infinite loop when there is no matching item.
53
+ while (matchingItemId == null && !checkedItems[currentItemId]) {
54
+ if (firstCharMap.current[currentItemId] === cleanQuery) {
55
+ matchingItemId = currentItemId;
56
+ } else {
57
+ checkedItems[currentItemId] = true;
58
+ currentItemId = getNextItem(currentItemId);
61
59
  }
62
- });
63
-
64
- // Get start index for search based on position of currentItem
65
- start = firstCharIds.indexOf(itemId) + 1;
66
- if (start >= firstCharIds.length) {
67
- start = 0;
68
- }
69
-
70
- // Check remaining slots in the menu
71
- index = findNextFirstChar(firstChars, start, lowercaseChar);
72
-
73
- // If not found in remaining slots, check from beginning
74
- if (index === -1) {
75
- index = findNextFirstChar(firstChars, 0, lowercaseChar);
76
- }
77
-
78
- // If a match was found...
79
- if (index > -1) {
80
- return firstCharIds[index];
81
60
  }
82
- return null;
61
+ return matchingItemId;
83
62
  };
84
63
  const canToggleItemSelection = itemId => !params.disableSelection && !instance.isItemDisabled(itemId);
85
64
  const canToggleItemExpansion = itemId => {
@@ -104,9 +83,7 @@ const useTreeViewKeyboardNavigation = ({
104
83
  {
105
84
  event.preventDefault();
106
85
  if (params.multiSelect && event.shiftKey) {
107
- instance.selectRange(event, {
108
- end: itemId
109
- });
86
+ instance.expandSelectionRange(event, itemId);
110
87
  } else if (params.multiSelect) {
111
88
  instance.selectItem(event, itemId, true);
112
89
  } else {
@@ -145,10 +122,7 @@ const useTreeViewKeyboardNavigation = ({
145
122
  // Multi select behavior when pressing Shift + ArrowDown
146
123
  // Toggles the selection state of the next item
147
124
  if (params.multiSelect && event.shiftKey && canToggleItemSelection(nextItem)) {
148
- instance.selectRange(event, {
149
- end: nextItem,
150
- current: itemId
151
- }, true);
125
+ instance.selectItemFromArrowNavigation(event, itemId, nextItem);
152
126
  }
153
127
  }
154
128
  break;
@@ -165,10 +139,7 @@ const useTreeViewKeyboardNavigation = ({
165
139
  // Multi select behavior when pressing Shift + ArrowUp
166
140
  // Toggles the selection state of the previous item
167
141
  if (params.multiSelect && event.shiftKey && canToggleItemSelection(previousItem)) {
168
- instance.selectRange(event, {
169
- end: previousItem,
170
- current: itemId
171
- }, true);
142
+ instance.selectItemFromArrowNavigation(event, itemId, previousItem);
172
143
  }
173
144
  }
174
145
  break;
@@ -211,12 +182,12 @@ const useTreeViewKeyboardNavigation = ({
211
182
  // Focuses the first item in the tree
212
183
  case key === 'Home':
213
184
  {
214
- instance.focusItem(event, (0, _tree.getFirstNavigableItem)(instance));
215
-
216
185
  // Multi select behavior when pressing Ctrl + Shift + Home
217
186
  // Selects the focused item and all items up to the first item.
218
187
  if (canToggleItemSelection(itemId) && params.multiSelect && ctrlPressed && event.shiftKey) {
219
- instance.rangeSelectToFirst(event, itemId);
188
+ instance.selectRangeFromStartToItem(event, itemId);
189
+ } else {
190
+ instance.focusItem(event, (0, _tree.getFirstNavigableItem)(instance));
220
191
  }
221
192
  event.preventDefault();
222
193
  break;
@@ -225,12 +196,12 @@ const useTreeViewKeyboardNavigation = ({
225
196
  // Focuses the last item in the tree
226
197
  case key === 'End':
227
198
  {
228
- instance.focusItem(event, (0, _tree.getLastNavigableItem)(instance));
229
-
230
199
  // Multi select behavior when pressing Ctrl + Shirt + End
231
200
  // Selects the focused item and all the items down to the last item.
232
201
  if (canToggleItemSelection(itemId) && params.multiSelect && ctrlPressed && event.shiftKey) {
233
- instance.rangeSelectToLast(event, itemId);
202
+ instance.selectRangeFromItemToEnd(event, itemId);
203
+ } else {
204
+ instance.focusItem(event, (0, _tree.getLastNavigableItem)(instance));
234
205
  }
235
206
  event.preventDefault();
236
207
  break;
@@ -248,10 +219,7 @@ const useTreeViewKeyboardNavigation = ({
248
219
  // Selects all the items
249
220
  case key === 'a' && ctrlPressed && params.multiSelect && !params.disableSelection:
250
221
  {
251
- instance.selectRange(event, {
252
- start: (0, _tree.getFirstNavigableItem)(instance),
253
- end: (0, _tree.getLastNavigableItem)(instance)
254
- });
222
+ instance.selectAllNavigableItems(event);
255
223
  event.preventDefault();
256
224
  break;
257
225
  }
@@ -8,16 +8,27 @@ exports.useTreeViewSelection = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  var _tree = require("../../utils/tree");
11
+ var _useTreeViewSelection = require("./useTreeViewSelection.utils");
11
12
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
12
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
13
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
13
14
  const useTreeViewSelection = ({
14
15
  instance,
15
16
  params,
16
17
  models
17
18
  }) => {
18
19
  const lastSelectedItem = React.useRef(null);
19
- const lastSelectionWasRange = React.useRef(false);
20
- const currentRangeSelection = React.useRef([]);
20
+ const lastSelectedRange = React.useRef({});
21
+ const selectedItemsMap = React.useMemo(() => {
22
+ const temp = new Map();
23
+ if (Array.isArray(models.selectedItems.value)) {
24
+ models.selectedItems.value.forEach(id => {
25
+ temp.set(id, true);
26
+ });
27
+ } else if (models.selectedItems.value != null) {
28
+ temp.set(models.selectedItems.value, true);
29
+ }
30
+ return temp;
31
+ }, [models.selectedItems.value]);
21
32
  const setSelectedItems = (event, newSelectedItems) => {
22
33
  if (params.onItemSelectionToggle) {
23
34
  if (params.multiSelect) {
@@ -43,115 +54,90 @@ const useTreeViewSelection = ({
43
54
  }
44
55
  models.selectedItems.setControlledValue(newSelectedItems);
45
56
  };
46
- const isItemSelected = itemId => Array.isArray(models.selectedItems.value) ? models.selectedItems.value.indexOf(itemId) !== -1 : models.selectedItems.value === itemId;
57
+ const isItemSelected = itemId => selectedItemsMap.has(itemId);
47
58
  const selectItem = (event, itemId, multiple = false) => {
48
59
  if (params.disableSelection) {
49
60
  return;
50
61
  }
62
+ let newSelected;
51
63
  if (multiple) {
52
- if (Array.isArray(models.selectedItems.value)) {
53
- let newSelected;
54
- if (models.selectedItems.value.indexOf(itemId) !== -1) {
55
- newSelected = models.selectedItems.value.filter(id => id !== itemId);
56
- } else {
57
- newSelected = [itemId].concat(models.selectedItems.value);
58
- }
59
- setSelectedItems(event, newSelected);
64
+ const cleanSelectedItems = (0, _useTreeViewSelection.convertSelectedItemsToArray)(models.selectedItems.value);
65
+ if (instance.isItemSelected(itemId)) {
66
+ newSelected = cleanSelectedItems.filter(id => id !== itemId);
67
+ } else {
68
+ newSelected = [itemId].concat(cleanSelectedItems);
60
69
  }
61
70
  } else {
62
- const newSelected = params.multiSelect ? [itemId] : itemId;
63
- setSelectedItems(event, newSelected);
71
+ newSelected = params.multiSelect ? [itemId] : itemId;
64
72
  }
73
+ setSelectedItems(event, newSelected);
65
74
  lastSelectedItem.current = itemId;
66
- lastSelectionWasRange.current = false;
67
- currentRangeSelection.current = [];
75
+ lastSelectedRange.current = {};
68
76
  };
69
- const handleRangeArrowSelect = (event, items) => {
70
- let base = models.selectedItems.value.slice();
71
- const {
72
- start,
73
- next,
74
- current
75
- } = items;
76
- if (!next || !current) {
77
+ const selectRange = (event, [start, end]) => {
78
+ if (params.disableSelection || !params.multiSelect) {
77
79
  return;
78
80
  }
79
- if (currentRangeSelection.current.indexOf(current) === -1) {
80
- currentRangeSelection.current = [];
81
- }
82
- if (lastSelectionWasRange.current) {
83
- if (currentRangeSelection.current.indexOf(next) !== -1) {
84
- base = base.filter(id => id === start || id !== current);
85
- currentRangeSelection.current = currentRangeSelection.current.filter(id => id === start || id !== current);
86
- } else {
87
- base.push(next);
88
- currentRangeSelection.current.push(next);
89
- }
90
- } else {
91
- base.push(next);
92
- currentRangeSelection.current.push(current, next);
81
+ let newSelectedItems = (0, _useTreeViewSelection.convertSelectedItemsToArray)(models.selectedItems.value).slice();
82
+
83
+ // If the last selection was a range selection,
84
+ // remove the items that were part of the last range from the model
85
+ if (Object.keys(lastSelectedRange.current).length > 0) {
86
+ newSelectedItems = newSelectedItems.filter(id => !lastSelectedRange.current[id]);
93
87
  }
94
- setSelectedItems(event, base);
88
+
89
+ // Add to the model the items that are part of the new range and not already part of the model.
90
+ const selectedItemsLookup = (0, _useTreeViewSelection.getLookupFromArray)(newSelectedItems);
91
+ const range = (0, _tree.getNonDisabledItemsInRange)(instance, start, end);
92
+ const itemsToAddToModel = range.filter(id => !selectedItemsLookup[id]);
93
+ newSelectedItems = newSelectedItems.concat(itemsToAddToModel);
94
+ setSelectedItems(event, newSelectedItems);
95
+ lastSelectedRange.current = (0, _useTreeViewSelection.getLookupFromArray)(range);
95
96
  };
96
- const handleRangeSelect = (event, items) => {
97
- let base = models.selectedItems.value.slice();
98
- const {
99
- start,
100
- end
101
- } = items;
102
- // If last selection was a range selection ignore items that were selected.
103
- if (lastSelectionWasRange.current) {
104
- base = base.filter(id => currentRangeSelection.current.indexOf(id) === -1);
97
+ const expandSelectionRange = (event, itemId) => {
98
+ if (lastSelectedItem.current != null) {
99
+ const [start, end] = (0, _tree.findOrderInTremauxTree)(instance, itemId, lastSelectedItem.current);
100
+ selectRange(event, [start, end]);
105
101
  }
106
- let range = (0, _tree.getNavigableItemsInRange)(instance, start, end);
107
- range = range.filter(item => !instance.isItemDisabled(item));
108
- currentRangeSelection.current = range;
109
- let newSelected = base.concat(range);
110
- newSelected = newSelected.filter((id, i) => newSelected.indexOf(id) === i);
111
- setSelectedItems(event, newSelected);
112
102
  };
113
- const selectRange = (event, items, stacked = false) => {
114
- if (params.disableSelection) {
103
+ const selectRangeFromStartToItem = (event, itemId) => {
104
+ selectRange(event, [(0, _tree.getFirstNavigableItem)(instance), itemId]);
105
+ };
106
+ const selectRangeFromItemToEnd = (event, itemId) => {
107
+ selectRange(event, [itemId, (0, _tree.getLastNavigableItem)(instance)]);
108
+ };
109
+ const selectAllNavigableItems = event => {
110
+ if (params.disableSelection || !params.multiSelect) {
115
111
  return;
116
112
  }
117
- const {
118
- start = lastSelectedItem.current,
119
- end,
120
- current
121
- } = items;
122
- if (stacked) {
123
- handleRangeArrowSelect(event, {
124
- start,
125
- next: end,
126
- current
127
- });
128
- } else if (start != null && end != null) {
129
- handleRangeSelect(event, {
130
- start,
131
- end
132
- });
133
- }
134
- lastSelectionWasRange.current = true;
113
+ const navigableItems = (0, _tree.getAllNavigableItems)(instance);
114
+ setSelectedItems(event, navigableItems);
115
+ lastSelectedRange.current = (0, _useTreeViewSelection.getLookupFromArray)(navigableItems);
135
116
  };
136
- const rangeSelectToFirst = (event, itemId) => {
137
- if (!lastSelectedItem.current) {
138
- lastSelectedItem.current = itemId;
117
+ const selectItemFromArrowNavigation = (event, currentItem, nextItem) => {
118
+ if (params.disableSelection || !params.multiSelect) {
119
+ return;
139
120
  }
140
- const start = lastSelectionWasRange.current ? lastSelectedItem.current : itemId;
141
- instance.selectRange(event, {
142
- start,
143
- end: (0, _tree.getFirstNavigableItem)(instance)
144
- });
145
- };
146
- const rangeSelectToLast = (event, itemId) => {
147
- if (!lastSelectedItem.current) {
148
- lastSelectedItem.current = itemId;
121
+ let newSelectedItems = (0, _useTreeViewSelection.convertSelectedItemsToArray)(models.selectedItems.value).slice();
122
+ if (Object.keys(lastSelectedRange.current).length === 0) {
123
+ newSelectedItems.push(nextItem);
124
+ lastSelectedRange.current = {
125
+ [currentItem]: true,
126
+ [nextItem]: true
127
+ };
128
+ } else {
129
+ if (!lastSelectedRange.current[currentItem]) {
130
+ lastSelectedRange.current = {};
131
+ }
132
+ if (lastSelectedRange.current[nextItem]) {
133
+ newSelectedItems = newSelectedItems.filter(id => id !== currentItem);
134
+ delete lastSelectedRange.current[currentItem];
135
+ } else {
136
+ newSelectedItems.push(nextItem);
137
+ lastSelectedRange.current[nextItem] = true;
138
+ }
149
139
  }
150
- const start = lastSelectionWasRange.current ? lastSelectedItem.current : itemId;
151
- instance.selectRange(event, {
152
- start,
153
- end: (0, _tree.getLastNavigableItem)(instance)
154
- });
140
+ setSelectedItems(event, newSelectedItems);
155
141
  };
156
142
  return {
157
143
  getRootProps: () => ({
@@ -160,9 +146,11 @@ const useTreeViewSelection = ({
160
146
  instance: {
161
147
  isItemSelected,
162
148
  selectItem,
163
- selectRange,
164
- rangeSelectToLast,
165
- rangeSelectToFirst
149
+ selectAllNavigableItems,
150
+ expandSelectionRange,
151
+ selectRangeFromStartToItem,
152
+ selectRangeFromItemToEnd,
153
+ selectItemFromArrowNavigation
166
154
  },
167
155
  contextValue: {
168
156
  selection: {
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getLookupFromArray = exports.convertSelectedItemsToArray = void 0;
7
+ /**
8
+ * Transform the `selectedItems` model to be an array if it was a string or null.
9
+ * @param {string[] | string | null} model The raw model.
10
+ * @returns {string[]} The converted model.
11
+ */
12
+ const convertSelectedItemsToArray = model => {
13
+ if (Array.isArray(model)) {
14
+ return model;
15
+ }
16
+ if (model != null) {
17
+ return [model];
18
+ }
19
+ return [];
20
+ };
21
+ exports.convertSelectedItemsToArray = convertSelectedItemsToArray;
22
+ const getLookupFromArray = array => {
23
+ const lookup = {};
24
+ array.forEach(itemId => {
25
+ lookup[itemId] = true;
26
+ });
27
+ return lookup;
28
+ };
29
+ exports.getLookupFromArray = getLookupFromArray;
@@ -12,7 +12,7 @@ var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
12
12
  var _useTreeViewModels = require("./useTreeViewModels");
13
13
  var _corePlugins = require("../corePlugins");
14
14
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
15
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
15
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
16
  function useTreeViewApiInitialization(inputApiRef) {
17
17
  const fallbackPublicApiRef = React.useRef({});
18
18
  if (inputApiRef) {
@@ -8,7 +8,7 @@ exports.useTreeViewModels = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
11
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
11
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
12
12
  /**
13
13
  * Implements the same behavior as `useControlled` but for several models.
14
14
  * The controlled models are never stored in the state and the state is only updated if the model is not controlled.