@mui/x-tree-view 8.0.0-alpha.0 → 8.0.0-alpha.10

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 (164) hide show
  1. package/CHANGELOG.md +2215 -119
  2. package/README.md +3 -3
  3. package/RichTreeView/RichTreeView.js +2 -4
  4. package/RichTreeView/RichTreeView.types.d.ts +6 -19
  5. package/SimpleTreeView/SimpleTreeView.types.d.ts +3 -3
  6. package/TreeItem/TreeItem.d.ts +1 -1
  7. package/TreeItem/TreeItem.js +4 -4
  8. package/TreeItem/TreeItem.types.d.ts +4 -2
  9. package/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +1 -1
  10. package/TreeItemIcon/TreeItemIcon.types.d.ts +1 -1
  11. package/TreeItemProvider/TreeItemProvider.d.ts +2 -4
  12. package/TreeItemProvider/TreeItemProvider.js +26 -11
  13. package/TreeItemProvider/TreeItemProvider.types.d.ts +1 -0
  14. package/hooks/index.d.ts +1 -0
  15. package/hooks/index.js +2 -1
  16. package/hooks/useTreeItemModel.d.ts +2 -0
  17. package/hooks/useTreeItemModel.js +11 -0
  18. package/hooks/useTreeItemUtils/useTreeItemUtils.d.ts +6 -5
  19. package/hooks/useTreeItemUtils/useTreeItemUtils.js +31 -15
  20. package/hooks/useTreeViewApiRef.d.ts +2 -1
  21. package/index.js +1 -1
  22. package/internals/TreeViewItemDepthContext/TreeViewItemDepthContext.d.ts +3 -1
  23. package/internals/TreeViewProvider/TreeViewChildrenItemProvider.d.ts +2 -1
  24. package/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
  25. package/internals/TreeViewProvider/TreeViewProvider.js +1 -2
  26. package/internals/TreeViewProvider/TreeViewProvider.types.d.ts +5 -3
  27. package/internals/components/RichTreeViewItems.d.ts +3 -5
  28. package/internals/components/RichTreeViewItems.js +42 -30
  29. package/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
  30. package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.d.ts +36 -0
  31. package/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
  32. package/internals/corePlugins/useTreeViewId/useTreeViewId.types.d.ts +1 -5
  33. package/internals/hooks/useInstanceEventHandler.js +1 -1
  34. package/internals/hooks/useSelector.d.ts +4 -0
  35. package/internals/hooks/useSelector.js +6 -0
  36. package/internals/index.d.ts +6 -1
  37. package/internals/index.js +5 -1
  38. package/internals/models/itemPlugin.d.ts +7 -7
  39. package/internals/models/plugin.d.ts +22 -10
  40. package/internals/models/treeView.d.ts +6 -0
  41. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +41 -30
  42. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.d.ts +180 -0
  43. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +24 -0
  44. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.d.ts +6 -18
  45. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.d.ts +4 -0
  46. package/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +19 -0
  47. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
  48. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.d.ts +182 -0
  49. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
  50. package/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.d.ts +4 -16
  51. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
  52. package/internals/plugins/useTreeViewIcons/useTreeViewIcons.types.d.ts +1 -1
  53. package/internals/plugins/useTreeViewItems/index.d.ts +1 -1
  54. package/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -98
  55. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.d.ts +886 -0
  56. package/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
  57. package/internals/plugins/useTreeViewItems/useTreeViewItems.types.d.ts +36 -55
  58. package/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
  59. package/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
  60. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
  61. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
  62. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.d.ts +74 -0
  63. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
  64. package/internals/plugins/useTreeViewLabel/useTreeViewLabel.types.d.ts +7 -24
  65. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -17
  66. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +45 -34
  67. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.d.ts +32 -0
  68. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
  69. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.d.ts +6 -6
  70. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.d.ts +6 -6
  71. package/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +23 -13
  72. package/internals/useTreeView/useTreeView.d.ts +1 -1
  73. package/internals/useTreeView/useTreeView.js +30 -17
  74. package/internals/useTreeView/useTreeView.types.d.ts +3 -4
  75. package/internals/useTreeView/useTreeViewBuildContext.d.ts +4 -2
  76. package/internals/useTreeView/useTreeViewBuildContext.js +24 -18
  77. package/internals/utils/TreeViewStore.d.ts +12 -0
  78. package/internals/utils/TreeViewStore.js +24 -0
  79. package/internals/utils/selectors.d.ts +9 -0
  80. package/internals/utils/selectors.js +37 -0
  81. package/internals/utils/tree.d.ts +8 -8
  82. package/internals/utils/tree.js +51 -43
  83. package/models/items.d.ts +3 -2
  84. package/modern/RichTreeView/RichTreeView.js +2 -4
  85. package/modern/TreeItem/TreeItem.js +4 -4
  86. package/modern/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +1 -1
  87. package/modern/TreeItemProvider/TreeItemProvider.js +26 -11
  88. package/modern/hooks/index.js +2 -1
  89. package/modern/hooks/useTreeItemModel.js +11 -0
  90. package/modern/hooks/useTreeItemUtils/useTreeItemUtils.js +31 -15
  91. package/modern/index.js +1 -1
  92. package/modern/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
  93. package/modern/internals/TreeViewProvider/TreeViewProvider.js +1 -2
  94. package/modern/internals/components/RichTreeViewItems.js +42 -30
  95. package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.js +10 -11
  96. package/modern/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +9 -0
  97. package/modern/internals/hooks/useInstanceEventHandler.js +1 -1
  98. package/modern/internals/hooks/useSelector.js +6 -0
  99. package/modern/internals/index.js +5 -1
  100. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +41 -30
  101. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +24 -0
  102. package/modern/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +19 -0
  103. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
  104. package/modern/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +34 -0
  105. package/modern/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +15 -13
  106. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.js +58 -98
  107. package/modern/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +103 -0
  108. package/modern/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +29 -26
  109. package/modern/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
  110. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
  111. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
  112. package/modern/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +26 -0
  113. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -17
  114. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +45 -34
  115. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +9 -0
  116. package/modern/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +23 -13
  117. package/modern/internals/useTreeView/useTreeView.js +30 -17
  118. package/modern/internals/useTreeView/useTreeViewBuildContext.js +24 -18
  119. package/modern/internals/utils/TreeViewStore.js +24 -0
  120. package/modern/internals/utils/selectors.js +37 -0
  121. package/modern/internals/utils/tree.js +51 -43
  122. package/modern/useTreeItem/useTreeItem.js +29 -16
  123. package/node/RichTreeView/RichTreeView.js +2 -4
  124. package/node/TreeItem/TreeItem.js +4 -4
  125. package/node/TreeItemDragAndDropOverlay/TreeItemDragAndDropOverlay.js +2 -2
  126. package/node/TreeItemProvider/TreeItemProvider.js +26 -10
  127. package/node/hooks/index.js +8 -1
  128. package/node/hooks/useTreeItemModel.js +17 -0
  129. package/node/hooks/useTreeItemUtils/useTreeItemUtils.js +32 -15
  130. package/node/index.js +1 -1
  131. package/node/internals/TreeViewProvider/TreeViewChildrenItemProvider.js +6 -22
  132. package/node/internals/TreeViewProvider/TreeViewProvider.js +1 -2
  133. package/node/internals/components/RichTreeViewItems.js +42 -30
  134. package/node/internals/corePlugins/useTreeViewId/useTreeViewId.js +12 -13
  135. package/node/internals/corePlugins/useTreeViewId/useTreeViewId.selectors.js +15 -0
  136. package/node/internals/hooks/useInstanceEventHandler.js +1 -1
  137. package/node/internals/hooks/useSelector.js +13 -0
  138. package/node/internals/index.js +47 -1
  139. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.js +41 -31
  140. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.selectors.js +30 -0
  141. package/node/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.utils.js +27 -0
  142. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.js +62 -40
  143. package/node/internals/plugins/useTreeViewFocus/useTreeViewFocus.selectors.js +40 -0
  144. package/node/internals/plugins/useTreeViewIcons/useTreeViewIcons.js +16 -13
  145. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.js +60 -100
  146. package/node/internals/plugins/useTreeViewItems/useTreeViewItems.selectors.js +109 -0
  147. package/node/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.js +30 -27
  148. package/node/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.js +27 -18
  149. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.itemPlugin.js +13 -5
  150. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.js +19 -30
  151. package/node/internals/plugins/useTreeViewLabel/useTreeViewLabel.selectors.js +32 -0
  152. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.itemPlugin.js +16 -17
  153. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.js +46 -35
  154. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.selectors.js +15 -0
  155. package/node/internals/plugins/useTreeViewSelection/useTreeViewSelection.utils.js +24 -14
  156. package/node/internals/useTreeView/useTreeView.js +30 -17
  157. package/node/internals/useTreeView/useTreeViewBuildContext.js +25 -18
  158. package/node/internals/utils/TreeViewStore.js +31 -0
  159. package/node/internals/utils/selectors.js +44 -0
  160. package/node/internals/utils/tree.js +51 -43
  161. package/node/useTreeItem/useTreeItem.js +29 -16
  162. package/package.json +8 -6
  163. package/useTreeItem/useTreeItem.js +29 -16
  164. package/useTreeItem/useTreeItem.types.d.ts +10 -1
@@ -11,7 +11,7 @@ var React = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _useTreeViewContext = require("./useTreeViewContext");
13
13
  var _utils = require("../utils/utils");
14
- var _useTreeViewId = require("../corePlugins/useTreeViewId/useTreeViewId.utils");
14
+ var _useTreeViewItems = require("../plugins/useTreeViewItems/useTreeViewItems.selectors");
15
15
  var _jsxRuntime = require("react/jsx-runtime");
16
16
  const TreeViewChildrenItemContext = exports.TreeViewChildrenItemContext = /*#__PURE__*/React.createContext(null);
17
17
  if (process.env.NODE_ENV !== 'production') {
@@ -20,11 +20,12 @@ if (process.env.NODE_ENV !== 'production') {
20
20
  function TreeViewChildrenItemProvider(props) {
21
21
  const {
22
22
  children,
23
- itemId = null
23
+ itemId = null,
24
+ idAttribute
24
25
  } = props;
25
26
  const {
26
27
  instance,
27
- treeId,
28
+ store,
28
29
  rootRef
29
30
  } = (0, _useTreeViewContext.useTreeViewContext)();
30
31
  const childrenIdAttrToIdRef = React.useRef(new Map());
@@ -32,25 +33,8 @@ function TreeViewChildrenItemProvider(props) {
32
33
  if (!rootRef.current) {
33
34
  return;
34
35
  }
35
- let idAttr = null;
36
- if (itemId == null) {
37
- idAttr = rootRef.current.id;
38
- } else {
39
- // Undefined during 1st render
40
- const itemMeta = instance.getItemMeta(itemId);
41
- if (itemMeta !== undefined) {
42
- idAttr = (0, _useTreeViewId.generateTreeItemIdAttribute)({
43
- itemId,
44
- treeId,
45
- id: itemMeta.idAttribute
46
- });
47
- }
48
- }
49
- if (idAttr == null) {
50
- return;
51
- }
52
- const previousChildrenIds = instance.getItemOrderedChildrenIds(itemId ?? null) ?? [];
53
- const escapedIdAttr = (0, _utils.escapeOperandAttributeSelector)(idAttr);
36
+ const previousChildrenIds = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(store.value, itemId ?? null) ?? [];
37
+ const escapedIdAttr = (0, _utils.escapeOperandAttributeSelector)(idAttribute ?? rootRef.current.id);
54
38
  const childrenElements = rootRef.current.querySelectorAll(`${itemId == null ? '' : `*[id="${escapedIdAttr}"] `}[role="treeitem"]:not(*[id="${escapedIdAttr}"] [role="treeitem"] [role="treeitem"])`);
55
39
  const childrenIds = Array.from(childrenElements).map(child => childrenIdAttrToIdRef.current.get(child.id));
56
40
  const hasChanged = childrenIds.length !== previousChildrenIds.length || childrenIds.some((childId, index) => childId !== previousChildrenIds[index]);
@@ -21,8 +21,7 @@ function TreeViewProvider(props) {
21
21
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TreeViewContext.TreeViewContext.Provider, {
22
22
  value: value,
23
23
  children: value.wrapRoot({
24
- children,
25
- instance: value.instance
24
+ children
26
25
  })
27
26
  });
28
27
  }
@@ -10,55 +10,67 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
10
10
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
11
11
  var React = _interopRequireWildcard(require("react"));
12
12
  var _useSlotProps2 = _interopRequireDefault(require("@mui/utils/useSlotProps"));
13
+ var _fastObjectShallowCompare = require("@mui/x-internals/fastObjectShallowCompare");
13
14
  var _TreeItem = require("../../TreeItem");
15
+ var _useSelector = require("../hooks/useSelector");
16
+ var _useTreeViewItems = require("../plugins/useTreeViewItems/useTreeViewItems.selectors");
17
+ var _TreeViewProvider = require("../TreeViewProvider");
14
18
  var _jsxRuntime = require("react/jsx-runtime");
15
19
  const _excluded = ["ownerState"];
16
- function WrappedTreeItem({
17
- slots,
18
- slotProps,
19
- label,
20
- id,
21
- itemId,
22
- itemsToRender
20
+ const RichTreeViewItemsContext = /*#__PURE__*/React.createContext(null);
21
+ if (process.env.NODE_ENV !== 'production') {
22
+ RichTreeViewItemsContext.displayName = 'RichTreeViewItemsProvider';
23
+ }
24
+ const WrappedTreeItem = /*#__PURE__*/React.memo(function WrappedTreeItem({
25
+ itemSlot,
26
+ itemSlotProps,
27
+ itemId
23
28
  }) {
24
- const Item = slots?.item ?? _TreeItem.TreeItem;
29
+ const renderItemForRichTreeView = React.useContext(RichTreeViewItemsContext);
30
+ const {
31
+ store
32
+ } = (0, _TreeViewProvider.useTreeViewContext)();
33
+ const itemMeta = (0, _useSelector.useSelector)(store, _useTreeViewItems.selectorItemMeta, itemId);
34
+ const children = (0, _useSelector.useSelector)(store, _useTreeViewItems.selectorItemOrderedChildrenIds, itemId);
35
+ const Item = itemSlot ?? _TreeItem.TreeItem;
25
36
  const _useSlotProps = (0, _useSlotProps2.default)({
26
37
  elementType: Item,
27
- externalSlotProps: slotProps?.item,
38
+ externalSlotProps: itemSlotProps,
28
39
  additionalProps: {
29
- itemId,
30
- id,
31
- label
40
+ label: itemMeta?.label,
41
+ id: itemMeta?.idAttribute,
42
+ itemId
32
43
  },
33
44
  ownerState: {
34
45
  itemId,
35
- label
46
+ label: itemMeta?.label
36
47
  }
37
48
  }),
38
49
  itemProps = (0, _objectWithoutPropertiesLoose2.default)(_useSlotProps, _excluded);
39
- const children = React.useMemo(() => itemsToRender ? /*#__PURE__*/(0, _jsxRuntime.jsx)(RichTreeViewItems, {
40
- itemsToRender: itemsToRender,
41
- slots: slots,
42
- slotProps: slotProps
43
- }) : null, [itemsToRender, slots, slotProps]);
44
50
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(Item, (0, _extends2.default)({}, itemProps, {
45
- children: children
51
+ children: children?.map(renderItemForRichTreeView)
46
52
  }));
47
- }
53
+ }, _fastObjectShallowCompare.fastObjectShallowCompare);
48
54
  function RichTreeViewItems(props) {
49
55
  const {
50
- itemsToRender,
51
56
  slots,
52
57
  slotProps
53
58
  } = props;
54
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(React.Fragment, {
55
- children: itemsToRender.map(item => /*#__PURE__*/(0, _jsxRuntime.jsx)(WrappedTreeItem, {
56
- slots: slots,
57
- slotProps: slotProps,
58
- label: item.label,
59
- id: item.id,
60
- itemId: item.itemId,
61
- itemsToRender: item.children
62
- }, item.itemId))
59
+ const {
60
+ store
61
+ } = (0, _TreeViewProvider.useTreeViewContext)();
62
+ const itemSlot = slots?.item;
63
+ const itemSlotProps = slotProps?.item;
64
+ const items = (0, _useSelector.useSelector)(store, _useTreeViewItems.selectorItemOrderedChildrenIds, null);
65
+ const renderItem = React.useCallback(itemId => {
66
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(WrappedTreeItem, {
67
+ itemSlot: itemSlot,
68
+ itemSlotProps: itemSlotProps,
69
+ itemId: itemId
70
+ }, itemId);
71
+ }, [itemSlot, itemSlotProps]);
72
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(RichTreeViewItemsContext.Provider, {
73
+ value: renderItem,
74
+ children: items.map(renderItem)
63
75
  });
64
76
  }
@@ -8,32 +8,30 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.useTreeViewId = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var React = _interopRequireWildcard(require("react"));
11
- var _useTreeViewId = require("./useTreeViewId.utils");
11
+ var _useSelector = require("../../hooks/useSelector");
12
+ var _useTreeViewId = require("./useTreeViewId.selectors");
13
+ var _useTreeViewId2 = require("./useTreeViewId.utils");
12
14
  const useTreeViewId = ({
13
15
  params,
14
- state,
15
- setState
16
+ store
16
17
  }) => {
17
18
  React.useEffect(() => {
18
- setState(prevState => {
19
- if (prevState.id.treeId === params.id && prevState.id.treeId !== undefined) {
19
+ store.update(prevState => {
20
+ if (params.id === prevState.id.providedTreeId && prevState.id.treeId !== undefined) {
20
21
  return prevState;
21
22
  }
22
23
  return (0, _extends2.default)({}, prevState, {
23
24
  id: (0, _extends2.default)({}, prevState.id, {
24
- treeId: params.id ?? (0, _useTreeViewId.createTreeViewDefaultId)()
25
+ treeId: params.id ?? (0, _useTreeViewId2.createTreeViewDefaultId)()
25
26
  })
26
27
  });
27
28
  });
28
- }, [setState, params.id]);
29
- const treeId = params.id ?? state.id.treeId;
29
+ }, [store, params.id]);
30
+ const treeId = (0, _useSelector.useSelector)(store, _useTreeViewId.selectorTreeViewId);
30
31
  return {
31
32
  getRootProps: () => ({
32
33
  id: treeId
33
- }),
34
- contextValue: {
35
- treeId
36
- }
34
+ })
37
35
  };
38
36
  };
39
37
  exports.useTreeViewId = useTreeViewId;
@@ -44,6 +42,7 @@ useTreeViewId.getInitialState = ({
44
42
  id
45
43
  }) => ({
46
44
  id: {
47
- treeId: id ?? undefined
45
+ treeId: undefined,
46
+ providedTreeId: id
48
47
  }
49
48
  });
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.selectorTreeViewId = void 0;
7
+ var _selectors = require("../../utils/selectors");
8
+ const selectorTreeViewIdState = state => state.id;
9
+
10
+ /**
11
+ * Get the id attribute of the tree view.
12
+ * @param {TreeViewState<[UseTreeViewIdSignature]>} state The state of the tree view.
13
+ * @returns {string} The id attribute of the tree view.
14
+ */
15
+ const selectorTreeViewId = exports.selectorTreeViewId = (0, _selectors.createSelector)(selectorTreeViewIdState, idState => idState.treeId);
@@ -22,7 +22,7 @@ function createUseInstanceEventHandler(registryContainer) {
22
22
  }
23
23
  const [objectRetainedByReact] = React.useState(new ObjectToBeRetainedByReact());
24
24
  const subscription = React.useRef(null);
25
- const handlerRef = React.useRef();
25
+ const handlerRef = React.useRef(undefined);
26
26
  handlerRef.current = handler;
27
27
  const cleanupTokenRef = React.useRef(null);
28
28
  if (!subscription.current && handlerRef.current) {
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSelector = void 0;
7
+ var _withSelector = require("use-sync-external-store/with-selector");
8
+ const defaultCompare = Object.is;
9
+ const useSelector = (store, selector, args = undefined, equals = defaultCompare) => {
10
+ const selectorWithArgs = state => selector(state, args);
11
+ return (0, _withSelector.useSyncExternalStoreWithSelector)(store.subscribe, store.getSnapshot, store.getSnapshot, selectorWithArgs, equals);
12
+ };
13
+ exports.useSelector = useSelector;
@@ -21,24 +21,66 @@ Object.defineProperty(exports, "TreeViewProvider", {
21
21
  return _TreeViewProvider.TreeViewProvider;
22
22
  }
23
23
  });
24
+ Object.defineProperty(exports, "TreeViewStore", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _TreeViewStore.TreeViewStore;
28
+ }
29
+ });
24
30
  Object.defineProperty(exports, "buildSiblingIndexes", {
25
31
  enumerable: true,
26
32
  get: function () {
27
33
  return _useTreeViewItems.buildSiblingIndexes;
28
34
  }
29
35
  });
36
+ Object.defineProperty(exports, "createSelector", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _selectors.createSelector;
40
+ }
41
+ });
30
42
  Object.defineProperty(exports, "isTargetInDescendants", {
31
43
  enumerable: true,
32
44
  get: function () {
33
45
  return _tree.isTargetInDescendants;
34
46
  }
35
47
  });
48
+ Object.defineProperty(exports, "selectorItemIndex", {
49
+ enumerable: true,
50
+ get: function () {
51
+ return _useTreeViewItems2.selectorItemIndex;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "selectorItemMeta", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _useTreeViewItems2.selectorItemMeta;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "selectorItemMetaLookup", {
61
+ enumerable: true,
62
+ get: function () {
63
+ return _useTreeViewItems2.selectorItemMetaLookup;
64
+ }
65
+ });
66
+ Object.defineProperty(exports, "selectorItemOrderedChildrenIds", {
67
+ enumerable: true,
68
+ get: function () {
69
+ return _useTreeViewItems2.selectorItemOrderedChildrenIds;
70
+ }
71
+ });
36
72
  Object.defineProperty(exports, "unstable_resetCleanupTracking", {
37
73
  enumerable: true,
38
74
  get: function () {
39
75
  return _useInstanceEventHandler.unstable_resetCleanupTracking;
40
76
  }
41
77
  });
78
+ Object.defineProperty(exports, "useSelector", {
79
+ enumerable: true,
80
+ get: function () {
81
+ return _useSelector.useSelector;
82
+ }
83
+ });
42
84
  Object.defineProperty(exports, "useTreeView", {
43
85
  enumerable: true,
44
86
  get: function () {
@@ -103,12 +145,16 @@ var _useTreeView = require("./useTreeView");
103
145
  var _TreeViewProvider = require("./TreeViewProvider");
104
146
  var _RichTreeViewItems = require("./components/RichTreeViewItems");
105
147
  var _useInstanceEventHandler = require("./hooks/useInstanceEventHandler");
148
+ var _useSelector = require("./hooks/useSelector");
106
149
  var _useTreeViewExpansion = require("./plugins/useTreeViewExpansion");
107
150
  var _useTreeViewSelection = require("./plugins/useTreeViewSelection");
108
151
  var _useTreeViewFocus = require("./plugins/useTreeViewFocus");
109
152
  var _useTreeViewKeyboardNavigation = require("./plugins/useTreeViewKeyboardNavigation");
110
153
  var _useTreeViewIcons = require("./plugins/useTreeViewIcons");
111
154
  var _useTreeViewItems = require("./plugins/useTreeViewItems");
155
+ var _useTreeViewItems2 = require("./plugins/useTreeViewItems/useTreeViewItems.selectors");
112
156
  var _useTreeViewLabel = require("./plugins/useTreeViewLabel");
113
157
  var _useTreeViewJSXItems = require("./plugins/useTreeViewJSXItems");
114
- var _tree = require("./utils/tree");
158
+ var _selectors = require("./utils/selectors");
159
+ var _tree = require("./utils/tree");
160
+ var _TreeViewStore = require("./utils/TreeViewStore");
@@ -1,38 +1,55 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.useTreeViewExpansion = void 0;
9
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
- var React = _interopRequireWildcard(require("react"));
11
9
  var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
10
+ var _useEnhancedEffect = _interopRequireDefault(require("@mui/utils/useEnhancedEffect"));
11
+ var _useTreeViewExpansion = require("./useTreeViewExpansion.selectors");
12
+ var _useTreeViewExpansion2 = require("./useTreeViewExpansion.utils");
13
+ var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
12
14
  const useTreeViewExpansion = ({
13
15
  instance,
16
+ store,
14
17
  params,
15
18
  models
16
19
  }) => {
17
- const expandedItemsMap = React.useMemo(() => {
18
- const temp = new Map();
19
- models.expandedItems.value.forEach(id => {
20
- temp.set(id, true);
20
+ (0, _useEnhancedEffect.default)(() => {
21
+ store.update(prevState => (0, _extends2.default)({}, prevState, {
22
+ expansion: (0, _extends2.default)({}, prevState.expansion, {
23
+ expandedItemsMap: (0, _useTreeViewExpansion2.createExpandedItemsMap)(models.expandedItems.value)
24
+ })
25
+ }));
26
+ }, [store, models.expandedItems.value]);
27
+ (0, _useEnhancedEffect.default)(() => {
28
+ store.update(prevState => {
29
+ const newExpansionTrigger = (0, _useTreeViewExpansion2.getExpansionTrigger)({
30
+ isItemEditable: params.isItemEditable,
31
+ expansionTrigger: params.expansionTrigger
32
+ });
33
+ if (prevState.expansion.expansionTrigger === newExpansionTrigger) {
34
+ return prevState;
35
+ }
36
+ return (0, _extends2.default)({}, prevState, {
37
+ expansion: (0, _extends2.default)({}, prevState.expansion, {
38
+ expansionTrigger: newExpansionTrigger
39
+ })
40
+ });
21
41
  });
22
- return temp;
23
- }, [models.expandedItems.value]);
42
+ }, [store, params.isItemEditable, params.expansionTrigger]);
24
43
  const setExpandedItems = (event, value) => {
25
44
  params.onExpandedItemsChange?.(event, value);
26
45
  models.expandedItems.setControlledValue(value);
27
46
  };
28
- const isItemExpanded = React.useCallback(itemId => expandedItemsMap.has(itemId), [expandedItemsMap]);
29
- const isItemExpandable = React.useCallback(itemId => !!instance.getItemMeta(itemId)?.expandable, [instance]);
30
47
  const toggleItemExpansion = (0, _useEventCallback.default)((event, itemId) => {
31
- const isExpandedBefore = instance.isItemExpanded(itemId);
48
+ const isExpandedBefore = (0, _useTreeViewExpansion.selectorIsItemExpanded)(store.value, itemId);
32
49
  instance.setItemExpansion(event, itemId, !isExpandedBefore);
33
50
  });
34
51
  const setItemExpansion = (0, _useEventCallback.default)((event, itemId, isExpanded) => {
35
- const isExpandedBefore = instance.isItemExpanded(itemId);
52
+ const isExpandedBefore = (0, _useTreeViewExpansion.selectorIsItemExpanded)(store.value, itemId);
36
53
  if (isExpandedBefore === isExpanded) {
37
54
  return;
38
55
  }
@@ -48,9 +65,12 @@ const useTreeViewExpansion = ({
48
65
  setExpandedItems(event, newExpanded);
49
66
  });
50
67
  const expandAllSiblings = (event, itemId) => {
51
- const itemMeta = instance.getItemMeta(itemId);
52
- const siblings = instance.getItemOrderedChildrenIds(itemMeta.parentId);
53
- const diff = siblings.filter(child => instance.isItemExpandable(child) && !instance.isItemExpanded(child));
68
+ const itemMeta = (0, _useTreeViewItems.selectorItemMeta)(store.value, itemId);
69
+ if (itemMeta == null) {
70
+ return;
71
+ }
72
+ const siblings = (0, _useTreeViewItems.selectorItemOrderedChildrenIds)(store.value, itemMeta.parentId);
73
+ const diff = siblings.filter(child => (0, _useTreeViewExpansion.selectorIsItemExpandable)(store.value, child) && !(0, _useTreeViewExpansion.selectorIsItemExpanded)(store.value, child));
54
74
  const newExpanded = models.expandedItems.value.concat(diff);
55
75
  if (diff.length > 0) {
56
76
  if (params.onItemExpansionToggle) {
@@ -61,30 +81,14 @@ const useTreeViewExpansion = ({
61
81
  setExpandedItems(event, newExpanded);
62
82
  }
63
83
  };
64
- const expansionTrigger = React.useMemo(() => {
65
- if (params.expansionTrigger) {
66
- return params.expansionTrigger;
67
- }
68
- if (instance.isTreeViewEditable) {
69
- return 'iconContainer';
70
- }
71
- return 'content';
72
- }, [params.expansionTrigger, instance.isTreeViewEditable]);
73
84
  return {
74
85
  publicAPI: {
75
86
  setItemExpansion
76
87
  },
77
88
  instance: {
78
- isItemExpanded,
79
- isItemExpandable,
80
89
  setItemExpansion,
81
90
  toggleItemExpansion,
82
91
  expandAllSiblings
83
- },
84
- contextValue: {
85
- expansion: {
86
- expansionTrigger
87
- }
88
92
  }
89
93
  };
90
94
  };
@@ -100,6 +104,12 @@ useTreeViewExpansion.getDefaultizedParams = ({
100
104
  }) => (0, _extends2.default)({}, params, {
101
105
  defaultExpandedItems: params.defaultExpandedItems ?? DEFAULT_EXPANDED_ITEMS
102
106
  });
107
+ useTreeViewExpansion.getInitialState = params => ({
108
+ expansion: {
109
+ expandedItemsMap: (0, _useTreeViewExpansion2.createExpandedItemsMap)(params.expandedItems === undefined ? params.defaultExpandedItems : params.expandedItems),
110
+ expansionTrigger: (0, _useTreeViewExpansion2.getExpansionTrigger)(params)
111
+ }
112
+ });
103
113
  useTreeViewExpansion.params = {
104
114
  expandedItems: true,
105
115
  defaultExpandedItems: true,
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.selectorItemExpansionTrigger = exports.selectorIsItemExpanded = exports.selectorIsItemExpandable = void 0;
7
+ var _selectors = require("../../utils/selectors");
8
+ var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors");
9
+ const selectorExpansion = state => state.expansion;
10
+
11
+ /**
12
+ * Check if an item is expanded.
13
+ * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
14
+ * @returns {boolean} `true` if the item is expanded, `false` otherwise.
15
+ */
16
+ const selectorIsItemExpanded = exports.selectorIsItemExpanded = (0, _selectors.createSelector)([selectorExpansion, (_, itemId) => itemId], (expansionState, itemId) => expansionState.expandedItemsMap.has(itemId));
17
+
18
+ /**
19
+ * Check if an item is expandable.
20
+ * @param {TreeViewState<[UseTreeViewItemsSignature]>} state The state of the tree view.
21
+ * @returns {boolean} `true` if the item is expandable, `false` otherwise.
22
+ */
23
+ const selectorIsItemExpandable = exports.selectorIsItemExpandable = (0, _selectors.createSelector)([_useTreeViewItems.selectorItemMeta], itemMeta => itemMeta?.expandable ?? false);
24
+
25
+ /**
26
+ * Get the slot that triggers the item's expansion when clicked.
27
+ * @param {TreeViewState<[UseTreeViewExpansionSignature]>} state The state of the tree view.
28
+ * @returns {'content' | 'iconContainer'} The slot that triggers the item's expansion when clicked. Is `null` if the item is not expandable.
29
+ */
30
+ const selectorItemExpansionTrigger = exports.selectorItemExpansionTrigger = (0, _selectors.createSelector)([selectorExpansion], expansionState => expansionState.expansionTrigger);
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getExpansionTrigger = exports.createExpandedItemsMap = void 0;
7
+ const createExpandedItemsMap = expandedItems => {
8
+ const expandedItemsMap = new Map();
9
+ expandedItems.forEach(id => {
10
+ expandedItemsMap.set(id, true);
11
+ });
12
+ return expandedItemsMap;
13
+ };
14
+ exports.createExpandedItemsMap = createExpandedItemsMap;
15
+ const getExpansionTrigger = ({
16
+ isItemEditable,
17
+ expansionTrigger
18
+ }) => {
19
+ if (expansionTrigger) {
20
+ return expansionTrigger;
21
+ }
22
+ if (isItemEditable) {
23
+ return 'iconContainer';
24
+ }
25
+ return 'content';
26
+ };
27
+ exports.getExpansionTrigger = getExpansionTrigger;