@hitachivantara/uikit-react-core 5.0.0-next.17 → 5.0.0-next.19

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