@hitachivantara/uikit-react-core 6.8.2 → 6.9.0

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 (441) hide show
  1. package/dist/Accordion/Accordion.js +69 -80
  2. package/dist/Accordion/Accordion.styles.js +21 -16
  3. package/dist/ActionBar/ActionBar.js +18 -17
  4. package/dist/ActionBar/ActionBar.styles.js +12 -15
  5. package/dist/ActionsGeneric/ActionsGeneric.js +72 -98
  6. package/dist/ActionsGeneric/ActionsGeneric.styles.js +17 -14
  7. package/dist/AppSwitcher/Action/Action.js +96 -111
  8. package/dist/AppSwitcher/Action/Action.styles.js +44 -48
  9. package/dist/AppSwitcher/AppSwitcher.js +70 -98
  10. package/dist/AppSwitcher/AppSwitcher.styles.js +50 -53
  11. package/dist/Avatar/Avatar.js +66 -111
  12. package/dist/Avatar/Avatar.styles.js +62 -52
  13. package/dist/AvatarGroup/AvatarGroup.js +49 -78
  14. package/dist/AvatarGroup/AvatarGroup.styles.js +40 -60
  15. package/dist/AvatarGroup/AvatarGroupContext.js +13 -16
  16. package/dist/Badge/Badge.js +40 -49
  17. package/dist/Badge/Badge.styles.js +50 -50
  18. package/dist/Banner/Banner.js +51 -83
  19. package/dist/Banner/Banner.styles.js +13 -22
  20. package/dist/Banner/BannerContent/BannerContent.js +35 -56
  21. package/dist/Banner/BannerContent/BannerContent.styles.js +31 -36
  22. package/dist/BaseCheckBox/BaseCheckBox.js +71 -88
  23. package/dist/BaseCheckBox/BaseCheckBox.styles.js +24 -31
  24. package/dist/BaseCheckBox/CheckBoxIcon.js +57 -73
  25. package/dist/BaseDropdown/BaseDropdown.js +147 -189
  26. package/dist/BaseDropdown/BaseDropdown.styles.js +72 -84
  27. package/dist/BaseDropdown/BaseDropdownPanel.js +69 -86
  28. package/dist/BaseDropdown/utils.js +77 -76
  29. package/dist/BaseInput/BaseInput.js +53 -89
  30. package/dist/BaseInput/BaseInput.styles.js +85 -105
  31. package/dist/BaseInput/validations.js +72 -69
  32. package/dist/BaseRadio/BaseRadio.js +61 -85
  33. package/dist/BaseRadio/BaseRadio.styles.js +26 -31
  34. package/dist/BaseRadio/RadioIcon.js +43 -48
  35. package/dist/BaseSwitch/BaseSwitch.js +70 -108
  36. package/dist/BaseSwitch/BaseSwitch.styles.js +94 -113
  37. package/dist/BreadCrumb/BreadCrumb.js +84 -106
  38. package/dist/BreadCrumb/BreadCrumb.styles.js +20 -17
  39. package/dist/BreadCrumb/Page/Page.js +24 -34
  40. package/dist/BreadCrumb/Page/Page.styles.js +20 -25
  41. package/dist/BreadCrumb/PathElement/PathElement.js +17 -17
  42. package/dist/BreadCrumb/PathElement/PathElement.styles.js +9 -7
  43. package/dist/BreadCrumb/utils.js +19 -27
  44. package/dist/BulkActions/BulkActions.js +57 -96
  45. package/dist/BulkActions/BulkActions.styles.js +37 -45
  46. package/dist/Button/Button.js +67 -95
  47. package/dist/Button/Button.styles.js +107 -124
  48. package/dist/ButtonBase/ButtonBase.js +32 -51
  49. package/dist/ButtonBase/ButtonBase.styles.js +21 -30
  50. package/dist/Calendar/Calendar.js +73 -101
  51. package/dist/Calendar/Calendar.styles.js +14 -32
  52. package/dist/Calendar/CalendarHeader/CalendarHeader.js +91 -118
  53. package/dist/Calendar/CalendarHeader/CalendarHeader.styles.js +11 -16
  54. package/dist/Calendar/CalendarNavigation/ComposedNavigation/ComposedNavigation.js +36 -50
  55. package/dist/Calendar/CalendarNavigation/ComposedNavigation/ComposedNavigation.styles.js +12 -18
  56. package/dist/Calendar/CalendarNavigation/MonthSelector/MonthSelector.js +23 -43
  57. package/dist/Calendar/CalendarNavigation/MonthSelector/MonthSelector.styles.js +21 -24
  58. package/dist/Calendar/CalendarNavigation/Navigation/Navigation.js +43 -59
  59. package/dist/Calendar/CalendarNavigation/Navigation/Navigation.styles.js +21 -24
  60. package/dist/Calendar/SingleCalendar/CalendarCell.js +60 -84
  61. package/dist/Calendar/SingleCalendar/CalendarCell.styles.js +39 -56
  62. package/dist/Calendar/SingleCalendar/SingleCalendar.js +121 -154
  63. package/dist/Calendar/SingleCalendar/SingleCalendar.styles.js +53 -68
  64. package/dist/Calendar/model.js +45 -62
  65. package/dist/Calendar/utils.js +233 -128
  66. package/dist/Card/Card.js +35 -53
  67. package/dist/Card/Card.styles.js +37 -50
  68. package/dist/Card/Content/Content.js +15 -27
  69. package/dist/Card/Content/Content.styles.js +5 -10
  70. package/dist/Card/Header/Header.js +22 -35
  71. package/dist/Card/Header/Header.styles.js +22 -25
  72. package/dist/Card/Media/Media.js +16 -26
  73. package/dist/Card/Media/Media.styles.js +6 -7
  74. package/dist/Carousel/Carousel.js +179 -207
  75. package/dist/Carousel/Carousel.styles.js +141 -166
  76. package/dist/Carousel/CarouselControls.js +48 -62
  77. package/dist/Carousel/CarouselSlide/CarouselSlide.js +19 -25
  78. package/dist/Carousel/CarouselSlide/CarouselSlide.styles.js +10 -11
  79. package/dist/Carousel/CarouselThumbnails.js +29 -36
  80. package/dist/CheckBox/CheckBox.js +112 -182
  81. package/dist/CheckBox/CheckBox.styles.js +48 -57
  82. package/dist/CheckBoxGroup/CheckBoxGroup.js +154 -245
  83. package/dist/CheckBoxGroup/CheckBoxGroup.styles.js +29 -35
  84. package/dist/ColorPicker/ColorPicker.js +146 -222
  85. package/dist/ColorPicker/ColorPicker.styles.js +40 -45
  86. package/dist/ColorPicker/Picker/Fields.js +125 -141
  87. package/dist/ColorPicker/Picker/Picker.js +51 -50
  88. package/dist/ColorPicker/Picker/Picker.styles.js +42 -42
  89. package/dist/ColorPicker/PresetColors/PresetColors.js +25 -28
  90. package/dist/ColorPicker/PresetColors/PresetColors.styles.js +17 -17
  91. package/dist/ColorPicker/SavedColors/SavedColors.js +37 -41
  92. package/dist/ColorPicker/SavedColors/SavedColors.styles.js +27 -29
  93. package/dist/ColorPicker/Swatch.js +22 -37
  94. package/dist/Container/Container.js +37 -58
  95. package/dist/Container/Container.styles.js +12 -13
  96. package/dist/Controls/Controls.js +50 -74
  97. package/dist/Controls/Controls.styles.js +16 -13
  98. package/dist/Controls/LeftControl/LeftControl.js +25 -38
  99. package/dist/Controls/LeftControl/LeftControl.styles.js +7 -7
  100. package/dist/Controls/RightControl/RightControl.js +31 -46
  101. package/dist/Controls/RightControl/RightControl.styles.js +9 -7
  102. package/dist/Controls/context/ControlsContext.js +5 -6
  103. package/dist/DatePicker/DatePicker.js +286 -339
  104. package/dist/DatePicker/DatePicker.styles.js +25 -40
  105. package/dist/DatePicker/useVisibleDate.js +142 -126
  106. package/dist/DatePicker/utils.js +17 -26
  107. package/dist/Dialog/Actions/Actions.js +19 -29
  108. package/dist/Dialog/Actions/Actions.styles.js +20 -20
  109. package/dist/Dialog/Content/Content.js +29 -46
  110. package/dist/Dialog/Content/Content.styles.js +14 -15
  111. package/dist/Dialog/Dialog.js +49 -69
  112. package/dist/Dialog/Dialog.styles.js +33 -46
  113. package/dist/Dialog/Title/Title.js +20 -42
  114. package/dist/Dialog/Title/Title.styles.js +14 -16
  115. package/dist/Dialog/context.js +5 -6
  116. package/dist/DotPagination/DotPagination.js +44 -59
  117. package/dist/DotPagination/DotPagination.styles.js +44 -47
  118. package/dist/Drawer/Drawer.js +37 -64
  119. package/dist/Drawer/Drawer.styles.js +18 -21
  120. package/dist/DropDownMenu/DropDownMenu.js +88 -124
  121. package/dist/DropDownMenu/DropDownMenu.styles.js +12 -21
  122. package/dist/Dropdown/Dropdown.js +221 -310
  123. package/dist/Dropdown/Dropdown.styles.js +39 -48
  124. package/dist/Dropdown/List/List.js +194 -176
  125. package/dist/Dropdown/List/List.styles.js +23 -24
  126. package/dist/Dropdown/utils.js +15 -16
  127. package/dist/DropdownButton/DropdownButton.js +42 -46
  128. package/dist/DropdownButton/DropdownButton.styles.js +37 -47
  129. package/dist/EmptyState/EmptyState.js +48 -61
  130. package/dist/EmptyState/EmptyState.styles.js +31 -31
  131. package/dist/FileUploader/DropZone/DropZone.js +141 -179
  132. package/dist/FileUploader/DropZone/DropZone.styles.js +55 -68
  133. package/dist/FileUploader/File/File.js +85 -75
  134. package/dist/FileUploader/File/File.styles.js +55 -60
  135. package/dist/FileUploader/FileList/FileList.js +19 -28
  136. package/dist/FileUploader/FileList/FileList.styles.js +15 -16
  137. package/dist/FileUploader/FileUploader.js +35 -55
  138. package/dist/FileUploader/FileUploader.styles.js +4 -7
  139. package/dist/FileUploader/Preview/Preview.js +37 -52
  140. package/dist/FileUploader/Preview/Preview.styles.js +22 -28
  141. package/dist/FileUploader/utils.js +24 -11
  142. package/dist/FilterGroup/Counter/Counter.js +31 -43
  143. package/dist/FilterGroup/Counter/Counter.styles.js +12 -15
  144. package/dist/FilterGroup/FilterContent/FilterContent.js +138 -177
  145. package/dist/FilterGroup/FilterContent/FilterContent.styles.js +46 -53
  146. package/dist/FilterGroup/FilterContent/HeaderButton.js +77 -100
  147. package/dist/FilterGroup/FilterGroup.js +87 -136
  148. package/dist/FilterGroup/FilterGroup.styles.js +9 -10
  149. package/dist/FilterGroup/FilterGroupContext.js +68 -73
  150. package/dist/FilterGroup/LeftPanel/LeftPanel.js +28 -31
  151. package/dist/FilterGroup/LeftPanel/LeftPanel.styles.js +6 -11
  152. package/dist/FilterGroup/RightPanel/RightPanel.js +118 -151
  153. package/dist/FilterGroup/RightPanel/RightPanel.styles.js +17 -27
  154. package/dist/Focus/Focus.js +248 -344
  155. package/dist/Focus/Focus.styles.js +28 -39
  156. package/dist/Focus/utils.js +14 -20
  157. package/dist/Footer/Footer.js +36 -38
  158. package/dist/Footer/Footer.styles.js +40 -43
  159. package/dist/FormElement/Adornment/Adornment.js +38 -49
  160. package/dist/FormElement/Adornment/Adornment.styles.js +14 -15
  161. package/dist/FormElement/CharCounter/CharCounter.js +51 -73
  162. package/dist/FormElement/CharCounter/CharCounter.styles.js +12 -10
  163. package/dist/FormElement/FormElement.js +53 -31
  164. package/dist/FormElement/FormElement.styles.js +4 -7
  165. package/dist/FormElement/InfoMessage/InfoMessage.js +26 -41
  166. package/dist/FormElement/InfoMessage/InfoMessage.styles.js +11 -9
  167. package/dist/FormElement/Label/Label.js +33 -56
  168. package/dist/FormElement/Label/Label.styles.js +11 -9
  169. package/dist/FormElement/LabelContainer.js +46 -55
  170. package/dist/FormElement/Suggestions/Suggestions.js +46 -71
  171. package/dist/FormElement/Suggestions/Suggestions.styles.js +9 -16
  172. package/dist/FormElement/WarningText/WarningText.js +41 -62
  173. package/dist/FormElement/WarningText/WarningText.styles.js +25 -28
  174. package/dist/FormElement/context.js +6 -10
  175. package/dist/FormElement/utils.js +54 -58
  176. package/dist/GlobalActions/GlobalActions.js +53 -59
  177. package/dist/GlobalActions/GlobalActions.styles.js +67 -76
  178. package/dist/Grid/Grid.js +82 -112
  179. package/dist/Grid/Grid.styles.js +37 -38
  180. package/dist/Header/Actions/Actions.js +15 -17
  181. package/dist/Header/Actions/Actions.styles.js +12 -15
  182. package/dist/Header/Brand/Brand.js +27 -23
  183. package/dist/Header/Brand/Brand.styles.js +16 -14
  184. package/dist/Header/Header.js +22 -31
  185. package/dist/Header/Header.styles.js +32 -30
  186. package/dist/Header/Navigation/MenuBar/Bar.js +23 -36
  187. package/dist/Header/Navigation/MenuBar/Bar.styles.js +54 -61
  188. package/dist/Header/Navigation/MenuBar/MenuBar.js +20 -26
  189. package/dist/Header/Navigation/MenuItem/MenuItem.js +104 -120
  190. package/dist/Header/Navigation/MenuItem/MenuItem.styles.js +48 -63
  191. package/dist/Header/Navigation/Navigation.js +32 -37
  192. package/dist/Header/Navigation/Navigation.styles.js +11 -17
  193. package/dist/Header/Navigation/useSelectionPath.js +17 -20
  194. package/dist/Header/Navigation/utils/FocusContext.js +23 -20
  195. package/dist/Header/Navigation/utils/SelectionContext.js +4 -4
  196. package/dist/IconButton/IconButton.js +25 -32
  197. package/dist/IconContainer/IconContainer.js +55 -76
  198. package/dist/InlineEditor/InlineEditor.js +105 -131
  199. package/dist/InlineEditor/InlineEditor.styles.js +44 -53
  200. package/dist/Input/Input.js +385 -461
  201. package/dist/Input/Input.styles.js +34 -47
  202. package/dist/Input/icons.js +16 -21
  203. package/dist/Input/utils.js +8 -11
  204. package/dist/List/List.js +196 -247
  205. package/dist/List/List.styles.js +44 -49
  206. package/dist/List/useSelectableList.js +11 -8
  207. package/dist/List/utils.js +24 -33
  208. package/dist/ListContainer/ListContainer.js +52 -65
  209. package/dist/ListContainer/ListContainer.styles.js +7 -10
  210. package/dist/ListContainer/ListContext/ListContext.js +4 -4
  211. package/dist/ListContainer/ListItem/ListItem.js +79 -117
  212. package/dist/ListContainer/ListItem/ListItem.styles.js +57 -78
  213. package/dist/Loading/Loading.js +31 -46
  214. package/dist/Loading/Loading.styles.js +41 -48
  215. package/dist/LoadingContainer/LoadingContainer.js +34 -40
  216. package/dist/LoadingContainer/LoadingContainer.styles.js +17 -18
  217. package/dist/Login/Login.js +22 -29
  218. package/dist/Login/Login.styles.js +20 -21
  219. package/dist/MultiButton/MultiButton.js +41 -59
  220. package/dist/MultiButton/MultiButton.styles.js +117 -137
  221. package/dist/NumberInput/NumberInput.js +51 -50
  222. package/dist/NumberInput/NumberInput.styles.js +5 -10
  223. package/dist/OverflowTooltip/OverflowTooltip.js +55 -75
  224. package/dist/OverflowTooltip/OverflowTooltip.styles.js +19 -23
  225. package/dist/Pagination/Pagination.js +176 -164
  226. package/dist/Pagination/Pagination.styles.js +86 -90
  227. package/dist/Pagination/Select.js +51 -60
  228. package/dist/Pagination/Select.styles.js +13 -19
  229. package/dist/Panel/Panel.js +19 -20
  230. package/dist/Panel/Panel.styles.js +12 -15
  231. package/dist/ProgressBar/ProgressBar.js +40 -53
  232. package/dist/ProgressBar/ProgressBar.styles.js +28 -40
  233. package/dist/QueryBuilder/ConfirmationDialog.js +35 -28
  234. package/dist/QueryBuilder/Context.js +308 -322
  235. package/dist/QueryBuilder/QueryBuilder.js +108 -137
  236. package/dist/QueryBuilder/QueryBuilder.styles.js +117 -108
  237. package/dist/QueryBuilder/Rule/Attribute.js +56 -63
  238. package/dist/QueryBuilder/Rule/Operator.js +53 -58
  239. package/dist/QueryBuilder/Rule/Rule.js +70 -88
  240. package/dist/QueryBuilder/Rule/Rule.styles.js +49 -56
  241. package/dist/QueryBuilder/RuleGroup.js +160 -206
  242. package/dist/QueryBuilder/Value/BooleanValue.js +38 -37
  243. package/dist/QueryBuilder/Value/DateTimeValue.js +233 -299
  244. package/dist/QueryBuilder/Value/EmptyValue.js +14 -14
  245. package/dist/QueryBuilder/Value/NumericValue.js +152 -204
  246. package/dist/QueryBuilder/Value/TextValue.js +38 -54
  247. package/dist/QueryBuilder/Value/Value.js +42 -67
  248. package/dist/QueryBuilder/types.js +4 -4
  249. package/dist/QueryBuilder/utils/index.js +40 -74
  250. package/dist/QueryBuilder/utils/reducer.js +86 -92
  251. package/dist/Radio/Radio.js +96 -145
  252. package/dist/Radio/Radio.styles.js +47 -55
  253. package/dist/RadioGroup/RadioGroup.js +98 -159
  254. package/dist/RadioGroup/RadioGroup.styles.js +28 -34
  255. package/dist/ScrollToHorizontal/HorizontalScrollListItem/HorizontalScrollListItem.js +34 -51
  256. package/dist/ScrollToHorizontal/HorizontalScrollListItem/HorizontalScrollListItem.styles.js +39 -48
  257. package/dist/ScrollToHorizontal/ScrollToHorizontal.js +56 -91
  258. package/dist/ScrollToHorizontal/ScrollToHorizontal.styles.js +28 -32
  259. package/dist/ScrollToVertical/ScrollToVertical.js +45 -77
  260. package/dist/ScrollToVertical/ScrollToVertical.styles.js +31 -38
  261. package/dist/ScrollToVertical/VerticalScrollListItem/VerticalScrollListItem.js +30 -39
  262. package/dist/ScrollToVertical/VerticalScrollListItem/VerticalScrollListItem.styles.js +44 -51
  263. package/dist/SearchInput/SearchInput.js +27 -25
  264. package/dist/SearchInput/SearchInput.styles.js +6 -7
  265. package/dist/Section/Section.js +69 -104
  266. package/dist/Section/Section.styles.js +53 -57
  267. package/dist/Select/Option.js +29 -46
  268. package/dist/Select/OptionGroup.js +18 -30
  269. package/dist/Select/Select.js +163 -219
  270. package/dist/Select/Select.styles.js +26 -32
  271. package/dist/SelectionList/SelectionList.js +162 -216
  272. package/dist/SelectionList/SelectionList.styles.js +36 -36
  273. package/dist/SimpleGrid/SimpleGrid.js +16 -27
  274. package/dist/SimpleGrid/SimpleGrid.styles.js +28 -39
  275. package/dist/Skeleton/Skeleton.js +26 -44
  276. package/dist/Skeleton/Skeleton.styles.js +43 -66
  277. package/dist/Slider/Slider.js +316 -431
  278. package/dist/Slider/Slider.styles.js +183 -216
  279. package/dist/Slider/SliderInput/SliderInput.js +38 -57
  280. package/dist/Slider/SliderInput/SliderInput.styles.js +13 -14
  281. package/dist/Slider/base.js +221 -243
  282. package/dist/Slider/utils.js +247 -233
  283. package/dist/Snackbar/Snackbar.js +59 -88
  284. package/dist/Snackbar/Snackbar.styles.js +25 -42
  285. package/dist/Snackbar/SnackbarContent/SnackbarContent.js +31 -50
  286. package/dist/Snackbar/SnackbarContent/SnackbarContent.styles.js +27 -30
  287. package/dist/SnackbarProvider/SnackbarProvider.js +73 -105
  288. package/dist/SnackbarProvider/SnackbarProvider.styles.js +20 -26
  289. package/dist/Stack/Stack.js +74 -84
  290. package/dist/Stack/Stack.styles.js +14 -33
  291. package/dist/StatusIcon/StatusIcon.js +78 -102
  292. package/dist/StatusIcon/StatusIcon.styles.js +42 -52
  293. package/dist/Switch/Switch.js +91 -138
  294. package/dist/Switch/Switch.styles.js +49 -60
  295. package/dist/Table/Table.js +62 -66
  296. package/dist/Table/Table.styles.js +23 -28
  297. package/dist/Table/TableBody/TableBody.js +45 -56
  298. package/dist/Table/TableBody/TableBody.styles.js +8 -7
  299. package/dist/Table/TableCell/TableCell.js +37 -66
  300. package/dist/Table/TableCell/TableCell.styles.js +125 -162
  301. package/dist/Table/TableContainer/TableContainer.js +18 -28
  302. package/dist/Table/TableContainer/TableContainer.styles.js +8 -12
  303. package/dist/Table/TableContext.js +4 -4
  304. package/dist/Table/TableHead/TableHead.js +27 -39
  305. package/dist/Table/TableHead/TableHead.styles.js +10 -7
  306. package/dist/Table/TableHeader/TableHeader.js +73 -124
  307. package/dist/Table/TableHeader/TableHeader.styles.js +135 -150
  308. package/dist/Table/TableHeader/utils.js +11 -15
  309. package/dist/Table/TableRow/TableRow.js +32 -51
  310. package/dist/Table/TableRow/TableRow.styles.js +64 -84
  311. package/dist/Table/TableSection/TableSection.js +21 -20
  312. package/dist/Table/TableSection/TableSection.styles.js +63 -96
  313. package/dist/Table/TableSectionContext.js +4 -4
  314. package/dist/Table/hooks/useHvBulkActions.js +54 -89
  315. package/dist/Table/hooks/useHvFilters.js +4 -4
  316. package/dist/Table/hooks/useHvGlobalFilter.js +4 -4
  317. package/dist/Table/hooks/useHvHeaderGroups.js +73 -82
  318. package/dist/Table/hooks/useHvPagination.js +31 -51
  319. package/dist/Table/hooks/useHvResizeColumns.js +25 -31
  320. package/dist/Table/hooks/useHvRowExpand.js +54 -69
  321. package/dist/Table/hooks/useHvRowSelection.js +294 -420
  322. package/dist/Table/hooks/useHvRowState.js +4 -4
  323. package/dist/Table/hooks/useHvSortBy.js +23 -30
  324. package/dist/Table/hooks/useHvSticky.js +114 -154
  325. package/dist/Table/hooks/useHvTable.js +40 -64
  326. package/dist/Table/hooks/useHvTableStyles.js +51 -82
  327. package/dist/Table/renderers/DateColumnCell.js +12 -13
  328. package/dist/Table/renderers/DefaultCell.js +13 -20
  329. package/dist/Table/renderers/DropdownColumnCell.js +4 -4
  330. package/dist/Table/renderers/ProgressColumnCell.js +43 -47
  331. package/dist/Table/renderers/SwitchColumnCell.js +37 -50
  332. package/dist/Table/renderers/renderers.js +146 -183
  333. package/dist/Tabs/Tab/Tab.js +21 -31
  334. package/dist/Tabs/Tab/Tab.styles.js +44 -54
  335. package/dist/Tabs/Tabs.js +23 -28
  336. package/dist/Tabs/Tabs.styles.js +9 -14
  337. package/dist/Tag/Tag.js +86 -129
  338. package/dist/Tag/Tag.styles.js +63 -88
  339. package/dist/TagsInput/TagsInput.js +349 -417
  340. package/dist/TagsInput/TagsInput.styles.js +77 -90
  341. package/dist/TextArea/TextArea.js +207 -274
  342. package/dist/TextArea/TextArea.styles.js +25 -20
  343. package/dist/TimeAgo/TimeAgo.js +24 -30
  344. package/dist/TimeAgo/TimeAgo.styles.js +4 -7
  345. package/dist/TimeAgo/formatUtils.js +57 -65
  346. package/dist/TimeAgo/useTimeAgo.js +18 -18
  347. package/dist/TimeAgo/useTimeout.js +14 -14
  348. package/dist/TimePicker/Placeholder.js +46 -52
  349. package/dist/TimePicker/TimePicker.js +164 -214
  350. package/dist/TimePicker/TimePicker.styles.js +30 -39
  351. package/dist/TimePicker/Unit/Unit.js +63 -49
  352. package/dist/TimePicker/Unit/Unit.styles.js +41 -46
  353. package/dist/ToggleButton/ToggleButton.js +25 -34
  354. package/dist/Tooltip/Tooltip.js +41 -51
  355. package/dist/Tooltip/Tooltip.styles.js +25 -26
  356. package/dist/TreeView/TreeItem/DefaultContent.js +51 -72
  357. package/dist/TreeView/TreeItem/TreeItem.js +102 -140
  358. package/dist/TreeView/TreeItem/TreeItem.styles.js +56 -70
  359. package/dist/TreeView/TreeItem/useHvTreeItem.js +38 -53
  360. package/dist/TreeView/TreeView.js +65 -62
  361. package/dist/TreeView/TreeView.styles.js +11 -13
  362. package/dist/TreeView/internals/DescendantProvider.js +120 -120
  363. package/dist/TreeView/internals/TreeViewProvider.js +32 -26
  364. package/dist/TreeView/internals/corePlugins.js +8 -4
  365. package/dist/TreeView/internals/hooks/plugins/defaultPlugins.js +10 -10
  366. package/dist/TreeView/internals/hooks/plugins/useTreeViewContextValueBuilder.js +20 -22
  367. package/dist/TreeView/internals/hooks/plugins/useTreeViewExpansion.js +39 -61
  368. package/dist/TreeView/internals/hooks/plugins/useTreeViewFocus.js +56 -80
  369. package/dist/TreeView/internals/hooks/plugins/useTreeViewKeyboardNavigation.js +149 -211
  370. package/dist/TreeView/internals/hooks/plugins/useTreeViewNodes.js +42 -68
  371. package/dist/TreeView/internals/hooks/plugins/useTreeViewSelection.js +162 -195
  372. package/dist/TreeView/internals/hooks/useInstanceEventHandler.js +52 -74
  373. package/dist/TreeView/internals/hooks/useTreeView.js +54 -69
  374. package/dist/TreeView/internals/hooks/useTreeViewInstanceEvents.js +28 -33
  375. package/dist/TreeView/internals/hooks/useTreeViewModels.js +34 -43
  376. package/dist/TreeView/internals/hooks/utils.js +28 -42
  377. package/dist/TreeView/internals/utils/EventManager.js +49 -58
  378. package/dist/TreeView/internals/utils/FinalizationRegistryBasedCleanupTracking.js +14 -18
  379. package/dist/TreeView/internals/utils/TimerBasedCleanupTracking.js +33 -37
  380. package/dist/TreeView/internals/utils/publishTreeViewEvent.js +5 -5
  381. package/dist/Typography/Typography.js +34 -51
  382. package/dist/Typography/Typography.styles.js +20 -23
  383. package/dist/VerticalNavigation/Actions/Action.js +23 -42
  384. package/dist/VerticalNavigation/Actions/Action.styles.js +21 -28
  385. package/dist/VerticalNavigation/Actions/Actions.js +15 -31
  386. package/dist/VerticalNavigation/Actions/Actions.styles.js +13 -19
  387. package/dist/VerticalNavigation/Header/Header.js +51 -91
  388. package/dist/VerticalNavigation/Header/Header.styles.js +22 -32
  389. package/dist/VerticalNavigation/Navigation/Navigation.js +183 -267
  390. package/dist/VerticalNavigation/Navigation/Navigation.styles.js +14 -24
  391. package/dist/VerticalNavigation/NavigationPopup/NavigationPopup.styles.js +9 -17
  392. package/dist/VerticalNavigation/NavigationPopup/NavigationPopupContainer.js +30 -32
  393. package/dist/VerticalNavigation/NavigationSlider/NavigationSlider.js +45 -63
  394. package/dist/VerticalNavigation/NavigationSlider/NavigationSlider.styles.js +23 -33
  395. package/dist/VerticalNavigation/NavigationSlider/utils.js +56 -39
  396. package/dist/VerticalNavigation/TreeView/TreeView.js +515 -664
  397. package/dist/VerticalNavigation/TreeView/TreeView.styles.js +10 -16
  398. package/dist/VerticalNavigation/TreeView/TreeViewContext.js +5 -6
  399. package/dist/VerticalNavigation/TreeView/TreeViewItem.js +319 -414
  400. package/dist/VerticalNavigation/TreeView/TreeViewItem.styles.js +91 -143
  401. package/dist/VerticalNavigation/VerticalNavigation.js +70 -97
  402. package/dist/VerticalNavigation/VerticalNavigation.styles.js +31 -45
  403. package/dist/VerticalNavigation/VerticalNavigationContext.js +8 -10
  404. package/dist/hooks/useClickOutside.js +21 -23
  405. package/dist/hooks/useComputation.js +13 -13
  406. package/dist/hooks/useControlled.js +10 -17
  407. package/dist/hooks/useEnhancedEffect.js +5 -5
  408. package/dist/hooks/useExpandable.js +24 -31
  409. package/dist/hooks/useFocus.js +31 -34
  410. package/dist/hooks/useForkRef.js +19 -19
  411. package/dist/hooks/useImageLoaded.js +26 -26
  412. package/dist/hooks/useIsMounted.js +13 -13
  413. package/dist/hooks/useLabels.js +7 -7
  414. package/dist/hooks/useScrollTo.js +101 -130
  415. package/dist/hooks/useUniqueId.js +6 -6
  416. package/dist/hooks/useWidth.js +10 -13
  417. package/dist/icons.js +77 -88
  418. package/dist/index.d.ts +8 -8
  419. package/dist/index.js +226 -554
  420. package/dist/providers/Provider.js +44 -75
  421. package/dist/providers/ThemeProvider.js +79 -71
  422. package/dist/providers/utils.js +40 -47
  423. package/dist/themes/index.js +6 -5
  424. package/dist/themes/next.js +132 -271
  425. package/dist/themes/pentaho.js +832 -1173
  426. package/dist/types/generic.js +5 -4
  427. package/dist/utils/Callout.js +123 -171
  428. package/dist/utils/CounterLabel.js +14 -15
  429. package/dist/utils/deepMerge.js +13 -15
  430. package/dist/utils/document.js +8 -8
  431. package/dist/utils/focusUtils.js +6 -7
  432. package/dist/utils/focusableElementFinder.js +23 -26
  433. package/dist/utils/helpers.js +15 -23
  434. package/dist/utils/iconVariant.js +15 -12
  435. package/dist/utils/keyboardUtils.js +28 -28
  436. package/dist/utils/multiSelectionEventHandler.js +37 -52
  437. package/dist/utils/scroll.js +50 -76
  438. package/dist/utils/setId.js +4 -4
  439. package/dist/utils/theme.js +11 -8
  440. package/dist/utils/useSavedState.js +19 -16
  441. package/package.json +5 -5
@@ -1,676 +1,527 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { forwardRef, useRef, useState, useCallback, useMemo } from "react";
3
- import { useDefaultProps } from "@hitachivantara/uikit-react-utils";
4
- import { useControlled } from "../../hooks/useControlled.js";
5
1
  import { useForkRef } from "../../hooks/useForkRef.js";
6
2
  import { useUniqueId } from "../../hooks/useUniqueId.js";
3
+ import { useControlled } from "../../hooks/useControlled.js";
7
4
  import { DescendantProvider } from "../../TreeView/internals/DescendantProvider.js";
8
5
  import { useClasses } from "./TreeView.styles.js";
9
- import { staticClasses } from "./TreeView.styles.js";
10
6
  import { TreeViewControlContext, TreeViewStateContext } from "./TreeViewContext.js";
7
+ import { useDefaultProps } from "@hitachivantara/uikit-react-utils";
8
+ import { forwardRef, useCallback, useMemo, useRef, useState } from "react";
9
+ import { jsx } from "react/jsx-runtime";
10
+ //#region src/VerticalNavigation/TreeView/TreeView.tsx
11
11
  function isPrintableCharacter(string) {
12
- return string && string.length === 1 && string.match(/\S/);
12
+ return string && string.length === 1 && string.match(/\S/);
13
13
  }
14
14
  function findNextFirstChar(firstChars, startIndex, char) {
15
- return firstChars.slice(startIndex).findIndex((c) => c === char);
15
+ return firstChars.slice(startIndex).findIndex((c) => c === char);
16
16
  }
17
17
  function noopSelection() {
18
- return false;
18
+ return false;
19
19
  }
20
- const HvVerticalNavigationTreeView = forwardRef(function HvVerticalNavigationTreeView2(props, ref) {
21
- const {
22
- id: idProp,
23
- className,
24
- classes: classesProp,
25
- mode = "treeview",
26
- collapsible = false,
27
- expanded: expandedProp,
28
- defaultExpanded = [],
29
- onToggle,
30
- selectable = false,
31
- multiSelect: multiSelectProp = false,
32
- selected: selectedProp,
33
- defaultSelected = [],
34
- onChange,
35
- disabledItemsFocusable = false,
36
- onFocus,
37
- onBlur,
38
- onKeyDown,
39
- children,
40
- ...others
41
- } = useDefaultProps("HvVerticalNavigationTreeView", props);
42
- const { classes, cx } = useClasses(classesProp);
43
- const treeviewMode = mode === "treeview";
44
- const multiSelect = selectable && multiSelectProp;
45
- const treeId = useUniqueId(idProp);
46
- const treeRef = useRef(null);
47
- const handleRef = useForkRef(treeRef, ref);
48
- const [expanded, setExpandedState] = useControlled(
49
- expandedProp,
50
- defaultExpanded
51
- );
52
- const [selected, setSelectedState] = useControlled(
53
- selectedProp,
54
- defaultSelected
55
- );
56
- const [focusedNodeId, setFocusedNodeId] = useState(null);
57
- const nodeMap = useRef({});
58
- const firstCharMap = useRef({});
59
- const isExpanded = useCallback(
60
- (id) => !collapsible || (Array.isArray(expanded) ? expanded.indexOf(id) !== -1 : false),
61
- [collapsible, expanded]
62
- );
63
- const isExpandable = useCallback(
64
- (id) => collapsible && nodeMap.current[id] && nodeMap.current[id].expandable,
65
- [collapsible]
66
- );
67
- const isSelected = useCallback(
68
- (id) => selectable && (Array.isArray(selected) ? selected.indexOf(id) !== -1 : selected === id),
69
- [selectable, selected]
70
- );
71
- const isSelectable = useCallback(
72
- (id) => selectable && nodeMap.current[id] && nodeMap.current[id].selectable,
73
- [selectable]
74
- );
75
- const isDisabled = useCallback((id) => {
76
- let node = nodeMap.current[id];
77
- if (!node) {
78
- return false;
79
- }
80
- if (node.disabled) {
81
- return true;
82
- }
83
- while (node.parentId != null) {
84
- node = nodeMap.current[node.parentId];
85
- if (node.disabled) {
86
- return true;
87
- }
88
- }
89
- return false;
90
- }, []);
91
- const isFocused = useCallback(
92
- (id) => focusedNodeId === id,
93
- [focusedNodeId]
94
- );
95
- const isChildSelected = useCallback(
96
- // the second part of the condition is to ensure that the id we're
97
- // looking at is actually of a child (ie, there's at least one "-")
98
- (id) => {
99
- return Array().concat(selected).some((s) => s.startsWith(id) && s.includes("-"));
100
- },
101
- [selected]
102
- );
103
- const getChildrenIds = (id) => Object.keys(nodeMap.current).map((key) => {
104
- return nodeMap.current[key];
105
- }).filter((node) => node.parentId === id).toSorted((a, b) => a.index - b.index).map((child) => child.id);
106
- const getNavigableChildrenIds = useCallback(
107
- (id) => {
108
- let childrenIds = getChildrenIds(id);
109
- if (!disabledItemsFocusable) {
110
- childrenIds = childrenIds.filter((node) => !isDisabled(node));
111
- }
112
- return childrenIds;
113
- },
114
- [disabledItemsFocusable, isDisabled]
115
- );
116
- const getNextNode = useCallback(
117
- (id) => {
118
- if (isExpanded(id) && getNavigableChildrenIds(id).length > 0) {
119
- return getNavigableChildrenIds(id)[0];
120
- }
121
- let node = nodeMap.current[id];
122
- while (node != null) {
123
- const siblings = getNavigableChildrenIds(node.parentId);
124
- const nextSibling = siblings[siblings.indexOf(node.id) + 1];
125
- if (nextSibling) {
126
- return nextSibling;
127
- }
128
- node = nodeMap.current[node.parentId];
129
- }
130
- return null;
131
- },
132
- [getNavigableChildrenIds, isExpanded]
133
- );
134
- const getPreviousNode = (id) => {
135
- const node = nodeMap.current[id];
136
- const siblings = getNavigableChildrenIds(node.parentId);
137
- const nodeIndex = siblings.indexOf(id);
138
- if (nodeIndex === 0) {
139
- return node.parentId;
140
- }
141
- let currentNode = siblings[nodeIndex - 1];
142
- while (isExpanded(currentNode) && getNavigableChildrenIds(currentNode).length > 0) {
143
- currentNode = getNavigableChildrenIds(currentNode).pop();
144
- }
145
- return currentNode;
146
- };
147
- const getLastNode = () => {
148
- let lastNode = getNavigableChildrenIds(null).pop();
149
- while (isExpanded(lastNode)) {
150
- lastNode = getNavigableChildrenIds(lastNode).pop();
151
- }
152
- return lastNode;
153
- };
154
- const getFirstNode = () => getNavigableChildrenIds(null)[0];
155
- const getParent = (id) => nodeMap.current[id].parentId;
156
- const findOrderInTremauxTree = useCallback(
157
- (nodeAId, nodeBId) => {
158
- if (nodeAId === nodeBId) {
159
- return [nodeAId, nodeBId];
160
- }
161
- const nodeA = nodeMap.current[nodeAId];
162
- const nodeB = nodeMap.current[nodeBId];
163
- if (nodeA.parentId === nodeB.id || nodeB.parentId === nodeA.id) {
164
- return nodeB.parentId === nodeA.id ? [nodeA.id, nodeB.id] : [nodeB.id, nodeA.id];
165
- }
166
- const aFamily = [nodeA.id];
167
- const bFamily = [nodeB.id];
168
- let aAncestor = nodeA.parentId;
169
- let bAncestor = nodeB.parentId;
170
- let aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1;
171
- let bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1;
172
- let continueA = true;
173
- let continueB = true;
174
- while (!bAncestorIsCommon && !aAncestorIsCommon) {
175
- if (continueA) {
176
- aFamily.push(aAncestor);
177
- aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1;
178
- continueA = aAncestor !== null;
179
- if (!aAncestorIsCommon && continueA) {
180
- aAncestor = nodeMap.current[aAncestor].parentId;
181
- }
182
- }
183
- if (continueB && !aAncestorIsCommon) {
184
- bFamily.push(bAncestor);
185
- bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1;
186
- continueB = bAncestor !== null;
187
- if (!bAncestorIsCommon && continueB) {
188
- bAncestor = nodeMap.current[bAncestor].parentId;
189
- }
190
- }
191
- }
192
- const commonAncestor = aAncestorIsCommon ? aAncestor : bAncestor;
193
- const ancestorFamily = getChildrenIds(commonAncestor);
194
- const aSide = aFamily[aFamily.indexOf(commonAncestor) - 1];
195
- const bSide = bFamily[bFamily.indexOf(commonAncestor) - 1];
196
- return ancestorFamily.indexOf(aSide) < ancestorFamily.indexOf(bSide) ? [nodeAId, nodeBId] : [nodeBId, nodeAId];
197
- },
198
- []
199
- );
200
- const getNodesInRange = useCallback(
201
- (nodeA, nodeB) => {
202
- if (nodeA && nodeB) {
203
- const [first, last] = findOrderInTremauxTree(nodeA, nodeB);
204
- const nodes = [first];
205
- let current = first;
206
- while (current !== last) {
207
- current = getNextNode(current);
208
- nodes.push(current);
209
- }
210
- return nodes;
211
- }
212
- return [];
213
- },
214
- [findOrderInTremauxTree, getNextNode]
215
- );
216
- const focus = (event, id) => {
217
- if (id) {
218
- setFocusedNodeId(id);
219
- if (nodeMap.current[id]?.onFocus) {
220
- nodeMap.current[id].onFocus(event);
221
- }
222
- }
223
- };
224
- const focusNextNode = (event, id) => focus(event, getNextNode(id));
225
- const focusPreviousNode = (event, id) => focus(event, getPreviousNode(id));
226
- const focusFirstNode = (event) => focus(event, getFirstNode());
227
- const focusLastNode = (event) => focus(event, getLastNode());
228
- const focusByFirstCharacter = (event, id, char) => {
229
- let start;
230
- let index;
231
- const lowercaseChar = char.toLowerCase();
232
- const firstCharIds = [];
233
- const firstChars = [];
234
- Object.keys(firstCharMap.current).forEach((nodeId) => {
235
- const firstChar = firstCharMap.current[nodeId];
236
- const map = nodeMap.current[nodeId];
237
- const visible = map.parentId ? isExpanded(map.parentId) : true;
238
- const shouldBeSkipped = disabledItemsFocusable ? false : isDisabled(nodeId);
239
- if (visible && !shouldBeSkipped) {
240
- firstCharIds.push(nodeId);
241
- firstChars.push(firstChar);
242
- }
243
- });
244
- start = firstCharIds.indexOf(id) + 1;
245
- if (start >= firstCharIds.length) {
246
- start = 0;
247
- }
248
- index = findNextFirstChar(firstChars, start, lowercaseChar);
249
- if (index === -1) {
250
- index = findNextFirstChar(firstChars, 0, lowercaseChar);
251
- }
252
- if (index > -1) {
253
- focus(event, firstCharIds[index]);
254
- }
255
- };
256
- const toggleExpansion = useCallback(
257
- (event, value = focusedNodeId) => {
258
- if (!value) return;
259
- const newExpanded = expanded.includes(value) ? expanded.filter((id) => id !== value) : [value].concat(expanded);
260
- onToggle?.(event, newExpanded);
261
- setExpandedState(newExpanded);
262
- },
263
- [expanded, focusedNodeId, onToggle, setExpandedState]
264
- );
265
- const expandAllSiblings = (event, id) => {
266
- const map = nodeMap.current[id];
267
- const siblings = getChildrenIds(map.parentId);
268
- const diff = siblings.filter(
269
- (child) => isExpandable(child) && !isExpanded(child)
270
- );
271
- const newExpanded = expanded.concat(diff);
272
- if (diff.length > 0) {
273
- setExpandedState(newExpanded);
274
- onToggle?.(event, newExpanded);
275
- }
276
- };
277
- const lastSelectedNode = useRef(null);
278
- const lastSelectionWasRange = useRef(false);
279
- const currentRangeSelection = useRef([]);
280
- const isDivElement = (element) => {
281
- return element.nodeType === 1;
282
- };
283
- const handleRangeArrowSelect = useCallback(
284
- (event, nodes) => {
285
- let base = Array().concat(selected);
286
- const { start, next, current } = nodes;
287
- if (!next || !current) {
288
- return;
289
- }
290
- if (isDivElement(current) && currentRangeSelection.current.indexOf(current) === -1) {
291
- currentRangeSelection.current = [];
292
- }
293
- if (lastSelectionWasRange.current) {
294
- if (isDivElement(next) && currentRangeSelection.current.indexOf(next) !== -1) {
295
- base = base.filter((id) => id === start || id !== current);
296
- currentRangeSelection.current = currentRangeSelection.current.filter(
297
- (id) => id === start || id !== current
298
- );
299
- } else {
300
- base.push(next);
301
- currentRangeSelection.current.push(next);
302
- }
303
- } else {
304
- base.push(next);
305
- currentRangeSelection.current.push(current, next);
306
- }
307
- onChange?.(
308
- event,
309
- base,
310
- base.map((id) => nodeMap.current[id]?.payload)
311
- );
312
- setSelectedState(base);
313
- },
314
- [onChange, selected, setSelectedState]
315
- );
316
- const handleRangeSelect = useCallback(
317
- (event, nodes) => {
318
- let base = Array().concat(selected);
319
- const { start, end } = nodes;
320
- if (lastSelectionWasRange.current) {
321
- base = base.filter(
322
- (id) => !currentRangeSelection.current.includes(id)
323
- );
324
- }
325
- let range = getNodesInRange(start, end);
326
- range = range.filter((node) => !isDisabled(node));
327
- currentRangeSelection.current = range;
328
- let newSelected = base.concat(range);
329
- newSelected = newSelected.filter(
330
- (id, i) => newSelected.indexOf(id) === i
331
- );
332
- onChange?.(
333
- event,
334
- newSelected,
335
- newSelected.map((id) => nodeMap.current[id]?.payload)
336
- );
337
- setSelectedState(newSelected);
338
- },
339
- [getNodesInRange, isDisabled, onChange, selected, setSelectedState]
340
- );
341
- const handleMultipleSelect = useCallback(
342
- (event, value) => {
343
- const newSelected = selected.includes(value) ? selected.filter((id) => id !== value) : [value].concat(selected);
344
- onChange?.(
345
- event,
346
- newSelected,
347
- newSelected.map((id) => nodeMap.current[id]?.payload)
348
- );
349
- setSelectedState(newSelected);
350
- },
351
- [onChange, selected, setSelectedState]
352
- );
353
- const handleSingleSelect = useCallback(
354
- (event, value) => {
355
- const newSelected = multiSelect ? [value] : value;
356
- if (onChange) {
357
- const nodeValue = nodeMap.current[newSelected]?.payload;
358
- onChange(event, newSelected, multiSelect ? [nodeValue] : nodeValue);
359
- }
360
- setSelectedState(newSelected);
361
- },
362
- [multiSelect, onChange, setSelectedState]
363
- );
364
- const selectNode = useCallback(
365
- (event, id, multiple = false) => {
366
- if (id && isSelectable(id)) {
367
- if (multiple) {
368
- handleMultipleSelect(event, id);
369
- } else {
370
- handleSingleSelect(event, id);
371
- }
372
- lastSelectedNode.current = id;
373
- lastSelectionWasRange.current = false;
374
- currentRangeSelection.current = [];
375
- return true;
376
- }
377
- return false;
378
- },
379
- [handleMultipleSelect, handleSingleSelect, isSelectable]
380
- );
381
- const selectRange = useCallback(
382
- (event, nodes, stacked = false) => {
383
- const { start = lastSelectedNode.current, end, current } = nodes;
384
- if (stacked) {
385
- handleRangeArrowSelect(event, { start, next: end, current });
386
- } else if (start != null && end != null) {
387
- handleRangeSelect(event, { start, end });
388
- }
389
- lastSelectionWasRange.current = true;
390
- },
391
- [handleRangeArrowSelect, handleRangeSelect]
392
- );
393
- const rangeSelectToFirst = (event, id) => {
394
- if (!lastSelectedNode.current) {
395
- lastSelectedNode.current = id;
396
- }
397
- const start = lastSelectionWasRange.current ? lastSelectedNode.current : id;
398
- selectRange(event, {
399
- start,
400
- end: getFirstNode()
401
- });
402
- };
403
- const rangeSelectToLast = (event, id) => {
404
- if (!lastSelectedNode.current) {
405
- lastSelectedNode.current = id;
406
- }
407
- const start = lastSelectionWasRange.current ? lastSelectedNode.current : id;
408
- selectRange(event, {
409
- start,
410
- end: getLastNode()
411
- });
412
- };
413
- const selectNextNode = (event, id) => {
414
- if (!isDisabled(getNextNode(id))) {
415
- selectRange(
416
- event,
417
- {
418
- end: getNextNode(id),
419
- current: id
420
- },
421
- true
422
- );
423
- }
424
- };
425
- const selectPreviousNode = (event, id) => {
426
- if (!isDisabled(getPreviousNode(id))) {
427
- selectRange(
428
- event,
429
- {
430
- end: getPreviousNode(id),
431
- current: id
432
- },
433
- true
434
- );
435
- }
436
- };
437
- const selectAllNodes = (event) => {
438
- selectRange(event, { start: getFirstNode(), end: getLastNode() });
439
- };
440
- const registerNode = useCallback((node) => {
441
- const {
442
- id,
443
- index,
444
- parentId,
445
- expandable,
446
- idAttribute,
447
- disabled,
448
- selectable: nodeSelectable,
449
- onFocus: nodeOnFocus,
450
- payload
451
- } = node;
452
- nodeMap.current[id] = {
453
- id,
454
- index,
455
- parentId,
456
- expandable,
457
- idAttribute,
458
- disabled,
459
- selectable: nodeSelectable,
460
- onFocus: nodeOnFocus,
461
- payload
462
- };
463
- }, []);
464
- const unregisterNode = useCallback((id) => {
465
- const newMap = { ...nodeMap.current };
466
- delete newMap[id];
467
- nodeMap.current = newMap;
468
- setFocusedNodeId((oldFocusedNodeId) => {
469
- if (oldFocusedNodeId === id && treeRef.current && treeRef.current === (treeRef.current.ownerDocument || document).activeElement) {
470
- return getChildrenIds(null)[0];
471
- }
472
- return oldFocusedNodeId;
473
- });
474
- }, []);
475
- const mapFirstChar = useCallback((id, firstChar) => {
476
- firstCharMap.current[id] = firstChar;
477
- }, []);
478
- const unMapFirstChar = useCallback((id) => {
479
- const newMap = { ...firstCharMap.current };
480
- delete newMap[id];
481
- firstCharMap.current = newMap;
482
- }, []);
483
- const handleNextArrow = (event) => {
484
- if (!focusedNodeId) return false;
485
- if (isExpandable(focusedNodeId)) {
486
- if (isExpanded(focusedNodeId)) {
487
- focusNextNode(event, focusedNodeId);
488
- } else if (!isDisabled(focusedNodeId)) {
489
- toggleExpansion(event);
490
- }
491
- }
492
- return true;
493
- };
494
- const handlePreviousArrow = (event) => {
495
- if (!focusedNodeId) return false;
496
- if (isExpanded(focusedNodeId) && !isDisabled(focusedNodeId)) {
497
- toggleExpansion(event, focusedNodeId);
498
- return true;
499
- }
500
- const parent = getParent(focusedNodeId);
501
- if (parent) {
502
- focus(event, parent);
503
- return true;
504
- }
505
- return false;
506
- };
507
- const handleKeyDown = (event) => {
508
- let flag = false;
509
- const { key } = event;
510
- if (event.altKey || event.currentTarget !== event.target || !focusedNodeId) {
511
- return;
512
- }
513
- const ctrlPressed = event.ctrlKey || event.metaKey;
514
- switch (key) {
515
- case " ":
516
- if (isSelectable(focusedNodeId) && !isDisabled(focusedNodeId)) {
517
- if (multiSelect && event.shiftKey) {
518
- selectRange(event, { end: focusedNodeId });
519
- flag = true;
520
- } else if (multiSelect) {
521
- flag = selectNode(event, focusedNodeId, true);
522
- } else {
523
- flag = selectNode(event, focusedNodeId);
524
- }
525
- }
526
- event.stopPropagation();
527
- break;
528
- case "Enter":
529
- if (!isDisabled(focusedNodeId)) {
530
- if (isExpandable(focusedNodeId)) {
531
- toggleExpansion(event);
532
- flag = true;
533
- } else if (isSelectable(focusedNodeId)) {
534
- if (multiSelect && event.shiftKey) {
535
- selectRange(event, { end: focusedNodeId });
536
- flag = true;
537
- } else if (multiSelect) {
538
- flag = selectNode(event, focusedNodeId, true);
539
- } else {
540
- flag = selectNode(event, focusedNodeId);
541
- }
542
- }
543
- }
544
- event.stopPropagation();
545
- break;
546
- case "ArrowDown":
547
- if (multiSelect && event.shiftKey) {
548
- selectNextNode(event, focusedNodeId);
549
- }
550
- focusNextNode(event, focusedNodeId);
551
- flag = true;
552
- break;
553
- case "ArrowUp":
554
- if (multiSelect && event.shiftKey) {
555
- selectPreviousNode(event, focusedNodeId);
556
- }
557
- focusPreviousNode(event, focusedNodeId);
558
- flag = true;
559
- break;
560
- case "ArrowRight":
561
- flag = handleNextArrow(event);
562
- break;
563
- case "ArrowLeft":
564
- flag = handlePreviousArrow(event);
565
- break;
566
- case "Home":
567
- if (multiSelect && ctrlPressed && event.shiftKey && !isDisabled(focusedNodeId)) {
568
- rangeSelectToFirst(event, focusedNodeId);
569
- }
570
- focusFirstNode(event);
571
- flag = true;
572
- break;
573
- case "End":
574
- if (multiSelect && ctrlPressed && event.shiftKey && !isDisabled(focusedNodeId)) {
575
- rangeSelectToLast(event, focusedNodeId);
576
- }
577
- focusLastNode(event);
578
- flag = true;
579
- break;
580
- default:
581
- if (key === "*") {
582
- expandAllSiblings(event, focusedNodeId);
583
- flag = true;
584
- } else if (multiSelect && ctrlPressed && key.toLowerCase() === "a") {
585
- selectAllNodes(event);
586
- flag = true;
587
- } else if (!ctrlPressed && !event.shiftKey && isPrintableCharacter(key)) {
588
- focusByFirstCharacter(event, focusedNodeId, key);
589
- flag = true;
590
- }
591
- }
592
- if (flag) {
593
- event.preventDefault();
594
- event.stopPropagation();
595
- }
596
- onKeyDown?.(event);
597
- };
598
- const handleFocus = (event) => {
599
- if (event.target === event.currentTarget) {
600
- const firstSelected = Array.isArray(selected) ? selected[0] : selected;
601
- focus(event, firstSelected || getNavigableChildrenIds(null)[0]);
602
- }
603
- onFocus?.(event);
604
- };
605
- const handleBlur = (event) => {
606
- setFocusedNodeId(null);
607
- onBlur?.(event);
608
- };
609
- const activeDescendant = focusedNodeId && nodeMap.current[focusedNodeId] ? nodeMap.current[focusedNodeId].idAttribute : null;
610
- const treeControlContext = useMemo(
611
- () => ({
612
- treeId,
613
- mode,
614
- collapsible,
615
- toggleExpansion,
616
- multiSelect,
617
- selectNode: selectable ? selectNode : noopSelection,
618
- selectRange: selectable ? selectRange : noopSelection,
619
- disabledItemsFocusable,
620
- registerNode,
621
- unregisterNode,
622
- mapFirstChar,
623
- unMapFirstChar,
624
- focus
625
- }),
626
- [
627
- registerNode,
628
- unregisterNode,
629
- mapFirstChar,
630
- unMapFirstChar,
631
- toggleExpansion,
632
- selectable,
633
- selectNode,
634
- selectRange,
635
- mode,
636
- collapsible,
637
- multiSelect,
638
- disabledItemsFocusable,
639
- treeId
640
- ]
641
- );
642
- const treeStateContext = useMemo(
643
- () => ({
644
- isExpanded,
645
- isSelected,
646
- isFocused,
647
- isDisabled,
648
- isChildSelected
649
- }),
650
- [isDisabled, isExpanded, isFocused, isSelected, isChildSelected]
651
- );
652
- return /* @__PURE__ */ jsx(TreeViewControlContext.Provider, { value: treeControlContext, children: /* @__PURE__ */ jsx(TreeViewStateContext.Provider, { value: treeStateContext, children: /* @__PURE__ */ jsx(DescendantProvider, { children: /* @__PURE__ */ jsx(
653
- "ul",
654
- {
655
- ref: handleRef,
656
- id: idProp,
657
- className: cx(classes.root, className),
658
- ...treeviewMode && {
659
- id: treeId,
660
- role: "tree",
661
- "aria-multiselectable": multiSelect,
662
- "aria-activedescendant": activeDescendant,
663
- tabIndex: 0,
664
- onFocus: handleFocus,
665
- onBlur: handleBlur,
666
- onKeyDown: handleKeyDown
667
- },
668
- ...others,
669
- children
670
- }
671
- ) }) }) });
20
+ var HvVerticalNavigationTreeView = forwardRef(function HvVerticalNavigationTreeView(props, ref) {
21
+ const { id: idProp, className, classes: classesProp, mode = "treeview", collapsible = false, expanded: expandedProp, defaultExpanded = [], onToggle, selectable = false, multiSelect: multiSelectProp = false, selected: selectedProp, defaultSelected = [], onChange, disabledItemsFocusable = false, onFocus, onBlur, onKeyDown, children, ...others } = useDefaultProps("HvVerticalNavigationTreeView", props);
22
+ const { classes, cx } = useClasses(classesProp);
23
+ const treeviewMode = mode === "treeview";
24
+ const multiSelect = selectable && multiSelectProp;
25
+ const treeId = useUniqueId(idProp);
26
+ const treeRef = useRef(null);
27
+ const handleRef = useForkRef(treeRef, ref);
28
+ const [expanded, setExpandedState] = useControlled(expandedProp, defaultExpanded);
29
+ const [selected, setSelectedState] = useControlled(selectedProp, defaultSelected);
30
+ const [focusedNodeId, setFocusedNodeId] = useState(null);
31
+ const nodeMap = useRef({});
32
+ const firstCharMap = useRef({});
33
+ const isExpanded = useCallback((id) => !collapsible || (Array.isArray(expanded) ? expanded.indexOf(id) !== -1 : false), [collapsible, expanded]);
34
+ const isExpandable = useCallback((id) => collapsible && nodeMap.current[id] && nodeMap.current[id].expandable, [collapsible]);
35
+ const isSelected = useCallback((id) => selectable && (Array.isArray(selected) ? selected.indexOf(id) !== -1 : selected === id), [selectable, selected]);
36
+ const isSelectable = useCallback((id) => selectable && nodeMap.current[id] && nodeMap.current[id].selectable, [selectable]);
37
+ const isDisabled = useCallback((id) => {
38
+ let node = nodeMap.current[id];
39
+ if (!node) return false;
40
+ if (node.disabled) return true;
41
+ while (node.parentId != null) {
42
+ node = nodeMap.current[node.parentId];
43
+ if (node.disabled) return true;
44
+ }
45
+ return false;
46
+ }, []);
47
+ const isFocused = useCallback((id) => focusedNodeId === id, [focusedNodeId]);
48
+ const isChildSelected = useCallback((id) => {
49
+ return Array().concat(selected).some((s) => s.startsWith(id) && s.includes("-"));
50
+ }, [selected]);
51
+ const getChildrenIds = (id) => Object.keys(nodeMap.current).map((key) => {
52
+ return nodeMap.current[key];
53
+ }).filter((node) => node.parentId === id).toSorted((a, b) => a.index - b.index).map((child) => child.id);
54
+ const getNavigableChildrenIds = useCallback((id) => {
55
+ let childrenIds = getChildrenIds(id);
56
+ if (!disabledItemsFocusable) childrenIds = childrenIds.filter((node) => !isDisabled(node));
57
+ return childrenIds;
58
+ }, [disabledItemsFocusable, isDisabled]);
59
+ const getNextNode = useCallback((id) => {
60
+ if (isExpanded(id) && getNavigableChildrenIds(id).length > 0) return getNavigableChildrenIds(id)[0];
61
+ let node = nodeMap.current[id];
62
+ while (node != null) {
63
+ const siblings = getNavigableChildrenIds(node.parentId);
64
+ const nextSibling = siblings[siblings.indexOf(node.id) + 1];
65
+ if (nextSibling) return nextSibling;
66
+ node = nodeMap.current[node.parentId];
67
+ }
68
+ return null;
69
+ }, [getNavigableChildrenIds, isExpanded]);
70
+ const getPreviousNode = (id) => {
71
+ const node = nodeMap.current[id];
72
+ const siblings = getNavigableChildrenIds(node.parentId);
73
+ const nodeIndex = siblings.indexOf(id);
74
+ if (nodeIndex === 0) return node.parentId;
75
+ let currentNode = siblings[nodeIndex - 1];
76
+ while (isExpanded(currentNode) && getNavigableChildrenIds(currentNode).length > 0) currentNode = getNavigableChildrenIds(currentNode).pop();
77
+ return currentNode;
78
+ };
79
+ const getLastNode = () => {
80
+ let lastNode = getNavigableChildrenIds(null).pop();
81
+ while (isExpanded(lastNode)) lastNode = getNavigableChildrenIds(lastNode).pop();
82
+ return lastNode;
83
+ };
84
+ const getFirstNode = () => getNavigableChildrenIds(null)[0];
85
+ const getParent = (id) => nodeMap.current[id].parentId;
86
+ /**
87
+ * This is used to determine the start and end of a selection range so
88
+ * we can get the nodes between the two border nodes.
89
+ *
90
+ * It finds the nodes' common ancestor using
91
+ * a naive implementation of a lowest common ancestor algorithm
92
+ * (https://en.wikipedia.org/wiki/Lowest_common_ancestor).
93
+ * Then compares the ancestor's 2 children that are ancestors of nodeA and NodeB
94
+ * so we can compare their indexes to work out which node comes first in a depth first search.
95
+ * (https://en.wikipedia.org/wiki/Depth-first_search)
96
+ *
97
+ * Another way to put it is which node is shallower in a trémaux tree
98
+ * https://en.wikipedia.org/wiki/Tr%C3%A9maux_tree
99
+ */
100
+ const findOrderInTremauxTree = useCallback((nodeAId, nodeBId) => {
101
+ if (nodeAId === nodeBId) return [nodeAId, nodeBId];
102
+ const nodeA = nodeMap.current[nodeAId];
103
+ const nodeB = nodeMap.current[nodeBId];
104
+ if (nodeA.parentId === nodeB.id || nodeB.parentId === nodeA.id) return nodeB.parentId === nodeA.id ? [nodeA.id, nodeB.id] : [nodeB.id, nodeA.id];
105
+ const aFamily = [nodeA.id];
106
+ const bFamily = [nodeB.id];
107
+ let aAncestor = nodeA.parentId;
108
+ let bAncestor = nodeB.parentId;
109
+ let aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1;
110
+ let bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1;
111
+ let continueA = true;
112
+ let continueB = true;
113
+ while (!bAncestorIsCommon && !aAncestorIsCommon) {
114
+ if (continueA) {
115
+ aFamily.push(aAncestor);
116
+ aAncestorIsCommon = bFamily.indexOf(aAncestor) !== -1;
117
+ continueA = aAncestor !== null;
118
+ if (!aAncestorIsCommon && continueA) aAncestor = nodeMap.current[aAncestor].parentId;
119
+ }
120
+ if (continueB && !aAncestorIsCommon) {
121
+ bFamily.push(bAncestor);
122
+ bAncestorIsCommon = aFamily.indexOf(bAncestor) !== -1;
123
+ continueB = bAncestor !== null;
124
+ if (!bAncestorIsCommon && continueB) bAncestor = nodeMap.current[bAncestor].parentId;
125
+ }
126
+ }
127
+ const commonAncestor = aAncestorIsCommon ? aAncestor : bAncestor;
128
+ const ancestorFamily = getChildrenIds(commonAncestor);
129
+ const aSide = aFamily[aFamily.indexOf(commonAncestor) - 1];
130
+ const bSide = bFamily[bFamily.indexOf(commonAncestor) - 1];
131
+ return ancestorFamily.indexOf(aSide) < ancestorFamily.indexOf(bSide) ? [nodeAId, nodeBId] : [nodeBId, nodeAId];
132
+ }, []);
133
+ const getNodesInRange = useCallback((nodeA, nodeB) => {
134
+ if (nodeA && nodeB) {
135
+ const [first, last] = findOrderInTremauxTree(nodeA, nodeB);
136
+ const nodes = [first];
137
+ let current = first;
138
+ while (current !== last) {
139
+ current = getNextNode(current);
140
+ nodes.push(current);
141
+ }
142
+ return nodes;
143
+ }
144
+ return [];
145
+ }, [findOrderInTremauxTree, getNextNode]);
146
+ const focus = (event, id) => {
147
+ if (id) {
148
+ setFocusedNodeId(id);
149
+ if (nodeMap.current[id]?.onFocus) nodeMap.current[id].onFocus(event);
150
+ }
151
+ };
152
+ const focusNextNode = (event, id) => focus(event, getNextNode(id));
153
+ const focusPreviousNode = (event, id) => focus(event, getPreviousNode(id));
154
+ const focusFirstNode = (event) => focus(event, getFirstNode());
155
+ const focusLastNode = (event) => focus(event, getLastNode());
156
+ const focusByFirstCharacter = (event, id, char) => {
157
+ let start;
158
+ let index;
159
+ const lowercaseChar = char.toLowerCase();
160
+ const firstCharIds = [];
161
+ const firstChars = [];
162
+ Object.keys(firstCharMap.current).forEach((nodeId) => {
163
+ const firstChar = firstCharMap.current[nodeId];
164
+ const map = nodeMap.current[nodeId];
165
+ const visible = map.parentId ? isExpanded(map.parentId) : true;
166
+ const shouldBeSkipped = disabledItemsFocusable ? false : isDisabled(nodeId);
167
+ if (visible && !shouldBeSkipped) {
168
+ firstCharIds.push(nodeId);
169
+ firstChars.push(firstChar);
170
+ }
171
+ });
172
+ start = firstCharIds.indexOf(id) + 1;
173
+ if (start >= firstCharIds.length) start = 0;
174
+ index = findNextFirstChar(firstChars, start, lowercaseChar);
175
+ if (index === -1) index = findNextFirstChar(firstChars, 0, lowercaseChar);
176
+ if (index > -1) focus(event, firstCharIds[index]);
177
+ };
178
+ const toggleExpansion = useCallback((event, value = focusedNodeId) => {
179
+ if (!value) return;
180
+ const newExpanded = expanded.includes(value) ? expanded.filter((id) => id !== value) : [value].concat(expanded);
181
+ onToggle?.(event, newExpanded);
182
+ setExpandedState(newExpanded);
183
+ }, [
184
+ expanded,
185
+ focusedNodeId,
186
+ onToggle,
187
+ setExpandedState
188
+ ]);
189
+ const expandAllSiblings = (event, id) => {
190
+ const map = nodeMap.current[id];
191
+ const diff = getChildrenIds(map.parentId).filter((child) => isExpandable(child) && !isExpanded(child));
192
+ const newExpanded = expanded.concat(diff);
193
+ if (diff.length > 0) {
194
+ setExpandedState(newExpanded);
195
+ onToggle?.(event, newExpanded);
196
+ }
197
+ };
198
+ const lastSelectedNode = useRef(null);
199
+ const lastSelectionWasRange = useRef(false);
200
+ const currentRangeSelection = useRef([]);
201
+ const isDivElement = (element) => {
202
+ return element.nodeType === 1;
203
+ };
204
+ const handleRangeArrowSelect = useCallback((event, nodes) => {
205
+ let base = Array().concat(selected);
206
+ const { start, next, current } = nodes;
207
+ if (!next || !current) return;
208
+ if (isDivElement(current) && currentRangeSelection.current.indexOf(current) === -1) currentRangeSelection.current = [];
209
+ if (lastSelectionWasRange.current) if (isDivElement(next) && currentRangeSelection.current.indexOf(next) !== -1) {
210
+ base = base.filter((id) => id === start || id !== current);
211
+ currentRangeSelection.current = currentRangeSelection.current.filter((id) => id === start || id !== current);
212
+ } else {
213
+ base.push(next);
214
+ currentRangeSelection.current.push(next);
215
+ }
216
+ else {
217
+ base.push(next);
218
+ currentRangeSelection.current.push(current, next);
219
+ }
220
+ onChange?.(event, base, base.map((id) => nodeMap.current[id]?.payload));
221
+ setSelectedState(base);
222
+ }, [
223
+ onChange,
224
+ selected,
225
+ setSelectedState
226
+ ]);
227
+ const handleRangeSelect = useCallback((event, nodes) => {
228
+ let base = Array().concat(selected);
229
+ const { start, end } = nodes;
230
+ if (lastSelectionWasRange.current) base = base.filter((id) => !currentRangeSelection.current.includes(id));
231
+ let range = getNodesInRange(start, end);
232
+ range = range.filter((node) => !isDisabled(node));
233
+ currentRangeSelection.current = range;
234
+ let newSelected = base.concat(range);
235
+ newSelected = newSelected.filter((id, i) => newSelected.indexOf(id) === i);
236
+ onChange?.(event, newSelected, newSelected.map((id) => nodeMap.current[id]?.payload));
237
+ setSelectedState(newSelected);
238
+ }, [
239
+ getNodesInRange,
240
+ isDisabled,
241
+ onChange,
242
+ selected,
243
+ setSelectedState
244
+ ]);
245
+ const handleMultipleSelect = useCallback((event, value) => {
246
+ const newSelected = selected.includes(value) ? selected.filter((id) => id !== value) : [value].concat(selected);
247
+ onChange?.(event, newSelected, newSelected.map((id) => nodeMap.current[id]?.payload));
248
+ setSelectedState(newSelected);
249
+ }, [
250
+ onChange,
251
+ selected,
252
+ setSelectedState
253
+ ]);
254
+ const handleSingleSelect = useCallback((event, value) => {
255
+ const newSelected = multiSelect ? [value] : value;
256
+ if (onChange) {
257
+ const nodeValue = nodeMap.current[newSelected]?.payload;
258
+ onChange(event, newSelected, multiSelect ? [nodeValue] : nodeValue);
259
+ }
260
+ setSelectedState(newSelected);
261
+ }, [
262
+ multiSelect,
263
+ onChange,
264
+ setSelectedState
265
+ ]);
266
+ const selectNode = useCallback((event, id, multiple = false) => {
267
+ if (id && isSelectable(id)) {
268
+ if (multiple) handleMultipleSelect(event, id);
269
+ else handleSingleSelect(event, id);
270
+ lastSelectedNode.current = id;
271
+ lastSelectionWasRange.current = false;
272
+ currentRangeSelection.current = [];
273
+ return true;
274
+ }
275
+ return false;
276
+ }, [
277
+ handleMultipleSelect,
278
+ handleSingleSelect,
279
+ isSelectable
280
+ ]);
281
+ const selectRange = useCallback((event, nodes, stacked = false) => {
282
+ const { start = lastSelectedNode.current, end, current } = nodes;
283
+ if (stacked) handleRangeArrowSelect(event, {
284
+ start,
285
+ next: end,
286
+ current
287
+ });
288
+ else if (start != null && end != null) handleRangeSelect(event, {
289
+ start,
290
+ end
291
+ });
292
+ lastSelectionWasRange.current = true;
293
+ }, [handleRangeArrowSelect, handleRangeSelect]);
294
+ const rangeSelectToFirst = (event, id) => {
295
+ if (!lastSelectedNode.current) lastSelectedNode.current = id;
296
+ selectRange(event, {
297
+ start: lastSelectionWasRange.current ? lastSelectedNode.current : id,
298
+ end: getFirstNode()
299
+ });
300
+ };
301
+ const rangeSelectToLast = (event, id) => {
302
+ if (!lastSelectedNode.current) lastSelectedNode.current = id;
303
+ selectRange(event, {
304
+ start: lastSelectionWasRange.current ? lastSelectedNode.current : id,
305
+ end: getLastNode()
306
+ });
307
+ };
308
+ const selectNextNode = (event, id) => {
309
+ if (!isDisabled(getNextNode(id))) selectRange(event, {
310
+ end: getNextNode(id),
311
+ current: id
312
+ }, true);
313
+ };
314
+ const selectPreviousNode = (event, id) => {
315
+ if (!isDisabled(getPreviousNode(id))) selectRange(event, {
316
+ end: getPreviousNode(id),
317
+ current: id
318
+ }, true);
319
+ };
320
+ const selectAllNodes = (event) => {
321
+ selectRange(event, {
322
+ start: getFirstNode(),
323
+ end: getLastNode()
324
+ });
325
+ };
326
+ const registerNode = useCallback((node) => {
327
+ const { id, index, parentId, expandable, idAttribute, disabled, selectable: nodeSelectable, onFocus: nodeOnFocus, payload } = node;
328
+ nodeMap.current[id] = {
329
+ id,
330
+ index,
331
+ parentId,
332
+ expandable,
333
+ idAttribute,
334
+ disabled,
335
+ selectable: nodeSelectable,
336
+ onFocus: nodeOnFocus,
337
+ payload
338
+ };
339
+ }, []);
340
+ const unregisterNode = useCallback((id) => {
341
+ const newMap = { ...nodeMap.current };
342
+ delete newMap[id];
343
+ nodeMap.current = newMap;
344
+ setFocusedNodeId((oldFocusedNodeId) => {
345
+ if (oldFocusedNodeId === id && treeRef.current && treeRef.current === (treeRef.current.ownerDocument || document).activeElement) return getChildrenIds(null)[0];
346
+ return oldFocusedNodeId;
347
+ });
348
+ }, []);
349
+ const mapFirstChar = useCallback((id, firstChar) => {
350
+ firstCharMap.current[id] = firstChar;
351
+ }, []);
352
+ const unMapFirstChar = useCallback((id) => {
353
+ const newMap = { ...firstCharMap.current };
354
+ delete newMap[id];
355
+ firstCharMap.current = newMap;
356
+ }, []);
357
+ /**
358
+ * Event handlers and Navigation
359
+ */
360
+ const handleNextArrow = (event) => {
361
+ if (!focusedNodeId) return false;
362
+ if (isExpandable(focusedNodeId)) {
363
+ if (isExpanded(focusedNodeId)) focusNextNode(event, focusedNodeId);
364
+ else if (!isDisabled(focusedNodeId)) toggleExpansion(event);
365
+ }
366
+ return true;
367
+ };
368
+ const handlePreviousArrow = (event) => {
369
+ if (!focusedNodeId) return false;
370
+ if (isExpanded(focusedNodeId) && !isDisabled(focusedNodeId)) {
371
+ toggleExpansion(event, focusedNodeId);
372
+ return true;
373
+ }
374
+ const parent = getParent(focusedNodeId);
375
+ if (parent) {
376
+ focus(event, parent);
377
+ return true;
378
+ }
379
+ return false;
380
+ };
381
+ const handleKeyDown = (event) => {
382
+ let flag = false;
383
+ const { key } = event;
384
+ if (event.altKey || event.currentTarget !== event.target || !focusedNodeId) return;
385
+ const ctrlPressed = event.ctrlKey || event.metaKey;
386
+ switch (key) {
387
+ case " ":
388
+ if (isSelectable(focusedNodeId) && !isDisabled(focusedNodeId)) if (multiSelect && event.shiftKey) {
389
+ selectRange(event, { end: focusedNodeId });
390
+ flag = true;
391
+ } else if (multiSelect) flag = selectNode(event, focusedNodeId, true);
392
+ else flag = selectNode(event, focusedNodeId);
393
+ event.stopPropagation();
394
+ break;
395
+ case "Enter":
396
+ if (!isDisabled(focusedNodeId)) {
397
+ if (isExpandable(focusedNodeId)) {
398
+ toggleExpansion(event);
399
+ flag = true;
400
+ } else if (isSelectable(focusedNodeId)) if (multiSelect && event.shiftKey) {
401
+ selectRange(event, { end: focusedNodeId });
402
+ flag = true;
403
+ } else if (multiSelect) flag = selectNode(event, focusedNodeId, true);
404
+ else flag = selectNode(event, focusedNodeId);
405
+ }
406
+ event.stopPropagation();
407
+ break;
408
+ case "ArrowDown":
409
+ if (multiSelect && event.shiftKey) selectNextNode(event, focusedNodeId);
410
+ focusNextNode(event, focusedNodeId);
411
+ flag = true;
412
+ break;
413
+ case "ArrowUp":
414
+ if (multiSelect && event.shiftKey) selectPreviousNode(event, focusedNodeId);
415
+ focusPreviousNode(event, focusedNodeId);
416
+ flag = true;
417
+ break;
418
+ case "ArrowRight":
419
+ flag = handleNextArrow(event);
420
+ break;
421
+ case "ArrowLeft":
422
+ flag = handlePreviousArrow(event);
423
+ break;
424
+ case "Home":
425
+ if (multiSelect && ctrlPressed && event.shiftKey && !isDisabled(focusedNodeId)) rangeSelectToFirst(event, focusedNodeId);
426
+ focusFirstNode(event);
427
+ flag = true;
428
+ break;
429
+ case "End":
430
+ if (multiSelect && ctrlPressed && event.shiftKey && !isDisabled(focusedNodeId)) rangeSelectToLast(event, focusedNodeId);
431
+ focusLastNode(event);
432
+ flag = true;
433
+ break;
434
+ default: if (key === "*") {
435
+ expandAllSiblings(event, focusedNodeId);
436
+ flag = true;
437
+ } else if (multiSelect && ctrlPressed && key.toLowerCase() === "a") {
438
+ selectAllNodes(event);
439
+ flag = true;
440
+ } else if (!ctrlPressed && !event.shiftKey && isPrintableCharacter(key)) {
441
+ focusByFirstCharacter(event, focusedNodeId, key);
442
+ flag = true;
443
+ }
444
+ }
445
+ if (flag) {
446
+ event.preventDefault();
447
+ event.stopPropagation();
448
+ }
449
+ onKeyDown?.(event);
450
+ };
451
+ const handleFocus = (event) => {
452
+ if (event.target === event.currentTarget) focus(event, (Array.isArray(selected) ? selected[0] : selected) || getNavigableChildrenIds(null)[0]);
453
+ onFocus?.(event);
454
+ };
455
+ const handleBlur = (event) => {
456
+ setFocusedNodeId(null);
457
+ onBlur?.(event);
458
+ };
459
+ const activeDescendant = focusedNodeId && nodeMap.current[focusedNodeId] ? nodeMap.current[focusedNodeId].idAttribute : null;
460
+ const treeControlContext = useMemo(() => ({
461
+ treeId,
462
+ mode,
463
+ collapsible,
464
+ toggleExpansion,
465
+ multiSelect,
466
+ selectNode: selectable ? selectNode : noopSelection,
467
+ selectRange: selectable ? selectRange : noopSelection,
468
+ disabledItemsFocusable,
469
+ registerNode,
470
+ unregisterNode,
471
+ mapFirstChar,
472
+ unMapFirstChar,
473
+ focus
474
+ }), [
475
+ registerNode,
476
+ unregisterNode,
477
+ mapFirstChar,
478
+ unMapFirstChar,
479
+ toggleExpansion,
480
+ selectable,
481
+ selectNode,
482
+ selectRange,
483
+ mode,
484
+ collapsible,
485
+ multiSelect,
486
+ disabledItemsFocusable,
487
+ treeId
488
+ ]);
489
+ const treeStateContext = useMemo(() => ({
490
+ isExpanded,
491
+ isSelected,
492
+ isFocused,
493
+ isDisabled,
494
+ isChildSelected
495
+ }), [
496
+ isDisabled,
497
+ isExpanded,
498
+ isFocused,
499
+ isSelected,
500
+ isChildSelected
501
+ ]);
502
+ return /* @__PURE__ */ jsx(TreeViewControlContext.Provider, {
503
+ value: treeControlContext,
504
+ children: /* @__PURE__ */ jsx(TreeViewStateContext.Provider, {
505
+ value: treeStateContext,
506
+ children: /* @__PURE__ */ jsx(DescendantProvider, { children: /* @__PURE__ */ jsx("ul", {
507
+ ref: handleRef,
508
+ id: idProp,
509
+ className: cx(classes.root, className),
510
+ ...treeviewMode && {
511
+ id: treeId,
512
+ role: "tree",
513
+ "aria-multiselectable": multiSelect,
514
+ "aria-activedescendant": activeDescendant,
515
+ tabIndex: 0,
516
+ onFocus: handleFocus,
517
+ onBlur: handleBlur,
518
+ onKeyDown: handleKeyDown
519
+ },
520
+ ...others,
521
+ children
522
+ }) })
523
+ })
524
+ });
672
525
  });
673
- export {
674
- HvVerticalNavigationTreeView,
675
- staticClasses as treeViewClasses
676
- };
526
+ //#endregion
527
+ export { HvVerticalNavigationTreeView };