@hitachivantara/uikit-react-core 5.0.0-next.16 → 5.0.0-next.18

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 (179) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/AppSwitcher/Action/Action.cjs.map +1 -1
  3. package/dist/cjs/components/AppSwitcher/AppSwitcher.cjs.map +1 -1
  4. package/dist/cjs/components/Banner/Banner.cjs +1 -1
  5. package/dist/cjs/components/Banner/Banner.cjs.map +1 -1
  6. package/dist/cjs/components/Banner/BannerContent/ActionContainer/ActionContainer.cjs.map +1 -1
  7. package/dist/cjs/components/Banner/BannerContent/BannerContent.cjs +1 -1
  8. package/dist/cjs/components/Banner/BannerContent/BannerContent.cjs.map +1 -1
  9. package/dist/cjs/components/BaseDropdown/BaseDropdown.cjs +1 -1
  10. package/dist/cjs/components/DropDownMenu/DropDownMenu.cjs +1 -1
  11. package/dist/cjs/components/DropDownMenu/DropDownMenu.cjs.map +1 -1
  12. package/dist/cjs/components/FileUploader/DropZone/DropZone.cjs +1 -1
  13. package/dist/cjs/components/FileUploader/DropZone/DropZone.cjs.map +1 -1
  14. package/dist/cjs/components/Forms/FormElement/FormElement.cjs.map +1 -1
  15. package/dist/cjs/components/Forms/Suggestions/Suggestions.cjs +2 -2
  16. package/dist/cjs/components/Forms/Suggestions/Suggestions.cjs.map +1 -1
  17. package/dist/cjs/components/Input/Input.cjs.map +1 -1
  18. package/dist/cjs/components/List/List.cjs +4 -3
  19. package/dist/cjs/components/List/List.cjs.map +1 -1
  20. package/dist/cjs/components/List/utils.cjs +0 -10
  21. package/dist/cjs/components/List/utils.cjs.map +1 -1
  22. package/dist/cjs/components/Pagination/Pagination.cjs +4 -4
  23. package/dist/cjs/components/Pagination/Pagination.cjs.map +1 -1
  24. package/dist/cjs/components/SelectionList/SelectionList.cjs.map +1 -1
  25. package/dist/cjs/components/Table/TableHeader/TableHeader.cjs +7 -10
  26. package/dist/cjs/components/Table/TableHeader/TableHeader.cjs.map +1 -1
  27. package/dist/cjs/components/Table/TableHeader/TableHeader.styles.cjs +4 -5
  28. package/dist/cjs/components/Table/TableHeader/TableHeader.styles.cjs.map +1 -1
  29. package/dist/cjs/components/Table/TableRow/TableRow.cjs +8 -1
  30. package/dist/cjs/components/Table/TableRow/TableRow.cjs.map +1 -1
  31. package/dist/cjs/components/TagsInput/TagsInput.cjs.map +1 -1
  32. package/dist/cjs/components/ToggleButton/ToggleButton.cjs +2 -2
  33. package/dist/cjs/components/ToggleButton/ToggleButton.cjs.map +1 -1
  34. package/dist/cjs/components/VerticalNavigation/Actions/Action.cjs +45 -0
  35. package/dist/cjs/components/VerticalNavigation/Actions/Action.cjs.map +1 -0
  36. package/dist/cjs/components/VerticalNavigation/Actions/Action.styles.cjs +51 -0
  37. package/dist/cjs/components/VerticalNavigation/Actions/Action.styles.cjs.map +1 -0
  38. package/dist/cjs/components/VerticalNavigation/Actions/Actions.cjs +30 -0
  39. package/dist/cjs/components/VerticalNavigation/Actions/Actions.cjs.map +1 -0
  40. package/dist/cjs/components/VerticalNavigation/Actions/Actions.styles.cjs +26 -0
  41. package/dist/cjs/components/VerticalNavigation/Actions/Actions.styles.cjs.map +1 -0
  42. package/dist/cjs/components/VerticalNavigation/Actions/actionClasses.cjs +8 -0
  43. package/dist/cjs/components/VerticalNavigation/Actions/actionClasses.cjs.map +1 -0
  44. package/dist/cjs/components/VerticalNavigation/Actions/actionsClasses.cjs +8 -0
  45. package/dist/cjs/components/VerticalNavigation/Actions/actionsClasses.cjs.map +1 -0
  46. package/dist/cjs/components/VerticalNavigation/Header/Header.cjs +45 -0
  47. package/dist/cjs/components/VerticalNavigation/Header/Header.cjs.map +1 -0
  48. package/dist/cjs/components/VerticalNavigation/Header/Header.styles.cjs +23 -0
  49. package/dist/cjs/components/VerticalNavigation/Header/Header.styles.cjs.map +1 -0
  50. package/dist/cjs/components/VerticalNavigation/Header/headerClasses.cjs +8 -0
  51. package/dist/cjs/components/VerticalNavigation/Header/headerClasses.cjs.map +1 -0
  52. package/dist/cjs/components/VerticalNavigation/Navigation/Navigation.cjs +134 -0
  53. package/dist/cjs/components/VerticalNavigation/Navigation/Navigation.cjs.map +1 -0
  54. package/dist/cjs/components/VerticalNavigation/Navigation/Navigation.styles.cjs +22 -0
  55. package/dist/cjs/components/VerticalNavigation/Navigation/Navigation.styles.cjs.map +1 -0
  56. package/dist/cjs/components/VerticalNavigation/Navigation/navigationClasses.cjs +8 -0
  57. package/dist/cjs/components/VerticalNavigation/Navigation/navigationClasses.cjs.map +1 -0
  58. package/dist/cjs/components/VerticalNavigation/TreeView/TreeView.cjs +643 -0
  59. package/dist/cjs/components/VerticalNavigation/TreeView/TreeView.cjs.map +1 -0
  60. package/dist/cjs/components/VerticalNavigation/TreeView/TreeView.styles.cjs +21 -0
  61. package/dist/cjs/components/VerticalNavigation/TreeView/TreeView.styles.cjs.map +1 -0
  62. package/dist/cjs/components/VerticalNavigation/TreeView/TreeViewContext.cjs +10 -0
  63. package/dist/cjs/components/VerticalNavigation/TreeView/TreeViewContext.cjs.map +1 -0
  64. package/dist/cjs/components/VerticalNavigation/TreeView/TreeViewItem.cjs +282 -0
  65. package/dist/cjs/components/VerticalNavigation/TreeView/TreeViewItem.cjs.map +1 -0
  66. package/dist/cjs/components/VerticalNavigation/TreeView/TreeViewItem.styles.cjs +132 -0
  67. package/dist/cjs/components/VerticalNavigation/TreeView/TreeViewItem.styles.cjs.map +1 -0
  68. package/dist/cjs/components/VerticalNavigation/TreeView/descendants.cjs +134 -0
  69. package/dist/cjs/components/VerticalNavigation/TreeView/descendants.cjs.map +1 -0
  70. package/dist/cjs/components/VerticalNavigation/TreeView/treeViewClasses.cjs +8 -0
  71. package/dist/cjs/components/VerticalNavigation/TreeView/treeViewClasses.cjs.map +1 -0
  72. package/dist/cjs/components/VerticalNavigation/TreeView/treeViewItemClasses.cjs +8 -0
  73. package/dist/cjs/components/VerticalNavigation/TreeView/treeViewItemClasses.cjs.map +1 -0
  74. package/dist/cjs/components/VerticalNavigation/VerticalNavigation.cjs +40 -0
  75. package/dist/cjs/components/VerticalNavigation/VerticalNavigation.cjs.map +1 -0
  76. package/dist/cjs/components/VerticalNavigation/VerticalNavigation.styles.cjs +43 -0
  77. package/dist/cjs/components/VerticalNavigation/VerticalNavigation.styles.cjs.map +1 -0
  78. package/dist/cjs/components/VerticalNavigation/verticalNavigationClasses.cjs +8 -0
  79. package/dist/cjs/components/VerticalNavigation/verticalNavigationClasses.cjs.map +1 -0
  80. package/dist/cjs/hocs/withTooltip.cjs.map +1 -1
  81. package/dist/cjs/hooks/useClickOutside.cjs.map +1 -1
  82. package/dist/cjs/hooks/useEnhancedEffect.cjs +6 -0
  83. package/dist/cjs/hooks/useEnhancedEffect.cjs.map +1 -0
  84. package/dist/cjs/index.cjs +37 -0
  85. package/dist/cjs/index.cjs.map +1 -1
  86. package/dist/cjs/providers/ThemeProvider.cjs +4 -1
  87. package/dist/cjs/providers/ThemeProvider.cjs.map +1 -1
  88. package/dist/cjs/utils/wrapperTooltip.cjs +13 -0
  89. package/dist/cjs/utils/wrapperTooltip.cjs.map +1 -0
  90. package/dist/esm/components/AppSwitcher/Action/Action.js.map +1 -1
  91. package/dist/esm/components/AppSwitcher/AppSwitcher.js.map +1 -1
  92. package/dist/esm/components/Banner/Banner.js +1 -1
  93. package/dist/esm/components/Banner/Banner.js.map +1 -1
  94. package/dist/esm/components/Banner/BannerContent/ActionContainer/ActionContainer.js.map +1 -1
  95. package/dist/esm/components/Banner/BannerContent/BannerContent.js +1 -1
  96. package/dist/esm/components/Banner/BannerContent/BannerContent.js.map +1 -1
  97. package/dist/esm/components/BaseDropdown/BaseDropdown.js +1 -1
  98. package/dist/esm/components/DropDownMenu/DropDownMenu.js +1 -1
  99. package/dist/esm/components/DropDownMenu/DropDownMenu.js.map +1 -1
  100. package/dist/esm/components/FileUploader/DropZone/DropZone.js +1 -1
  101. package/dist/esm/components/FileUploader/DropZone/DropZone.js.map +1 -1
  102. package/dist/esm/components/Forms/FormElement/FormElement.js.map +1 -1
  103. package/dist/esm/components/Forms/Suggestions/Suggestions.js +2 -2
  104. package/dist/esm/components/Forms/Suggestions/Suggestions.js.map +1 -1
  105. package/dist/esm/components/Input/Input.js.map +1 -1
  106. package/dist/esm/components/List/List.js +2 -1
  107. package/dist/esm/components/List/List.js.map +1 -1
  108. package/dist/esm/components/List/utils.js +1 -11
  109. package/dist/esm/components/List/utils.js.map +1 -1
  110. package/dist/esm/components/Pagination/Pagination.js +4 -4
  111. package/dist/esm/components/Pagination/Pagination.js.map +1 -1
  112. package/dist/esm/components/SelectionList/SelectionList.js.map +1 -1
  113. package/dist/esm/components/Table/TableHeader/TableHeader.js +7 -10
  114. package/dist/esm/components/Table/TableHeader/TableHeader.js.map +1 -1
  115. package/dist/esm/components/Table/TableHeader/TableHeader.styles.js +4 -5
  116. package/dist/esm/components/Table/TableHeader/TableHeader.styles.js.map +1 -1
  117. package/dist/esm/components/Table/TableRow/TableRow.js +8 -1
  118. package/dist/esm/components/Table/TableRow/TableRow.js.map +1 -1
  119. package/dist/esm/components/TagsInput/TagsInput.js.map +1 -1
  120. package/dist/esm/components/ToggleButton/ToggleButton.js +2 -2
  121. package/dist/esm/components/ToggleButton/ToggleButton.js.map +1 -1
  122. package/dist/esm/components/VerticalNavigation/Actions/Action.js +43 -0
  123. package/dist/esm/components/VerticalNavigation/Actions/Action.js.map +1 -0
  124. package/dist/esm/components/VerticalNavigation/Actions/Action.styles.js +49 -0
  125. package/dist/esm/components/VerticalNavigation/Actions/Action.styles.js.map +1 -0
  126. package/dist/esm/components/VerticalNavigation/Actions/Actions.js +28 -0
  127. package/dist/esm/components/VerticalNavigation/Actions/Actions.js.map +1 -0
  128. package/dist/esm/components/VerticalNavigation/Actions/Actions.styles.js +24 -0
  129. package/dist/esm/components/VerticalNavigation/Actions/Actions.styles.js.map +1 -0
  130. package/dist/esm/components/VerticalNavigation/Actions/actionClasses.js +8 -0
  131. package/dist/esm/components/VerticalNavigation/Actions/actionClasses.js.map +1 -0
  132. package/dist/esm/components/VerticalNavigation/Actions/actionsClasses.js +8 -0
  133. package/dist/esm/components/VerticalNavigation/Actions/actionsClasses.js.map +1 -0
  134. package/dist/esm/components/VerticalNavigation/Header/Header.js +43 -0
  135. package/dist/esm/components/VerticalNavigation/Header/Header.js.map +1 -0
  136. package/dist/esm/components/VerticalNavigation/Header/Header.styles.js +21 -0
  137. package/dist/esm/components/VerticalNavigation/Header/Header.styles.js.map +1 -0
  138. package/dist/esm/components/VerticalNavigation/Header/headerClasses.js +8 -0
  139. package/dist/esm/components/VerticalNavigation/Header/headerClasses.js.map +1 -0
  140. package/dist/esm/components/VerticalNavigation/Navigation/Navigation.js +132 -0
  141. package/dist/esm/components/VerticalNavigation/Navigation/Navigation.js.map +1 -0
  142. package/dist/esm/components/VerticalNavigation/Navigation/Navigation.styles.js +20 -0
  143. package/dist/esm/components/VerticalNavigation/Navigation/Navigation.styles.js.map +1 -0
  144. package/dist/esm/components/VerticalNavigation/Navigation/navigationClasses.js +8 -0
  145. package/dist/esm/components/VerticalNavigation/Navigation/navigationClasses.js.map +1 -0
  146. package/dist/esm/components/VerticalNavigation/TreeView/TreeView.js +641 -0
  147. package/dist/esm/components/VerticalNavigation/TreeView/TreeView.js.map +1 -0
  148. package/dist/esm/components/VerticalNavigation/TreeView/TreeView.styles.js +19 -0
  149. package/dist/esm/components/VerticalNavigation/TreeView/TreeView.styles.js.map +1 -0
  150. package/dist/esm/components/VerticalNavigation/TreeView/TreeViewContext.js +10 -0
  151. package/dist/esm/components/VerticalNavigation/TreeView/TreeViewContext.js.map +1 -0
  152. package/dist/esm/components/VerticalNavigation/TreeView/TreeViewItem.js +280 -0
  153. package/dist/esm/components/VerticalNavigation/TreeView/TreeViewItem.js.map +1 -0
  154. package/dist/esm/components/VerticalNavigation/TreeView/TreeViewItem.styles.js +130 -0
  155. package/dist/esm/components/VerticalNavigation/TreeView/TreeViewItem.styles.js.map +1 -0
  156. package/dist/esm/components/VerticalNavigation/TreeView/descendants.js +134 -0
  157. package/dist/esm/components/VerticalNavigation/TreeView/descendants.js.map +1 -0
  158. package/dist/esm/components/VerticalNavigation/TreeView/treeViewClasses.js +8 -0
  159. package/dist/esm/components/VerticalNavigation/TreeView/treeViewClasses.js.map +1 -0
  160. package/dist/esm/components/VerticalNavigation/TreeView/treeViewItemClasses.js +8 -0
  161. package/dist/esm/components/VerticalNavigation/TreeView/treeViewItemClasses.js.map +1 -0
  162. package/dist/esm/components/VerticalNavigation/VerticalNavigation.js +38 -0
  163. package/dist/esm/components/VerticalNavigation/VerticalNavigation.js.map +1 -0
  164. package/dist/esm/components/VerticalNavigation/VerticalNavigation.styles.js +41 -0
  165. package/dist/esm/components/VerticalNavigation/VerticalNavigation.styles.js.map +1 -0
  166. package/dist/esm/components/VerticalNavigation/verticalNavigationClasses.js +8 -0
  167. package/dist/esm/components/VerticalNavigation/verticalNavigationClasses.js.map +1 -0
  168. package/dist/esm/hocs/withTooltip.js.map +1 -1
  169. package/dist/esm/hooks/useClickOutside.js.map +1 -1
  170. package/dist/esm/hooks/useEnhancedEffect.js +6 -0
  171. package/dist/esm/hooks/useEnhancedEffect.js.map +1 -0
  172. package/dist/esm/index.js +55 -18
  173. package/dist/esm/index.js.map +1 -1
  174. package/dist/esm/providers/ThemeProvider.js +4 -1
  175. package/dist/esm/providers/ThemeProvider.js.map +1 -1
  176. package/dist/esm/utils/wrapperTooltip.js +13 -0
  177. package/dist/esm/utils/wrapperTooltip.js.map +1 -0
  178. package/dist/types/index.d.ts +560 -50
  179. package/package.json +3 -3
@@ -0,0 +1,641 @@
1
+ import { forwardRef, useRef, useState, useCallback, useMemo } from "react";
2
+ import clsx from "clsx";
3
+ import { TreeViewControlContext, TreeViewStateContext } from "./TreeViewContext.js";
4
+ import { DescendantProvider } from "./descendants.js";
5
+ import { StyledRoot } from "./TreeView.styles.js";
6
+ import treeViewClasses from "./treeViewClasses.js";
7
+ import { jsx } from "@emotion/react/jsx-runtime";
8
+ import useUniqueId from "../../../hooks/useUniqueId.js";
9
+ import useForkRef from "../../../hooks/useForkRef.js";
10
+ import { useControlled } from "../../../hooks/useControlled.js";
11
+ function isPrintableCharacter(string) {
12
+ return string && string.length === 1 && string.match(/\S/);
13
+ }
14
+ function findNextFirstChar(firstChars, startIndex, char) {
15
+ for (let i = startIndex; i < firstChars.length; i += 1) {
16
+ if (char === firstChars[i]) {
17
+ return i;
18
+ }
19
+ }
20
+ return -1;
21
+ }
22
+ function noopSelection() {
23
+ return false;
24
+ }
25
+ const HvVerticalNavigationTreeView = forwardRef((props, ref) => {
26
+ const {
27
+ id: idProp,
28
+ className,
29
+ classes,
30
+ mode = "treeview",
31
+ collapsible = false,
32
+ expanded: expandedProp,
33
+ defaultExpanded = [],
34
+ onToggle,
35
+ selectable = false,
36
+ multiSelect: multiSelectProp = false,
37
+ selected: selectedProp,
38
+ defaultSelected = [],
39
+ onChange,
40
+ disabledItemsFocusable = false,
41
+ onFocus,
42
+ onBlur,
43
+ onKeyDown,
44
+ children,
45
+ ...others
46
+ } = props;
47
+ const treeviewMode = mode === "treeview";
48
+ const multiSelect = selectable && multiSelectProp;
49
+ const treeId = useUniqueId(idProp, "hvtreeview");
50
+ const treeRef = useRef(null);
51
+ const handleRef = useForkRef(treeRef, ref);
52
+ const [expanded, setExpandedState] = useControlled(expandedProp, defaultExpanded);
53
+ const [selected, setSelectedState] = useControlled(selectedProp, defaultSelected);
54
+ const [focusedNodeId, setFocusedNodeId] = useState(null);
55
+ const nodeMap = useRef({});
56
+ const firstCharMap = useRef({});
57
+ const isExpanded = useCallback((id) => !collapsible || (Array.isArray(expanded) ? expanded.indexOf(id) !== -1 : false), [collapsible, expanded]);
58
+ const isExpandable = useCallback((id) => collapsible && nodeMap.current[id] && nodeMap.current[id].expandable, [collapsible]);
59
+ const isSelected = useCallback((id) => selectable && (Array.isArray(selected) ? selected.indexOf(id) !== -1 : selected === id), [selectable, selected]);
60
+ const isSelectable = useCallback((id) => selectable && nodeMap.current[id] && nodeMap.current[id].selectable, [selectable]);
61
+ const isDisabled = useCallback((id) => {
62
+ let node = nodeMap.current[id];
63
+ if (!node) {
64
+ return false;
65
+ }
66
+ if (node.disabled) {
67
+ return true;
68
+ }
69
+ while (node.parentId != null) {
70
+ node = nodeMap.current[node.parentId];
71
+ if (node.disabled) {
72
+ return true;
73
+ }
74
+ }
75
+ return false;
76
+ }, []);
77
+ const isFocused = useCallback((id) => focusedNodeId === id, [focusedNodeId]);
78
+ const isChildSelected = useCallback((id) => selected.startsWith(id), [selected]);
79
+ const getChildrenIds = (id) => Object.keys(nodeMap.current).map((key) => {
80
+ return nodeMap.current[key];
81
+ }).filter((node) => node.parentId === id).sort((a, b) => a.index - b.index).map((child) => child.id);
82
+ const getNavigableChildrenIds = useCallback((id) => {
83
+ let childrenIds = getChildrenIds(id);
84
+ if (!disabledItemsFocusable) {
85
+ childrenIds = childrenIds.filter((node) => !isDisabled(node));
86
+ }
87
+ return childrenIds;
88
+ }, [disabledItemsFocusable, isDisabled]);
89
+ const getNextNode = useCallback((id) => {
90
+ if (isExpanded(id) && getNavigableChildrenIds(id).length > 0) {
91
+ return getNavigableChildrenIds(id)[0];
92
+ }
93
+ let node = nodeMap.current[id];
94
+ while (node != null) {
95
+ const siblings = getNavigableChildrenIds(node.parentId);
96
+ const nextSibling = siblings[siblings.indexOf(node.id) + 1];
97
+ if (nextSibling) {
98
+ return nextSibling;
99
+ }
100
+ node = nodeMap.current[node.parentId];
101
+ }
102
+ return null;
103
+ }, [getNavigableChildrenIds, isExpanded]);
104
+ const getPreviousNode = (id) => {
105
+ const node = nodeMap.current[id];
106
+ const siblings = getNavigableChildrenIds(node.parentId);
107
+ const nodeIndex = siblings.indexOf(id);
108
+ if (nodeIndex === 0) {
109
+ return node.parentId;
110
+ }
111
+ let currentNode = siblings[nodeIndex - 1];
112
+ while (isExpanded(currentNode) && getNavigableChildrenIds(currentNode).length > 0) {
113
+ currentNode = getNavigableChildrenIds(currentNode).pop();
114
+ }
115
+ return currentNode;
116
+ };
117
+ const getLastNode = () => {
118
+ let lastNode = getNavigableChildrenIds(null).pop();
119
+ while (isExpanded(lastNode)) {
120
+ lastNode = getNavigableChildrenIds(lastNode).pop();
121
+ }
122
+ return lastNode;
123
+ };
124
+ const getFirstNode = () => getNavigableChildrenIds(null)[0];
125
+ const getParent = (id) => nodeMap.current[id].parentId;
126
+ const findOrderInTremauxTree = useCallback((nodeAId, nodeBId) => {
127
+ if (nodeAId === nodeBId) {
128
+ return [nodeAId, nodeBId];
129
+ }
130
+ const nodeA = nodeMap.current[nodeAId];
131
+ const nodeB = nodeMap.current[nodeBId];
132
+ if (nodeA.parentId === nodeB.id || nodeB.parentId === nodeA.id) {
133
+ return nodeB.parentId === nodeA.id ? [nodeA.id, nodeB.id] : [nodeB.id, nodeA.id];
134
+ }
135
+ const aFamily = [nodeA.id];
136
+ const bFamily = [nodeB.id];
137
+ let aAncestor = nodeA.parentId;
138
+ let bAncestor = nodeB.parentId;
139
+ let aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1;
140
+ let bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1;
141
+ let continueA = true;
142
+ let continueB = true;
143
+ while (!bAncestorIsCommon && !aAncestorIsCommon) {
144
+ if (continueA) {
145
+ aFamily.push(aAncestor);
146
+ aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1;
147
+ continueA = aAncestor !== null;
148
+ if (!aAncestorIsCommon && continueA) {
149
+ aAncestor = nodeMap.current[aAncestor].parentId;
150
+ }
151
+ }
152
+ if (continueB && !aAncestorIsCommon) {
153
+ bFamily.push(bAncestor);
154
+ bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1;
155
+ continueB = bAncestor !== null;
156
+ if (!bAncestorIsCommon && continueB) {
157
+ bAncestor = nodeMap.current[bAncestor].parentId;
158
+ }
159
+ }
160
+ }
161
+ const commonAncestor = aAncestorIsCommon ? aAncestor : bAncestor;
162
+ const ancestorFamily = getChildrenIds(commonAncestor);
163
+ const aSide = aFamily[aFamily.indexOf(commonAncestor) - 1];
164
+ const bSide = bFamily[bFamily.indexOf(commonAncestor) - 1];
165
+ return ancestorFamily.indexOf(aSide) < ancestorFamily.indexOf(bSide) ? [nodeAId, nodeBId] : [nodeBId, nodeAId];
166
+ }, []);
167
+ const getNodesInRange = useCallback((nodeA, nodeB) => {
168
+ if (nodeA && nodeB) {
169
+ const [first, last] = findOrderInTremauxTree(nodeA, nodeB);
170
+ const nodes = [first];
171
+ let current = first;
172
+ while (current !== last) {
173
+ current = getNextNode(current);
174
+ nodes.push(current);
175
+ }
176
+ return nodes;
177
+ }
178
+ return [];
179
+ }, [findOrderInTremauxTree, getNextNode]);
180
+ const focus = (event, id) => {
181
+ var _a;
182
+ if (id) {
183
+ setFocusedNodeId(id);
184
+ if ((_a = nodeMap.current[id]) == null ? void 0 : _a.onFocus) {
185
+ nodeMap.current[id].onFocus(event);
186
+ }
187
+ }
188
+ };
189
+ const focusNextNode = (event, id) => focus(event, getNextNode(id));
190
+ const focusPreviousNode = (event, id) => focus(event, getPreviousNode(id));
191
+ const focusFirstNode = (event) => focus(event, getFirstNode());
192
+ const focusLastNode = (event) => focus(event, getLastNode());
193
+ const focusByFirstCharacter = (event, id, char) => {
194
+ let start;
195
+ let index;
196
+ const lowercaseChar = char.toLowerCase();
197
+ const firstCharIds = [];
198
+ const firstChars = [];
199
+ Object.keys(firstCharMap.current).forEach((nodeId) => {
200
+ const firstChar = firstCharMap.current[nodeId];
201
+ const map = nodeMap.current[nodeId];
202
+ const visible = map.parentId ? isExpanded(map.parentId) : true;
203
+ const shouldBeSkipped = disabledItemsFocusable ? false : isDisabled(nodeId);
204
+ if (visible && !shouldBeSkipped) {
205
+ firstCharIds.push(nodeId);
206
+ firstChars.push(firstChar);
207
+ }
208
+ });
209
+ start = firstCharIds.indexOf(id) + 1;
210
+ if (start >= firstCharIds.length) {
211
+ start = 0;
212
+ }
213
+ index = findNextFirstChar(firstChars, start, lowercaseChar);
214
+ if (index === -1) {
215
+ index = findNextFirstChar(firstChars, 0, lowercaseChar);
216
+ }
217
+ if (index > -1) {
218
+ focus(event, firstCharIds[index]);
219
+ }
220
+ };
221
+ const toggleExpansion = useCallback((event, value = focusedNodeId) => {
222
+ let newExpanded;
223
+ if (expanded.indexOf(value) !== -1) {
224
+ newExpanded = expanded.filter((id) => id !== value);
225
+ } else {
226
+ newExpanded = [value].concat(expanded);
227
+ }
228
+ if (onToggle) {
229
+ onToggle(event, newExpanded);
230
+ }
231
+ setExpandedState(newExpanded);
232
+ }, [expanded, focusedNodeId, onToggle, setExpandedState]);
233
+ const expandAllSiblings = (event, id) => {
234
+ const map = nodeMap.current[id];
235
+ const siblings = getChildrenIds(map.parentId);
236
+ const diff = siblings.filter((child) => isExpandable(child) && !isExpanded(child));
237
+ const newExpanded = expanded.concat(diff);
238
+ if (diff.length > 0) {
239
+ setExpandedState(newExpanded);
240
+ if (onToggle) {
241
+ onToggle(event, newExpanded);
242
+ }
243
+ }
244
+ };
245
+ const lastSelectedNode = useRef(null);
246
+ const lastSelectionWasRange = useRef(false);
247
+ const currentRangeSelection = useRef([]);
248
+ const isDivElement = (element) => {
249
+ return element.nodeType === 1;
250
+ };
251
+ const handleRangeArrowSelect = useCallback((event, nodes) => {
252
+ let base = selected.slice();
253
+ const {
254
+ start,
255
+ next,
256
+ current
257
+ } = nodes;
258
+ if (!next || !current) {
259
+ return;
260
+ }
261
+ if (isDivElement(current) && currentRangeSelection.current.indexOf(current) === -1) {
262
+ currentRangeSelection.current = [];
263
+ }
264
+ if (lastSelectionWasRange.current) {
265
+ if (isDivElement(next) && currentRangeSelection.current.indexOf(next) !== -1) {
266
+ base = base.filter((id) => id === start || id !== current);
267
+ currentRangeSelection.current = currentRangeSelection.current.filter((id) => id === start || id !== current);
268
+ } else {
269
+ base.push(next);
270
+ currentRangeSelection.current.push(next);
271
+ }
272
+ } else {
273
+ base.push(next);
274
+ currentRangeSelection.current.push(current, next);
275
+ }
276
+ if (onChange) {
277
+ onChange(event, base, base.map((id) => {
278
+ var _a;
279
+ return (_a = nodeMap.current[id]) == null ? void 0 : _a.payload;
280
+ }));
281
+ }
282
+ setSelectedState(base);
283
+ }, [onChange, selected, setSelectedState]);
284
+ const handleRangeSelect = useCallback((event, nodes) => {
285
+ let base = selected.slice();
286
+ const {
287
+ start,
288
+ end
289
+ } = nodes;
290
+ if (lastSelectionWasRange.current) {
291
+ base = base.filter((id) => currentRangeSelection.current.indexOf(id) === -1);
292
+ }
293
+ let range = getNodesInRange(start, end);
294
+ range = range.filter((node) => !isDisabled(node));
295
+ currentRangeSelection.current = range;
296
+ let newSelected = base.concat(range);
297
+ newSelected = newSelected.filter((id, i) => newSelected.indexOf(id) === i);
298
+ if (onChange) {
299
+ onChange(event, newSelected, newSelected.map((id) => {
300
+ var _a;
301
+ return (_a = nodeMap.current[id]) == null ? void 0 : _a.payload;
302
+ }));
303
+ }
304
+ setSelectedState(newSelected);
305
+ }, [getNodesInRange, isDisabled, onChange, selected, setSelectedState]);
306
+ const handleMultipleSelect = useCallback((event, value) => {
307
+ let newSelected;
308
+ if (selected.indexOf(value) !== -1) {
309
+ newSelected = selected.filter((id) => id !== value);
310
+ } else {
311
+ newSelected = [value].concat(selected);
312
+ }
313
+ if (onChange) {
314
+ onChange(event, newSelected, newSelected.map((id) => {
315
+ var _a;
316
+ return (_a = nodeMap.current[id]) == null ? void 0 : _a.payload;
317
+ }));
318
+ }
319
+ setSelectedState(newSelected);
320
+ }, [onChange, selected, setSelectedState]);
321
+ const handleSingleSelect = useCallback((event, value) => {
322
+ var _a;
323
+ const newSelected = multiSelect ? [value] : value;
324
+ if (onChange) {
325
+ const nodeValue = (_a = nodeMap.current[newSelected]) == null ? void 0 : _a.payload;
326
+ onChange(event, newSelected, multiSelect ? [nodeValue] : nodeValue);
327
+ }
328
+ setSelectedState(newSelected);
329
+ }, [multiSelect, onChange, setSelectedState]);
330
+ const selectNode = useCallback((event, id, multiple = false) => {
331
+ if (id && isSelectable(id)) {
332
+ if (multiple) {
333
+ handleMultipleSelect(event, id);
334
+ } else {
335
+ handleSingleSelect(event, id);
336
+ }
337
+ lastSelectedNode.current = id;
338
+ lastSelectionWasRange.current = false;
339
+ currentRangeSelection.current = [];
340
+ return true;
341
+ }
342
+ return false;
343
+ }, [handleMultipleSelect, handleSingleSelect, isSelectable]);
344
+ const selectRange = useCallback((event, nodes, stacked = false) => {
345
+ const {
346
+ start = lastSelectedNode.current,
347
+ end,
348
+ current
349
+ } = nodes;
350
+ if (stacked) {
351
+ handleRangeArrowSelect(event, {
352
+ start,
353
+ next: end,
354
+ current
355
+ });
356
+ } else if (start != null && end != null) {
357
+ handleRangeSelect(event, {
358
+ start,
359
+ end
360
+ });
361
+ }
362
+ lastSelectionWasRange.current = true;
363
+ }, [handleRangeArrowSelect, handleRangeSelect]);
364
+ const rangeSelectToFirst = (event, id) => {
365
+ if (!lastSelectedNode.current) {
366
+ lastSelectedNode.current = id;
367
+ }
368
+ const start = lastSelectionWasRange.current ? lastSelectedNode.current : id;
369
+ selectRange(event, {
370
+ start,
371
+ end: getFirstNode()
372
+ });
373
+ };
374
+ const rangeSelectToLast = (event, id) => {
375
+ if (!lastSelectedNode.current) {
376
+ lastSelectedNode.current = id;
377
+ }
378
+ const start = lastSelectionWasRange.current ? lastSelectedNode.current : id;
379
+ selectRange(event, {
380
+ start,
381
+ end: getLastNode()
382
+ });
383
+ };
384
+ const selectNextNode = (event, id) => {
385
+ if (!isDisabled(getNextNode(id))) {
386
+ selectRange(event, {
387
+ end: getNextNode(id),
388
+ current: id
389
+ }, true);
390
+ }
391
+ };
392
+ const selectPreviousNode = (event, id) => {
393
+ if (!isDisabled(getPreviousNode(id))) {
394
+ selectRange(event, {
395
+ end: getPreviousNode(id),
396
+ current: id
397
+ }, true);
398
+ }
399
+ };
400
+ const selectAllNodes = (event) => {
401
+ selectRange(event, {
402
+ start: getFirstNode(),
403
+ end: getLastNode()
404
+ });
405
+ };
406
+ const registerNode = useCallback((node) => {
407
+ const {
408
+ id,
409
+ index,
410
+ parentId,
411
+ expandable,
412
+ idAttribute,
413
+ disabled,
414
+ selectable: nodeSelectable,
415
+ onFocus: nodeOnFocus,
416
+ payload
417
+ } = node;
418
+ nodeMap.current[id] = {
419
+ id,
420
+ index,
421
+ parentId,
422
+ expandable,
423
+ idAttribute,
424
+ disabled,
425
+ selectable: nodeSelectable,
426
+ onFocus: nodeOnFocus,
427
+ payload
428
+ };
429
+ }, []);
430
+ const unregisterNode = useCallback((id) => {
431
+ const newMap = {
432
+ ...nodeMap.current
433
+ };
434
+ delete newMap[id];
435
+ nodeMap.current = newMap;
436
+ setFocusedNodeId((oldFocusedNodeId) => {
437
+ if (oldFocusedNodeId === id && treeRef.current && treeRef.current === (treeRef.current.ownerDocument || document).activeElement) {
438
+ return getChildrenIds(null)[0];
439
+ }
440
+ return oldFocusedNodeId;
441
+ });
442
+ }, []);
443
+ const mapFirstChar = useCallback((id, firstChar) => {
444
+ firstCharMap.current[id] = firstChar;
445
+ }, []);
446
+ const unMapFirstChar = useCallback((id) => {
447
+ const newMap = {
448
+ ...firstCharMap.current
449
+ };
450
+ delete newMap[id];
451
+ firstCharMap.current = newMap;
452
+ }, []);
453
+ const handleNextArrow = (event) => {
454
+ if (isExpandable(focusedNodeId)) {
455
+ if (isExpanded(focusedNodeId)) {
456
+ focusNextNode(event, focusedNodeId);
457
+ } else if (!isDisabled(focusedNodeId)) {
458
+ toggleExpansion(event);
459
+ }
460
+ }
461
+ return true;
462
+ };
463
+ const handlePreviousArrow = (event) => {
464
+ if (isExpanded(focusedNodeId) && !isDisabled(focusedNodeId)) {
465
+ toggleExpansion(event, focusedNodeId);
466
+ return true;
467
+ }
468
+ const parent = getParent(focusedNodeId);
469
+ if (parent) {
470
+ focus(event, parent);
471
+ return true;
472
+ }
473
+ return false;
474
+ };
475
+ const handleKeyDown = (event) => {
476
+ let flag = false;
477
+ const {
478
+ key
479
+ } = event;
480
+ if (event.altKey || event.currentTarget !== event.target || !focusedNodeId) {
481
+ return;
482
+ }
483
+ const ctrlPressed = event.ctrlKey || event.metaKey;
484
+ switch (key) {
485
+ case " ":
486
+ if (isSelectable(focusedNodeId) && !isDisabled(focusedNodeId)) {
487
+ if (multiSelect && event.shiftKey) {
488
+ selectRange(event, {
489
+ end: focusedNodeId
490
+ });
491
+ flag = true;
492
+ } else if (multiSelect) {
493
+ flag = selectNode(event, focusedNodeId, true);
494
+ } else {
495
+ flag = selectNode(event, focusedNodeId);
496
+ }
497
+ }
498
+ event.stopPropagation();
499
+ break;
500
+ case "Enter":
501
+ if (!isDisabled(focusedNodeId)) {
502
+ if (isExpandable(focusedNodeId)) {
503
+ toggleExpansion(event);
504
+ flag = true;
505
+ } else if (isSelectable(focusedNodeId)) {
506
+ if (multiSelect && event.shiftKey) {
507
+ selectRange(event, {
508
+ end: focusedNodeId
509
+ });
510
+ flag = true;
511
+ } else if (multiSelect) {
512
+ flag = selectNode(event, focusedNodeId, true);
513
+ } else {
514
+ flag = selectNode(event, focusedNodeId);
515
+ }
516
+ }
517
+ }
518
+ event.stopPropagation();
519
+ break;
520
+ case "ArrowDown":
521
+ if (multiSelect && event.shiftKey) {
522
+ selectNextNode(event, focusedNodeId);
523
+ }
524
+ focusNextNode(event, focusedNodeId);
525
+ flag = true;
526
+ break;
527
+ case "ArrowUp":
528
+ if (multiSelect && event.shiftKey) {
529
+ selectPreviousNode(event, focusedNodeId);
530
+ }
531
+ focusPreviousNode(event, focusedNodeId);
532
+ flag = true;
533
+ break;
534
+ case "ArrowRight":
535
+ flag = handleNextArrow(event);
536
+ break;
537
+ case "ArrowLeft":
538
+ flag = handlePreviousArrow(event);
539
+ break;
540
+ case "Home":
541
+ if (multiSelect && ctrlPressed && event.shiftKey && !isDisabled(focusedNodeId)) {
542
+ rangeSelectToFirst(event, focusedNodeId);
543
+ }
544
+ focusFirstNode(event);
545
+ flag = true;
546
+ break;
547
+ case "End":
548
+ if (multiSelect && ctrlPressed && event.shiftKey && !isDisabled(focusedNodeId)) {
549
+ rangeSelectToLast(event, focusedNodeId);
550
+ }
551
+ focusLastNode(event);
552
+ flag = true;
553
+ break;
554
+ default:
555
+ if (key === "*") {
556
+ expandAllSiblings(event, focusedNodeId);
557
+ flag = true;
558
+ } else if (multiSelect && ctrlPressed && key.toLowerCase() === "a") {
559
+ selectAllNodes(event);
560
+ flag = true;
561
+ } else if (!ctrlPressed && !event.shiftKey && isPrintableCharacter(key)) {
562
+ focusByFirstCharacter(event, focusedNodeId, key);
563
+ flag = true;
564
+ }
565
+ }
566
+ if (flag) {
567
+ event.preventDefault();
568
+ event.stopPropagation();
569
+ }
570
+ if (onKeyDown) {
571
+ onKeyDown(event);
572
+ }
573
+ };
574
+ const handleFocus = (event) => {
575
+ if (event.target === event.currentTarget) {
576
+ const firstSelected = Array.isArray(selected) ? selected[0] : selected;
577
+ focus(event, firstSelected || getNavigableChildrenIds(null)[0]);
578
+ }
579
+ if (onFocus) {
580
+ onFocus(event);
581
+ }
582
+ };
583
+ const handleBlur = (event) => {
584
+ setFocusedNodeId(null);
585
+ if (onBlur) {
586
+ onBlur(event);
587
+ }
588
+ };
589
+ const activeDescendant = focusedNodeId && nodeMap.current[focusedNodeId] ? nodeMap.current[focusedNodeId].idAttribute : null;
590
+ const treeControlContext = useMemo(() => ({
591
+ treeId,
592
+ mode,
593
+ collapsible,
594
+ toggleExpansion,
595
+ multiSelect,
596
+ selectNode: selectable ? selectNode : noopSelection,
597
+ selectRange: selectable ? selectRange : noopSelection,
598
+ disabledItemsFocusable,
599
+ registerNode,
600
+ unregisterNode,
601
+ mapFirstChar,
602
+ unMapFirstChar,
603
+ focus
604
+ }), [registerNode, unregisterNode, mapFirstChar, unMapFirstChar, toggleExpansion, selectable, selectNode, selectRange, mode, collapsible, multiSelect, disabledItemsFocusable, treeId]);
605
+ const treeStateContext = useMemo(() => ({
606
+ isExpanded,
607
+ isSelected,
608
+ isFocused,
609
+ isDisabled,
610
+ isChildSelected
611
+ }), [isDisabled, isExpanded, isFocused, isSelected, isChildSelected]);
612
+ return /* @__PURE__ */ jsx(TreeViewControlContext.Provider, {
613
+ value: treeControlContext,
614
+ children: /* @__PURE__ */ jsx(TreeViewStateContext.Provider, {
615
+ value: treeStateContext,
616
+ children: /* @__PURE__ */ jsx(DescendantProvider, {
617
+ children: /* @__PURE__ */ jsx(StyledRoot, {
618
+ ref: handleRef,
619
+ id: idProp,
620
+ className: clsx(treeViewClasses.root, classes == null ? void 0 : classes.root, className),
621
+ ...treeviewMode && {
622
+ id: treeId,
623
+ role: "tree",
624
+ "aria-multiselectable": multiSelect,
625
+ "aria-activedescendant": activeDescendant,
626
+ tabIndex: 0,
627
+ onFocus: handleFocus,
628
+ onBlur: handleBlur,
629
+ onKeyDown: handleKeyDown
630
+ },
631
+ ...others,
632
+ children
633
+ })
634
+ })
635
+ })
636
+ });
637
+ });
638
+ export {
639
+ HvVerticalNavigationTreeView
640
+ };
641
+ //# sourceMappingURL=TreeView.js.map