@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,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