@hitachivantara/uikit-react-core 5.0.0-next.17 → 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 (127) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/BaseDropdown/BaseDropdown.cjs +1 -1
  3. package/dist/cjs/components/DropDownMenu/DropDownMenu.cjs +1 -1
  4. package/dist/cjs/components/DropDownMenu/DropDownMenu.cjs.map +1 -1
  5. package/dist/cjs/components/FileUploader/DropZone/DropZone.cjs +1 -1
  6. package/dist/cjs/components/FileUploader/DropZone/DropZone.cjs.map +1 -1
  7. package/dist/cjs/components/List/List.cjs +4 -3
  8. package/dist/cjs/components/List/List.cjs.map +1 -1
  9. package/dist/cjs/components/List/utils.cjs +0 -10
  10. package/dist/cjs/components/List/utils.cjs.map +1 -1
  11. package/dist/cjs/components/VerticalNavigation/Actions/Action.cjs +45 -0
  12. package/dist/cjs/components/VerticalNavigation/Actions/Action.cjs.map +1 -0
  13. package/dist/cjs/components/VerticalNavigation/Actions/Action.styles.cjs +51 -0
  14. package/dist/cjs/components/VerticalNavigation/Actions/Action.styles.cjs.map +1 -0
  15. package/dist/cjs/components/VerticalNavigation/Actions/Actions.cjs +30 -0
  16. package/dist/cjs/components/VerticalNavigation/Actions/Actions.cjs.map +1 -0
  17. package/dist/cjs/components/VerticalNavigation/Actions/Actions.styles.cjs +26 -0
  18. package/dist/cjs/components/VerticalNavigation/Actions/Actions.styles.cjs.map +1 -0
  19. package/dist/cjs/components/VerticalNavigation/Actions/actionClasses.cjs +8 -0
  20. package/dist/cjs/components/VerticalNavigation/Actions/actionClasses.cjs.map +1 -0
  21. package/dist/cjs/components/VerticalNavigation/Actions/actionsClasses.cjs +8 -0
  22. package/dist/cjs/components/VerticalNavigation/Actions/actionsClasses.cjs.map +1 -0
  23. package/dist/cjs/components/VerticalNavigation/Header/Header.cjs +45 -0
  24. package/dist/cjs/components/VerticalNavigation/Header/Header.cjs.map +1 -0
  25. package/dist/cjs/components/VerticalNavigation/Header/Header.styles.cjs +23 -0
  26. package/dist/cjs/components/VerticalNavigation/Header/Header.styles.cjs.map +1 -0
  27. package/dist/cjs/components/VerticalNavigation/Header/headerClasses.cjs +8 -0
  28. package/dist/cjs/components/VerticalNavigation/Header/headerClasses.cjs.map +1 -0
  29. package/dist/cjs/components/VerticalNavigation/Navigation/Navigation.cjs +134 -0
  30. package/dist/cjs/components/VerticalNavigation/Navigation/Navigation.cjs.map +1 -0
  31. package/dist/cjs/components/VerticalNavigation/Navigation/Navigation.styles.cjs +22 -0
  32. package/dist/cjs/components/VerticalNavigation/Navigation/Navigation.styles.cjs.map +1 -0
  33. package/dist/cjs/components/VerticalNavigation/Navigation/navigationClasses.cjs +8 -0
  34. package/dist/cjs/components/VerticalNavigation/Navigation/navigationClasses.cjs.map +1 -0
  35. package/dist/cjs/components/VerticalNavigation/TreeView/TreeView.cjs +643 -0
  36. package/dist/cjs/components/VerticalNavigation/TreeView/TreeView.cjs.map +1 -0
  37. package/dist/cjs/components/VerticalNavigation/TreeView/TreeView.styles.cjs +21 -0
  38. package/dist/cjs/components/VerticalNavigation/TreeView/TreeView.styles.cjs.map +1 -0
  39. package/dist/cjs/components/VerticalNavigation/TreeView/TreeViewContext.cjs +10 -0
  40. package/dist/cjs/components/VerticalNavigation/TreeView/TreeViewContext.cjs.map +1 -0
  41. package/dist/cjs/components/VerticalNavigation/TreeView/TreeViewItem.cjs +282 -0
  42. package/dist/cjs/components/VerticalNavigation/TreeView/TreeViewItem.cjs.map +1 -0
  43. package/dist/cjs/components/VerticalNavigation/TreeView/TreeViewItem.styles.cjs +132 -0
  44. package/dist/cjs/components/VerticalNavigation/TreeView/TreeViewItem.styles.cjs.map +1 -0
  45. package/dist/cjs/components/VerticalNavigation/TreeView/descendants.cjs +134 -0
  46. package/dist/cjs/components/VerticalNavigation/TreeView/descendants.cjs.map +1 -0
  47. package/dist/cjs/components/VerticalNavigation/TreeView/treeViewClasses.cjs +8 -0
  48. package/dist/cjs/components/VerticalNavigation/TreeView/treeViewClasses.cjs.map +1 -0
  49. package/dist/cjs/components/VerticalNavigation/TreeView/treeViewItemClasses.cjs +8 -0
  50. package/dist/cjs/components/VerticalNavigation/TreeView/treeViewItemClasses.cjs.map +1 -0
  51. package/dist/cjs/components/VerticalNavigation/VerticalNavigation.cjs +40 -0
  52. package/dist/cjs/components/VerticalNavigation/VerticalNavigation.cjs.map +1 -0
  53. package/dist/cjs/components/VerticalNavigation/VerticalNavigation.styles.cjs +43 -0
  54. package/dist/cjs/components/VerticalNavigation/VerticalNavigation.styles.cjs.map +1 -0
  55. package/dist/cjs/components/VerticalNavigation/verticalNavigationClasses.cjs +8 -0
  56. package/dist/cjs/components/VerticalNavigation/verticalNavigationClasses.cjs.map +1 -0
  57. package/dist/cjs/hocs/withTooltip.cjs.map +1 -1
  58. package/dist/cjs/hooks/useEnhancedEffect.cjs +6 -0
  59. package/dist/cjs/hooks/useEnhancedEffect.cjs.map +1 -0
  60. package/dist/cjs/index.cjs +37 -0
  61. package/dist/cjs/index.cjs.map +1 -1
  62. package/dist/cjs/utils/wrapperTooltip.cjs +13 -0
  63. package/dist/cjs/utils/wrapperTooltip.cjs.map +1 -0
  64. package/dist/esm/components/BaseDropdown/BaseDropdown.js +1 -1
  65. package/dist/esm/components/DropDownMenu/DropDownMenu.js +1 -1
  66. package/dist/esm/components/DropDownMenu/DropDownMenu.js.map +1 -1
  67. package/dist/esm/components/FileUploader/DropZone/DropZone.js +1 -1
  68. package/dist/esm/components/FileUploader/DropZone/DropZone.js.map +1 -1
  69. package/dist/esm/components/List/List.js +2 -1
  70. package/dist/esm/components/List/List.js.map +1 -1
  71. package/dist/esm/components/List/utils.js +1 -11
  72. package/dist/esm/components/List/utils.js.map +1 -1
  73. package/dist/esm/components/VerticalNavigation/Actions/Action.js +43 -0
  74. package/dist/esm/components/VerticalNavigation/Actions/Action.js.map +1 -0
  75. package/dist/esm/components/VerticalNavigation/Actions/Action.styles.js +49 -0
  76. package/dist/esm/components/VerticalNavigation/Actions/Action.styles.js.map +1 -0
  77. package/dist/esm/components/VerticalNavigation/Actions/Actions.js +28 -0
  78. package/dist/esm/components/VerticalNavigation/Actions/Actions.js.map +1 -0
  79. package/dist/esm/components/VerticalNavigation/Actions/Actions.styles.js +24 -0
  80. package/dist/esm/components/VerticalNavigation/Actions/Actions.styles.js.map +1 -0
  81. package/dist/esm/components/VerticalNavigation/Actions/actionClasses.js +8 -0
  82. package/dist/esm/components/VerticalNavigation/Actions/actionClasses.js.map +1 -0
  83. package/dist/esm/components/VerticalNavigation/Actions/actionsClasses.js +8 -0
  84. package/dist/esm/components/VerticalNavigation/Actions/actionsClasses.js.map +1 -0
  85. package/dist/esm/components/VerticalNavigation/Header/Header.js +43 -0
  86. package/dist/esm/components/VerticalNavigation/Header/Header.js.map +1 -0
  87. package/dist/esm/components/VerticalNavigation/Header/Header.styles.js +21 -0
  88. package/dist/esm/components/VerticalNavigation/Header/Header.styles.js.map +1 -0
  89. package/dist/esm/components/VerticalNavigation/Header/headerClasses.js +8 -0
  90. package/dist/esm/components/VerticalNavigation/Header/headerClasses.js.map +1 -0
  91. package/dist/esm/components/VerticalNavigation/Navigation/Navigation.js +132 -0
  92. package/dist/esm/components/VerticalNavigation/Navigation/Navigation.js.map +1 -0
  93. package/dist/esm/components/VerticalNavigation/Navigation/Navigation.styles.js +20 -0
  94. package/dist/esm/components/VerticalNavigation/Navigation/Navigation.styles.js.map +1 -0
  95. package/dist/esm/components/VerticalNavigation/Navigation/navigationClasses.js +8 -0
  96. package/dist/esm/components/VerticalNavigation/Navigation/navigationClasses.js.map +1 -0
  97. package/dist/esm/components/VerticalNavigation/TreeView/TreeView.js +641 -0
  98. package/dist/esm/components/VerticalNavigation/TreeView/TreeView.js.map +1 -0
  99. package/dist/esm/components/VerticalNavigation/TreeView/TreeView.styles.js +19 -0
  100. package/dist/esm/components/VerticalNavigation/TreeView/TreeView.styles.js.map +1 -0
  101. package/dist/esm/components/VerticalNavigation/TreeView/TreeViewContext.js +10 -0
  102. package/dist/esm/components/VerticalNavigation/TreeView/TreeViewContext.js.map +1 -0
  103. package/dist/esm/components/VerticalNavigation/TreeView/TreeViewItem.js +280 -0
  104. package/dist/esm/components/VerticalNavigation/TreeView/TreeViewItem.js.map +1 -0
  105. package/dist/esm/components/VerticalNavigation/TreeView/TreeViewItem.styles.js +130 -0
  106. package/dist/esm/components/VerticalNavigation/TreeView/TreeViewItem.styles.js.map +1 -0
  107. package/dist/esm/components/VerticalNavigation/TreeView/descendants.js +134 -0
  108. package/dist/esm/components/VerticalNavigation/TreeView/descendants.js.map +1 -0
  109. package/dist/esm/components/VerticalNavigation/TreeView/treeViewClasses.js +8 -0
  110. package/dist/esm/components/VerticalNavigation/TreeView/treeViewClasses.js.map +1 -0
  111. package/dist/esm/components/VerticalNavigation/TreeView/treeViewItemClasses.js +8 -0
  112. package/dist/esm/components/VerticalNavigation/TreeView/treeViewItemClasses.js.map +1 -0
  113. package/dist/esm/components/VerticalNavigation/VerticalNavigation.js +38 -0
  114. package/dist/esm/components/VerticalNavigation/VerticalNavigation.js.map +1 -0
  115. package/dist/esm/components/VerticalNavigation/VerticalNavigation.styles.js +41 -0
  116. package/dist/esm/components/VerticalNavigation/VerticalNavigation.styles.js.map +1 -0
  117. package/dist/esm/components/VerticalNavigation/verticalNavigationClasses.js +8 -0
  118. package/dist/esm/components/VerticalNavigation/verticalNavigationClasses.js.map +1 -0
  119. package/dist/esm/hocs/withTooltip.js.map +1 -1
  120. package/dist/esm/hooks/useEnhancedEffect.js +6 -0
  121. package/dist/esm/hooks/useEnhancedEffect.js.map +1 -0
  122. package/dist/esm/index.js +55 -18
  123. package/dist/esm/index.js.map +1 -1
  124. package/dist/esm/utils/wrapperTooltip.js +13 -0
  125. package/dist/esm/utils/wrapperTooltip.js.map +1 -0
  126. package/dist/types/index.d.ts +502 -0
  127. 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