@hitachivantara/uikit-react-core 6.8.2 → 6.9.1

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 (442) hide show
  1. package/LICENSE +201 -0
  2. package/dist/Accordion/Accordion.js +69 -80
  3. package/dist/Accordion/Accordion.styles.js +21 -16
  4. package/dist/ActionBar/ActionBar.js +18 -17
  5. package/dist/ActionBar/ActionBar.styles.js +12 -15
  6. package/dist/ActionsGeneric/ActionsGeneric.js +72 -98
  7. package/dist/ActionsGeneric/ActionsGeneric.styles.js +17 -14
  8. package/dist/AppSwitcher/Action/Action.js +96 -111
  9. package/dist/AppSwitcher/Action/Action.styles.js +44 -48
  10. package/dist/AppSwitcher/AppSwitcher.js +70 -98
  11. package/dist/AppSwitcher/AppSwitcher.styles.js +50 -53
  12. package/dist/Avatar/Avatar.js +66 -111
  13. package/dist/Avatar/Avatar.styles.js +62 -52
  14. package/dist/AvatarGroup/AvatarGroup.js +49 -78
  15. package/dist/AvatarGroup/AvatarGroup.styles.js +40 -60
  16. package/dist/AvatarGroup/AvatarGroupContext.js +13 -16
  17. package/dist/Badge/Badge.js +40 -49
  18. package/dist/Badge/Badge.styles.js +50 -50
  19. package/dist/Banner/Banner.js +50 -82
  20. package/dist/Banner/Banner.styles.js +13 -22
  21. package/dist/Banner/BannerContent/BannerContent.js +35 -56
  22. package/dist/Banner/BannerContent/BannerContent.styles.js +31 -36
  23. package/dist/BaseCheckBox/BaseCheckBox.js +71 -88
  24. package/dist/BaseCheckBox/BaseCheckBox.styles.js +24 -31
  25. package/dist/BaseCheckBox/CheckBoxIcon.js +57 -73
  26. package/dist/BaseDropdown/BaseDropdown.js +147 -189
  27. package/dist/BaseDropdown/BaseDropdown.styles.js +72 -84
  28. package/dist/BaseDropdown/BaseDropdownPanel.js +69 -86
  29. package/dist/BaseDropdown/utils.js +77 -76
  30. package/dist/BaseInput/BaseInput.js +53 -89
  31. package/dist/BaseInput/BaseInput.styles.js +85 -105
  32. package/dist/BaseInput/validations.js +72 -69
  33. package/dist/BaseRadio/BaseRadio.js +61 -85
  34. package/dist/BaseRadio/BaseRadio.styles.js +26 -31
  35. package/dist/BaseRadio/RadioIcon.js +43 -48
  36. package/dist/BaseSwitch/BaseSwitch.js +70 -108
  37. package/dist/BaseSwitch/BaseSwitch.styles.js +94 -113
  38. package/dist/BreadCrumb/BreadCrumb.js +84 -106
  39. package/dist/BreadCrumb/BreadCrumb.styles.js +20 -17
  40. package/dist/BreadCrumb/Page/Page.js +24 -34
  41. package/dist/BreadCrumb/Page/Page.styles.js +20 -25
  42. package/dist/BreadCrumb/PathElement/PathElement.js +17 -17
  43. package/dist/BreadCrumb/PathElement/PathElement.styles.js +9 -7
  44. package/dist/BreadCrumb/utils.js +19 -27
  45. package/dist/BulkActions/BulkActions.js +57 -96
  46. package/dist/BulkActions/BulkActions.styles.js +37 -45
  47. package/dist/Button/Button.js +67 -95
  48. package/dist/Button/Button.styles.js +107 -124
  49. package/dist/ButtonBase/ButtonBase.js +32 -51
  50. package/dist/ButtonBase/ButtonBase.styles.js +21 -30
  51. package/dist/Calendar/Calendar.js +73 -101
  52. package/dist/Calendar/Calendar.styles.js +14 -32
  53. package/dist/Calendar/CalendarHeader/CalendarHeader.js +91 -118
  54. package/dist/Calendar/CalendarHeader/CalendarHeader.styles.js +11 -16
  55. package/dist/Calendar/CalendarNavigation/ComposedNavigation/ComposedNavigation.js +36 -50
  56. package/dist/Calendar/CalendarNavigation/ComposedNavigation/ComposedNavigation.styles.js +12 -18
  57. package/dist/Calendar/CalendarNavigation/MonthSelector/MonthSelector.js +23 -43
  58. package/dist/Calendar/CalendarNavigation/MonthSelector/MonthSelector.styles.js +21 -24
  59. package/dist/Calendar/CalendarNavigation/Navigation/Navigation.js +43 -59
  60. package/dist/Calendar/CalendarNavigation/Navigation/Navigation.styles.js +21 -24
  61. package/dist/Calendar/SingleCalendar/CalendarCell.js +60 -84
  62. package/dist/Calendar/SingleCalendar/CalendarCell.styles.js +39 -56
  63. package/dist/Calendar/SingleCalendar/SingleCalendar.js +121 -154
  64. package/dist/Calendar/SingleCalendar/SingleCalendar.styles.js +53 -68
  65. package/dist/Calendar/model.js +45 -62
  66. package/dist/Calendar/utils.js +233 -128
  67. package/dist/Card/Card.js +35 -53
  68. package/dist/Card/Card.styles.js +37 -50
  69. package/dist/Card/Content/Content.js +15 -27
  70. package/dist/Card/Content/Content.styles.js +5 -10
  71. package/dist/Card/Header/Header.js +22 -35
  72. package/dist/Card/Header/Header.styles.js +22 -25
  73. package/dist/Card/Media/Media.js +16 -26
  74. package/dist/Card/Media/Media.styles.js +6 -7
  75. package/dist/Carousel/Carousel.js +176 -207
  76. package/dist/Carousel/Carousel.styles.js +141 -166
  77. package/dist/Carousel/CarouselControls.js +48 -62
  78. package/dist/Carousel/CarouselSlide/CarouselSlide.js +19 -25
  79. package/dist/Carousel/CarouselSlide/CarouselSlide.styles.js +10 -11
  80. package/dist/Carousel/CarouselThumbnails.js +29 -36
  81. package/dist/CheckBox/CheckBox.js +112 -182
  82. package/dist/CheckBox/CheckBox.styles.js +48 -57
  83. package/dist/CheckBoxGroup/CheckBoxGroup.js +154 -245
  84. package/dist/CheckBoxGroup/CheckBoxGroup.styles.js +29 -35
  85. package/dist/ColorPicker/ColorPicker.js +146 -222
  86. package/dist/ColorPicker/ColorPicker.styles.js +40 -45
  87. package/dist/ColorPicker/Picker/Fields.js +125 -141
  88. package/dist/ColorPicker/Picker/Picker.js +51 -50
  89. package/dist/ColorPicker/Picker/Picker.styles.js +42 -42
  90. package/dist/ColorPicker/PresetColors/PresetColors.js +25 -28
  91. package/dist/ColorPicker/PresetColors/PresetColors.styles.js +17 -17
  92. package/dist/ColorPicker/SavedColors/SavedColors.js +37 -41
  93. package/dist/ColorPicker/SavedColors/SavedColors.styles.js +27 -29
  94. package/dist/ColorPicker/Swatch.js +22 -37
  95. package/dist/Container/Container.js +37 -58
  96. package/dist/Container/Container.styles.js +12 -13
  97. package/dist/Controls/Controls.js +50 -74
  98. package/dist/Controls/Controls.styles.js +16 -13
  99. package/dist/Controls/LeftControl/LeftControl.js +25 -38
  100. package/dist/Controls/LeftControl/LeftControl.styles.js +7 -7
  101. package/dist/Controls/RightControl/RightControl.js +31 -46
  102. package/dist/Controls/RightControl/RightControl.styles.js +9 -7
  103. package/dist/Controls/context/ControlsContext.js +5 -6
  104. package/dist/DatePicker/DatePicker.js +286 -339
  105. package/dist/DatePicker/DatePicker.styles.js +25 -40
  106. package/dist/DatePicker/useVisibleDate.js +142 -126
  107. package/dist/DatePicker/utils.js +17 -26
  108. package/dist/Dialog/Actions/Actions.js +19 -29
  109. package/dist/Dialog/Actions/Actions.styles.js +20 -20
  110. package/dist/Dialog/Content/Content.js +29 -46
  111. package/dist/Dialog/Content/Content.styles.js +14 -15
  112. package/dist/Dialog/Dialog.js +49 -69
  113. package/dist/Dialog/Dialog.styles.js +33 -46
  114. package/dist/Dialog/Title/Title.js +20 -42
  115. package/dist/Dialog/Title/Title.styles.js +14 -16
  116. package/dist/Dialog/context.js +5 -6
  117. package/dist/DotPagination/DotPagination.js +44 -59
  118. package/dist/DotPagination/DotPagination.styles.js +44 -47
  119. package/dist/Drawer/Drawer.js +37 -64
  120. package/dist/Drawer/Drawer.styles.js +18 -21
  121. package/dist/DropDownMenu/DropDownMenu.js +88 -124
  122. package/dist/DropDownMenu/DropDownMenu.styles.js +12 -21
  123. package/dist/Dropdown/Dropdown.js +221 -310
  124. package/dist/Dropdown/Dropdown.styles.js +39 -48
  125. package/dist/Dropdown/List/List.js +194 -176
  126. package/dist/Dropdown/List/List.styles.js +23 -24
  127. package/dist/Dropdown/utils.js +15 -16
  128. package/dist/DropdownButton/DropdownButton.js +42 -46
  129. package/dist/DropdownButton/DropdownButton.styles.js +37 -47
  130. package/dist/EmptyState/EmptyState.js +48 -61
  131. package/dist/EmptyState/EmptyState.styles.js +31 -31
  132. package/dist/FileUploader/DropZone/DropZone.js +141 -179
  133. package/dist/FileUploader/DropZone/DropZone.styles.js +55 -68
  134. package/dist/FileUploader/File/File.js +85 -75
  135. package/dist/FileUploader/File/File.styles.js +55 -60
  136. package/dist/FileUploader/FileList/FileList.js +19 -28
  137. package/dist/FileUploader/FileList/FileList.styles.js +15 -16
  138. package/dist/FileUploader/FileUploader.js +35 -55
  139. package/dist/FileUploader/FileUploader.styles.js +4 -7
  140. package/dist/FileUploader/Preview/Preview.js +37 -52
  141. package/dist/FileUploader/Preview/Preview.styles.js +22 -28
  142. package/dist/FileUploader/utils.js +24 -11
  143. package/dist/FilterGroup/Counter/Counter.js +31 -43
  144. package/dist/FilterGroup/Counter/Counter.styles.js +12 -15
  145. package/dist/FilterGroup/FilterContent/FilterContent.js +138 -177
  146. package/dist/FilterGroup/FilterContent/FilterContent.styles.js +46 -53
  147. package/dist/FilterGroup/FilterContent/HeaderButton.js +77 -100
  148. package/dist/FilterGroup/FilterGroup.js +87 -136
  149. package/dist/FilterGroup/FilterGroup.styles.js +9 -10
  150. package/dist/FilterGroup/FilterGroupContext.js +68 -73
  151. package/dist/FilterGroup/LeftPanel/LeftPanel.js +28 -31
  152. package/dist/FilterGroup/LeftPanel/LeftPanel.styles.js +6 -11
  153. package/dist/FilterGroup/RightPanel/RightPanel.js +118 -151
  154. package/dist/FilterGroup/RightPanel/RightPanel.styles.js +17 -27
  155. package/dist/Focus/Focus.js +248 -344
  156. package/dist/Focus/Focus.styles.js +28 -39
  157. package/dist/Focus/utils.js +14 -20
  158. package/dist/Footer/Footer.js +36 -38
  159. package/dist/Footer/Footer.styles.js +40 -43
  160. package/dist/FormElement/Adornment/Adornment.js +38 -49
  161. package/dist/FormElement/Adornment/Adornment.styles.js +14 -15
  162. package/dist/FormElement/CharCounter/CharCounter.js +51 -73
  163. package/dist/FormElement/CharCounter/CharCounter.styles.js +12 -10
  164. package/dist/FormElement/FormElement.js +53 -31
  165. package/dist/FormElement/FormElement.styles.js +4 -7
  166. package/dist/FormElement/InfoMessage/InfoMessage.js +26 -41
  167. package/dist/FormElement/InfoMessage/InfoMessage.styles.js +11 -9
  168. package/dist/FormElement/Label/Label.js +33 -56
  169. package/dist/FormElement/Label/Label.styles.js +11 -9
  170. package/dist/FormElement/LabelContainer.js +46 -55
  171. package/dist/FormElement/Suggestions/Suggestions.js +46 -71
  172. package/dist/FormElement/Suggestions/Suggestions.styles.js +9 -16
  173. package/dist/FormElement/WarningText/WarningText.js +41 -62
  174. package/dist/FormElement/WarningText/WarningText.styles.js +25 -28
  175. package/dist/FormElement/context.js +6 -10
  176. package/dist/FormElement/utils.js +54 -58
  177. package/dist/GlobalActions/GlobalActions.js +53 -59
  178. package/dist/GlobalActions/GlobalActions.styles.js +67 -76
  179. package/dist/Grid/Grid.js +82 -112
  180. package/dist/Grid/Grid.styles.js +37 -38
  181. package/dist/Header/Actions/Actions.js +15 -17
  182. package/dist/Header/Actions/Actions.styles.js +12 -15
  183. package/dist/Header/Brand/Brand.js +27 -23
  184. package/dist/Header/Brand/Brand.styles.js +16 -14
  185. package/dist/Header/Header.js +22 -31
  186. package/dist/Header/Header.styles.js +32 -30
  187. package/dist/Header/Navigation/MenuBar/Bar.js +23 -36
  188. package/dist/Header/Navigation/MenuBar/Bar.styles.js +54 -61
  189. package/dist/Header/Navigation/MenuBar/MenuBar.js +20 -26
  190. package/dist/Header/Navigation/MenuItem/MenuItem.js +104 -120
  191. package/dist/Header/Navigation/MenuItem/MenuItem.styles.js +48 -63
  192. package/dist/Header/Navigation/Navigation.js +32 -37
  193. package/dist/Header/Navigation/Navigation.styles.js +11 -17
  194. package/dist/Header/Navigation/useSelectionPath.js +17 -20
  195. package/dist/Header/Navigation/utils/FocusContext.js +23 -20
  196. package/dist/Header/Navigation/utils/SelectionContext.js +4 -4
  197. package/dist/IconButton/IconButton.js +25 -32
  198. package/dist/IconContainer/IconContainer.js +55 -76
  199. package/dist/InlineEditor/InlineEditor.js +105 -131
  200. package/dist/InlineEditor/InlineEditor.styles.js +44 -53
  201. package/dist/Input/Input.js +385 -461
  202. package/dist/Input/Input.styles.js +34 -47
  203. package/dist/Input/icons.js +16 -21
  204. package/dist/Input/utils.js +8 -11
  205. package/dist/List/List.js +196 -247
  206. package/dist/List/List.styles.js +44 -49
  207. package/dist/List/useSelectableList.js +11 -8
  208. package/dist/List/utils.js +24 -33
  209. package/dist/ListContainer/ListContainer.js +52 -65
  210. package/dist/ListContainer/ListContainer.styles.js +7 -10
  211. package/dist/ListContainer/ListContext/ListContext.js +4 -4
  212. package/dist/ListContainer/ListItem/ListItem.js +79 -117
  213. package/dist/ListContainer/ListItem/ListItem.styles.js +57 -78
  214. package/dist/Loading/Loading.js +31 -46
  215. package/dist/Loading/Loading.styles.js +41 -48
  216. package/dist/LoadingContainer/LoadingContainer.js +34 -40
  217. package/dist/LoadingContainer/LoadingContainer.styles.js +17 -18
  218. package/dist/Login/Login.js +22 -29
  219. package/dist/Login/Login.styles.js +20 -21
  220. package/dist/MultiButton/MultiButton.js +41 -59
  221. package/dist/MultiButton/MultiButton.styles.js +117 -137
  222. package/dist/NumberInput/NumberInput.js +51 -50
  223. package/dist/NumberInput/NumberInput.styles.js +5 -10
  224. package/dist/OverflowTooltip/OverflowTooltip.js +55 -75
  225. package/dist/OverflowTooltip/OverflowTooltip.styles.js +19 -23
  226. package/dist/Pagination/Pagination.js +176 -164
  227. package/dist/Pagination/Pagination.styles.js +86 -90
  228. package/dist/Pagination/Select.js +51 -60
  229. package/dist/Pagination/Select.styles.js +13 -19
  230. package/dist/Panel/Panel.js +19 -20
  231. package/dist/Panel/Panel.styles.js +12 -15
  232. package/dist/ProgressBar/ProgressBar.js +40 -53
  233. package/dist/ProgressBar/ProgressBar.styles.js +28 -40
  234. package/dist/QueryBuilder/ConfirmationDialog.js +35 -28
  235. package/dist/QueryBuilder/Context.js +308 -322
  236. package/dist/QueryBuilder/QueryBuilder.js +108 -137
  237. package/dist/QueryBuilder/QueryBuilder.styles.js +117 -108
  238. package/dist/QueryBuilder/Rule/Attribute.js +56 -63
  239. package/dist/QueryBuilder/Rule/Operator.js +53 -58
  240. package/dist/QueryBuilder/Rule/Rule.js +70 -88
  241. package/dist/QueryBuilder/Rule/Rule.styles.js +49 -56
  242. package/dist/QueryBuilder/RuleGroup.js +160 -206
  243. package/dist/QueryBuilder/Value/BooleanValue.js +38 -37
  244. package/dist/QueryBuilder/Value/DateTimeValue.js +233 -299
  245. package/dist/QueryBuilder/Value/EmptyValue.js +14 -14
  246. package/dist/QueryBuilder/Value/NumericValue.js +152 -204
  247. package/dist/QueryBuilder/Value/TextValue.js +38 -54
  248. package/dist/QueryBuilder/Value/Value.js +42 -67
  249. package/dist/QueryBuilder/types.js +4 -4
  250. package/dist/QueryBuilder/utils/index.js +40 -74
  251. package/dist/QueryBuilder/utils/reducer.js +86 -92
  252. package/dist/Radio/Radio.js +96 -145
  253. package/dist/Radio/Radio.styles.js +47 -55
  254. package/dist/RadioGroup/RadioGroup.js +98 -159
  255. package/dist/RadioGroup/RadioGroup.styles.js +28 -34
  256. package/dist/ScrollToHorizontal/HorizontalScrollListItem/HorizontalScrollListItem.js +34 -51
  257. package/dist/ScrollToHorizontal/HorizontalScrollListItem/HorizontalScrollListItem.styles.js +39 -48
  258. package/dist/ScrollToHorizontal/ScrollToHorizontal.js +56 -91
  259. package/dist/ScrollToHorizontal/ScrollToHorizontal.styles.js +28 -32
  260. package/dist/ScrollToVertical/ScrollToVertical.js +45 -77
  261. package/dist/ScrollToVertical/ScrollToVertical.styles.js +31 -38
  262. package/dist/ScrollToVertical/VerticalScrollListItem/VerticalScrollListItem.js +30 -39
  263. package/dist/ScrollToVertical/VerticalScrollListItem/VerticalScrollListItem.styles.js +44 -51
  264. package/dist/SearchInput/SearchInput.js +27 -25
  265. package/dist/SearchInput/SearchInput.styles.js +6 -7
  266. package/dist/Section/Section.js +69 -104
  267. package/dist/Section/Section.styles.js +53 -57
  268. package/dist/Select/Option.js +29 -46
  269. package/dist/Select/OptionGroup.js +18 -30
  270. package/dist/Select/Select.js +163 -219
  271. package/dist/Select/Select.styles.js +26 -32
  272. package/dist/SelectionList/SelectionList.js +162 -216
  273. package/dist/SelectionList/SelectionList.styles.js +36 -36
  274. package/dist/SimpleGrid/SimpleGrid.js +16 -27
  275. package/dist/SimpleGrid/SimpleGrid.styles.js +28 -39
  276. package/dist/Skeleton/Skeleton.js +26 -44
  277. package/dist/Skeleton/Skeleton.styles.js +43 -66
  278. package/dist/Slider/Slider.js +316 -431
  279. package/dist/Slider/Slider.styles.js +183 -216
  280. package/dist/Slider/SliderInput/SliderInput.js +38 -57
  281. package/dist/Slider/SliderInput/SliderInput.styles.js +13 -14
  282. package/dist/Slider/base.js +221 -243
  283. package/dist/Slider/utils.js +247 -233
  284. package/dist/Snackbar/Snackbar.js +59 -88
  285. package/dist/Snackbar/Snackbar.styles.js +25 -42
  286. package/dist/Snackbar/SnackbarContent/SnackbarContent.js +31 -50
  287. package/dist/Snackbar/SnackbarContent/SnackbarContent.styles.js +27 -30
  288. package/dist/SnackbarProvider/SnackbarProvider.js +73 -105
  289. package/dist/SnackbarProvider/SnackbarProvider.styles.js +20 -26
  290. package/dist/Stack/Stack.js +74 -84
  291. package/dist/Stack/Stack.styles.js +14 -33
  292. package/dist/StatusIcon/StatusIcon.js +78 -102
  293. package/dist/StatusIcon/StatusIcon.styles.js +42 -52
  294. package/dist/Switch/Switch.js +91 -138
  295. package/dist/Switch/Switch.styles.js +49 -60
  296. package/dist/Table/Table.js +62 -66
  297. package/dist/Table/Table.styles.js +23 -28
  298. package/dist/Table/TableBody/TableBody.js +45 -56
  299. package/dist/Table/TableBody/TableBody.styles.js +8 -7
  300. package/dist/Table/TableCell/TableCell.js +37 -66
  301. package/dist/Table/TableCell/TableCell.styles.js +125 -162
  302. package/dist/Table/TableContainer/TableContainer.js +18 -28
  303. package/dist/Table/TableContainer/TableContainer.styles.js +8 -12
  304. package/dist/Table/TableContext.js +4 -4
  305. package/dist/Table/TableHead/TableHead.js +27 -39
  306. package/dist/Table/TableHead/TableHead.styles.js +10 -7
  307. package/dist/Table/TableHeader/TableHeader.js +73 -124
  308. package/dist/Table/TableHeader/TableHeader.styles.js +135 -150
  309. package/dist/Table/TableHeader/utils.js +11 -15
  310. package/dist/Table/TableRow/TableRow.js +32 -51
  311. package/dist/Table/TableRow/TableRow.styles.js +64 -84
  312. package/dist/Table/TableSection/TableSection.js +21 -20
  313. package/dist/Table/TableSection/TableSection.styles.js +63 -96
  314. package/dist/Table/TableSectionContext.js +4 -4
  315. package/dist/Table/hooks/useHvBulkActions.js +54 -89
  316. package/dist/Table/hooks/useHvFilters.js +4 -4
  317. package/dist/Table/hooks/useHvGlobalFilter.js +4 -4
  318. package/dist/Table/hooks/useHvHeaderGroups.js +73 -82
  319. package/dist/Table/hooks/useHvPagination.js +31 -51
  320. package/dist/Table/hooks/useHvResizeColumns.js +25 -31
  321. package/dist/Table/hooks/useHvRowExpand.js +54 -69
  322. package/dist/Table/hooks/useHvRowSelection.js +294 -420
  323. package/dist/Table/hooks/useHvRowState.js +4 -4
  324. package/dist/Table/hooks/useHvSortBy.js +23 -30
  325. package/dist/Table/hooks/useHvSticky.js +114 -154
  326. package/dist/Table/hooks/useHvTable.js +40 -64
  327. package/dist/Table/hooks/useHvTableStyles.js +51 -82
  328. package/dist/Table/renderers/DateColumnCell.js +12 -13
  329. package/dist/Table/renderers/DefaultCell.js +13 -20
  330. package/dist/Table/renderers/DropdownColumnCell.js +4 -4
  331. package/dist/Table/renderers/ProgressColumnCell.js +43 -47
  332. package/dist/Table/renderers/SwitchColumnCell.js +37 -50
  333. package/dist/Table/renderers/renderers.js +146 -183
  334. package/dist/Tabs/Tab/Tab.js +21 -31
  335. package/dist/Tabs/Tab/Tab.styles.js +44 -54
  336. package/dist/Tabs/Tabs.js +23 -28
  337. package/dist/Tabs/Tabs.styles.js +9 -14
  338. package/dist/Tag/Tag.js +86 -129
  339. package/dist/Tag/Tag.styles.js +63 -88
  340. package/dist/TagsInput/TagsInput.js +349 -417
  341. package/dist/TagsInput/TagsInput.styles.js +77 -90
  342. package/dist/TextArea/TextArea.js +207 -274
  343. package/dist/TextArea/TextArea.styles.js +25 -20
  344. package/dist/TimeAgo/TimeAgo.js +24 -30
  345. package/dist/TimeAgo/TimeAgo.styles.js +4 -7
  346. package/dist/TimeAgo/formatUtils.js +54 -65
  347. package/dist/TimeAgo/useTimeAgo.js +18 -18
  348. package/dist/TimeAgo/useTimeout.js +14 -14
  349. package/dist/TimePicker/Placeholder.js +46 -52
  350. package/dist/TimePicker/TimePicker.js +164 -214
  351. package/dist/TimePicker/TimePicker.styles.js +30 -39
  352. package/dist/TimePicker/Unit/Unit.js +63 -49
  353. package/dist/TimePicker/Unit/Unit.styles.js +41 -46
  354. package/dist/ToggleButton/ToggleButton.js +25 -34
  355. package/dist/Tooltip/Tooltip.js +41 -51
  356. package/dist/Tooltip/Tooltip.styles.js +25 -26
  357. package/dist/TreeView/TreeItem/DefaultContent.js +51 -72
  358. package/dist/TreeView/TreeItem/TreeItem.js +102 -140
  359. package/dist/TreeView/TreeItem/TreeItem.styles.js +56 -70
  360. package/dist/TreeView/TreeItem/useHvTreeItem.js +38 -53
  361. package/dist/TreeView/TreeView.js +65 -62
  362. package/dist/TreeView/TreeView.styles.js +11 -13
  363. package/dist/TreeView/internals/DescendantProvider.js +120 -120
  364. package/dist/TreeView/internals/TreeViewProvider.js +32 -26
  365. package/dist/TreeView/internals/corePlugins.js +8 -4
  366. package/dist/TreeView/internals/hooks/plugins/defaultPlugins.js +10 -10
  367. package/dist/TreeView/internals/hooks/plugins/useTreeViewContextValueBuilder.js +20 -22
  368. package/dist/TreeView/internals/hooks/plugins/useTreeViewExpansion.js +39 -61
  369. package/dist/TreeView/internals/hooks/plugins/useTreeViewFocus.js +56 -80
  370. package/dist/TreeView/internals/hooks/plugins/useTreeViewKeyboardNavigation.js +149 -211
  371. package/dist/TreeView/internals/hooks/plugins/useTreeViewNodes.js +42 -68
  372. package/dist/TreeView/internals/hooks/plugins/useTreeViewSelection.js +162 -195
  373. package/dist/TreeView/internals/hooks/useInstanceEventHandler.js +52 -74
  374. package/dist/TreeView/internals/hooks/useTreeView.js +54 -69
  375. package/dist/TreeView/internals/hooks/useTreeViewInstanceEvents.js +28 -33
  376. package/dist/TreeView/internals/hooks/useTreeViewModels.js +34 -43
  377. package/dist/TreeView/internals/hooks/utils.js +28 -42
  378. package/dist/TreeView/internals/utils/EventManager.js +49 -58
  379. package/dist/TreeView/internals/utils/FinalizationRegistryBasedCleanupTracking.js +14 -18
  380. package/dist/TreeView/internals/utils/TimerBasedCleanupTracking.js +33 -37
  381. package/dist/TreeView/internals/utils/publishTreeViewEvent.js +5 -5
  382. package/dist/Typography/Typography.js +34 -51
  383. package/dist/Typography/Typography.styles.js +20 -23
  384. package/dist/VerticalNavigation/Actions/Action.js +23 -42
  385. package/dist/VerticalNavigation/Actions/Action.styles.js +21 -28
  386. package/dist/VerticalNavigation/Actions/Actions.js +15 -31
  387. package/dist/VerticalNavigation/Actions/Actions.styles.js +13 -19
  388. package/dist/VerticalNavigation/Header/Header.js +51 -91
  389. package/dist/VerticalNavigation/Header/Header.styles.js +22 -32
  390. package/dist/VerticalNavigation/Navigation/Navigation.js +183 -267
  391. package/dist/VerticalNavigation/Navigation/Navigation.styles.js +14 -24
  392. package/dist/VerticalNavigation/NavigationPopup/NavigationPopup.styles.js +9 -17
  393. package/dist/VerticalNavigation/NavigationPopup/NavigationPopupContainer.js +30 -32
  394. package/dist/VerticalNavigation/NavigationSlider/NavigationSlider.js +45 -63
  395. package/dist/VerticalNavigation/NavigationSlider/NavigationSlider.styles.js +23 -33
  396. package/dist/VerticalNavigation/NavigationSlider/utils.js +56 -39
  397. package/dist/VerticalNavigation/TreeView/TreeView.js +515 -664
  398. package/dist/VerticalNavigation/TreeView/TreeView.styles.js +10 -16
  399. package/dist/VerticalNavigation/TreeView/TreeViewContext.js +5 -6
  400. package/dist/VerticalNavigation/TreeView/TreeViewItem.js +319 -414
  401. package/dist/VerticalNavigation/TreeView/TreeViewItem.styles.js +91 -143
  402. package/dist/VerticalNavigation/VerticalNavigation.js +70 -97
  403. package/dist/VerticalNavigation/VerticalNavigation.styles.js +31 -45
  404. package/dist/VerticalNavigation/VerticalNavigationContext.js +8 -10
  405. package/dist/hooks/useClickOutside.js +21 -23
  406. package/dist/hooks/useComputation.js +13 -13
  407. package/dist/hooks/useControlled.js +10 -17
  408. package/dist/hooks/useEnhancedEffect.js +5 -5
  409. package/dist/hooks/useExpandable.js +24 -31
  410. package/dist/hooks/useFocus.js +31 -34
  411. package/dist/hooks/useForkRef.js +19 -19
  412. package/dist/hooks/useImageLoaded.js +26 -26
  413. package/dist/hooks/useIsMounted.js +13 -13
  414. package/dist/hooks/useLabels.js +7 -7
  415. package/dist/hooks/useScrollTo.js +101 -130
  416. package/dist/hooks/useUniqueId.js +6 -6
  417. package/dist/hooks/useWidth.js +10 -13
  418. package/dist/icons.js +77 -88
  419. package/dist/index.d.ts +9 -10
  420. package/dist/index.js +226 -554
  421. package/dist/providers/Provider.js +44 -75
  422. package/dist/providers/ThemeProvider.js +79 -71
  423. package/dist/providers/utils.js +40 -47
  424. package/dist/themes/index.js +6 -5
  425. package/dist/themes/next.js +132 -271
  426. package/dist/themes/pentaho.js +832 -1173
  427. package/dist/types/generic.js +5 -4
  428. package/dist/utils/Callout.js +123 -171
  429. package/dist/utils/CounterLabel.js +14 -15
  430. package/dist/utils/deepMerge.js +13 -15
  431. package/dist/utils/document.js +8 -8
  432. package/dist/utils/focusUtils.js +6 -7
  433. package/dist/utils/focusableElementFinder.js +23 -26
  434. package/dist/utils/helpers.js +15 -23
  435. package/dist/utils/iconVariant.js +15 -12
  436. package/dist/utils/keyboardUtils.js +28 -28
  437. package/dist/utils/multiSelectionEventHandler.js +37 -52
  438. package/dist/utils/scroll.js +50 -76
  439. package/dist/utils/setId.js +4 -4
  440. package/dist/utils/theme.js +11 -8
  441. package/dist/utils/useSavedState.js +19 -16
  442. package/package.json +25 -12
@@ -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 };