@vuu-ui/vuu-ui-controls 0.13.2 → 0.13.4

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 (301) hide show
  1. package/cjs/column-picker/ColumnPicker.js +2 -2
  2. package/cjs/column-picker/ColumnPicker.js.map +1 -1
  3. package/cjs/column-picker/ColumnSearch.js +4 -24
  4. package/cjs/column-picker/ColumnSearch.js.map +1 -1
  5. package/cjs/context-panel-provider/ContextPanelProvider.js +55 -0
  6. package/cjs/context-panel-provider/ContextPanelProvider.js.map +1 -0
  7. package/cjs/index.js +6 -80
  8. package/cjs/index.js.map +1 -1
  9. package/cjs/sortable-list/SortableList.js +38 -0
  10. package/cjs/sortable-list/SortableList.js.map +1 -0
  11. package/cjs/toolbar/Toolbar.js.map +1 -1
  12. package/cjs/toolbar/useSelection.js +0 -1
  13. package/cjs/toolbar/useSelection.js.map +1 -1
  14. package/esm/column-picker/ColumnPicker.js +2 -2
  15. package/esm/column-picker/ColumnPicker.js.map +1 -1
  16. package/esm/column-picker/ColumnSearch.js +5 -25
  17. package/esm/column-picker/ColumnSearch.js.map +1 -1
  18. package/esm/context-panel-provider/ContextPanelProvider.js +51 -0
  19. package/esm/context-panel-provider/ContextPanelProvider.js.map +1 -0
  20. package/esm/index.js +2 -21
  21. package/esm/index.js.map +1 -1
  22. package/esm/sortable-list/SortableList.js +35 -0
  23. package/esm/sortable-list/SortableList.js.map +1 -0
  24. package/esm/toolbar/Toolbar.js.map +1 -1
  25. package/esm/toolbar/useSelection.js +0 -1
  26. package/esm/toolbar/useSelection.js.map +1 -1
  27. package/package.json +15 -17
  28. package/cjs/common-hooks/collectionProvider.js +0 -24
  29. package/cjs/common-hooks/collectionProvider.js.map +0 -1
  30. package/cjs/common-hooks/isPlainObject.js +0 -6
  31. package/cjs/common-hooks/isPlainObject.js.map +0 -1
  32. package/cjs/common-hooks/itemToString.js +0 -24
  33. package/cjs/common-hooks/itemToString.js.map +0 -1
  34. package/cjs/common-hooks/useCollectionItems.js +0 -309
  35. package/cjs/common-hooks/useCollectionItems.js.map +0 -1
  36. package/cjs/common-hooks/useSelection.js +0 -212
  37. package/cjs/common-hooks/useSelection.js.map +0 -1
  38. package/cjs/list/Highlighter.css.js +0 -6
  39. package/cjs/list/Highlighter.css.js.map +0 -1
  40. package/cjs/list/Highlighter.js +0 -36
  41. package/cjs/list/Highlighter.js.map +0 -1
  42. package/cjs/list/List.css.js +0 -6
  43. package/cjs/list/List.css.js.map +0 -1
  44. package/cjs/list/List.js +0 -317
  45. package/cjs/list/List.js.map +0 -1
  46. package/cjs/list/ListItem.css.js +0 -6
  47. package/cjs/list/ListItem.css.js.map +0 -1
  48. package/cjs/list/ListItem.js +0 -84
  49. package/cjs/list/ListItem.js.map +0 -1
  50. package/cjs/list/ListItemGroup.js +0 -6
  51. package/cjs/list/ListItemGroup.js.map +0 -1
  52. package/cjs/list/ListItemHeader.js +0 -6
  53. package/cjs/list/ListItemHeader.js.map +0 -1
  54. package/cjs/list/RadioIcon.css.js +0 -6
  55. package/cjs/list/RadioIcon.css.js.map +0 -1
  56. package/cjs/list/RadioIcon.js +0 -27
  57. package/cjs/list/RadioIcon.js.map +0 -1
  58. package/cjs/list/common-hooks/keyUtils.js +0 -78
  59. package/cjs/list/common-hooks/keyUtils.js.map +0 -1
  60. package/cjs/list/common-hooks/list-dom-utils.js +0 -25
  61. package/cjs/list/common-hooks/list-dom-utils.js.map +0 -1
  62. package/cjs/list/common-hooks/useCollapsibleGroups.js +0 -72
  63. package/cjs/list/common-hooks/useCollapsibleGroups.js.map +0 -1
  64. package/cjs/list/common-hooks/useImperativeScrollingAPI.js +0 -52
  65. package/cjs/list/common-hooks/useImperativeScrollingAPI.js.map +0 -1
  66. package/cjs/list/common-hooks/useKeyboardNavigation.js +0 -289
  67. package/cjs/list/common-hooks/useKeyboardNavigation.js.map +0 -1
  68. package/cjs/list/common-hooks/useTypeahead.js +0 -74
  69. package/cjs/list/common-hooks/useTypeahead.js.map +0 -1
  70. package/cjs/list/common-hooks/useViewportTracking.js +0 -133
  71. package/cjs/list/common-hooks/useViewportTracking.js.map +0 -1
  72. package/cjs/list/common-hooks/utils/collection-item-utils.js +0 -182
  73. package/cjs/list/common-hooks/utils/collection-item-utils.js.map +0 -1
  74. package/cjs/list/common-hooks/utils/filter-utils.js +0 -11
  75. package/cjs/list/common-hooks/utils/filter-utils.js.map +0 -1
  76. package/cjs/list/common-hooks/utils/isSelected.js +0 -9
  77. package/cjs/list/common-hooks/utils/isSelected.js.map +0 -1
  78. package/cjs/list/useList.js +0 -278
  79. package/cjs/list/useList.js.map +0 -1
  80. package/cjs/list/useListDrop.js +0 -92
  81. package/cjs/list/useListDrop.js.map +0 -1
  82. package/cjs/list/useListHeight.js +0 -77
  83. package/cjs/list/useListHeight.js.map +0 -1
  84. package/cjs/list/useScrollPosition.js +0 -74
  85. package/cjs/list/useScrollPosition.js.map +0 -1
  86. package/esm/common-hooks/collectionProvider.js +0 -20
  87. package/esm/common-hooks/collectionProvider.js.map +0 -1
  88. package/esm/common-hooks/isPlainObject.js +0 -4
  89. package/esm/common-hooks/isPlainObject.js.map +0 -1
  90. package/esm/common-hooks/itemToString.js +0 -22
  91. package/esm/common-hooks/itemToString.js.map +0 -1
  92. package/esm/common-hooks/useCollectionItems.js +0 -307
  93. package/esm/common-hooks/useCollectionItems.js.map +0 -1
  94. package/esm/common-hooks/useSelection.js +0 -205
  95. package/esm/common-hooks/useSelection.js.map +0 -1
  96. package/esm/list/Highlighter.css.js +0 -4
  97. package/esm/list/Highlighter.css.js.map +0 -1
  98. package/esm/list/Highlighter.js +0 -34
  99. package/esm/list/Highlighter.js.map +0 -1
  100. package/esm/list/List.css.js +0 -4
  101. package/esm/list/List.css.js.map +0 -1
  102. package/esm/list/List.js +0 -315
  103. package/esm/list/List.js.map +0 -1
  104. package/esm/list/ListItem.css.js +0 -4
  105. package/esm/list/ListItem.css.js.map +0 -1
  106. package/esm/list/ListItem.js +0 -81
  107. package/esm/list/ListItem.js.map +0 -1
  108. package/esm/list/ListItemGroup.js +0 -4
  109. package/esm/list/ListItemGroup.js.map +0 -1
  110. package/esm/list/ListItemHeader.js +0 -4
  111. package/esm/list/ListItemHeader.js.map +0 -1
  112. package/esm/list/RadioIcon.css.js +0 -4
  113. package/esm/list/RadioIcon.css.js.map +0 -1
  114. package/esm/list/RadioIcon.js +0 -25
  115. package/esm/list/RadioIcon.js.map +0 -1
  116. package/esm/list/common-hooks/keyUtils.js +0 -64
  117. package/esm/list/common-hooks/keyUtils.js.map +0 -1
  118. package/esm/list/common-hooks/list-dom-utils.js +0 -19
  119. package/esm/list/common-hooks/list-dom-utils.js.map +0 -1
  120. package/esm/list/common-hooks/useCollapsibleGroups.js +0 -70
  121. package/esm/list/common-hooks/useCollapsibleGroups.js.map +0 -1
  122. package/esm/list/common-hooks/useImperativeScrollingAPI.js +0 -50
  123. package/esm/list/common-hooks/useImperativeScrollingAPI.js.map +0 -1
  124. package/esm/list/common-hooks/useKeyboardNavigation.js +0 -286
  125. package/esm/list/common-hooks/useKeyboardNavigation.js.map +0 -1
  126. package/esm/list/common-hooks/useTypeahead.js +0 -72
  127. package/esm/list/common-hooks/useTypeahead.js.map +0 -1
  128. package/esm/list/common-hooks/useViewportTracking.js +0 -131
  129. package/esm/list/common-hooks/useViewportTracking.js.map +0 -1
  130. package/esm/list/common-hooks/utils/collection-item-utils.js +0 -168
  131. package/esm/list/common-hooks/utils/collection-item-utils.js.map +0 -1
  132. package/esm/list/common-hooks/utils/filter-utils.js +0 -8
  133. package/esm/list/common-hooks/utils/filter-utils.js.map +0 -1
  134. package/esm/list/common-hooks/utils/isSelected.js +0 -7
  135. package/esm/list/common-hooks/utils/isSelected.js.map +0 -1
  136. package/esm/list/useList.js +0 -276
  137. package/esm/list/useList.js.map +0 -1
  138. package/esm/list/useListDrop.js +0 -90
  139. package/esm/list/useListDrop.js.map +0 -1
  140. package/esm/list/useListHeight.js +0 -75
  141. package/esm/list/useListHeight.js.map +0 -1
  142. package/esm/list/useScrollPosition.js +0 -72
  143. package/esm/list/useScrollPosition.js.map +0 -1
  144. package/types/calendar/Calendar.d.ts +0 -13
  145. package/types/calendar/index.d.ts +0 -4
  146. package/types/calendar/internal/CalendarCarousel.d.ts +0 -3
  147. package/types/calendar/internal/CalendarContext.d.ts +0 -8
  148. package/types/calendar/internal/CalendarDay.d.ts +0 -14
  149. package/types/calendar/internal/CalendarMonth.d.ts +0 -10
  150. package/types/calendar/internal/CalendarNavigation.d.ts +0 -16
  151. package/types/calendar/internal/CalendarWeekHeader.d.ts +0 -3
  152. package/types/calendar/internal/useFocusManagement.d.ts +0 -9
  153. package/types/calendar/internal/utils.d.ts +0 -15
  154. package/types/calendar/useCalendar.d.ts +0 -54
  155. package/types/calendar/useCalendarDay.d.ts +0 -22
  156. package/types/calendar/useSelection.d.ts +0 -78
  157. package/types/column-picker/ColumnPicker.d.ts +0 -7
  158. package/types/column-picker/ColumnSearch.d.ts +0 -6
  159. package/types/column-picker/index.d.ts +0 -2
  160. package/types/column-picker/moving-window.d.ts +0 -14
  161. package/types/common-hooks/collectionProvider.d.ts +0 -13
  162. package/types/common-hooks/collectionTypes.d.ts +0 -58
  163. package/types/common-hooks/index.d.ts +0 -8
  164. package/types/common-hooks/isPlainObject.d.ts +0 -1
  165. package/types/common-hooks/itemToString.d.ts +0 -2
  166. package/types/common-hooks/navigationTypes.d.ts +0 -36
  167. package/types/common-hooks/selectionTypes.d.ts +0 -70
  168. package/types/common-hooks/use-resize-observer.d.ts +0 -16
  169. package/types/common-hooks/useCollectionItems.d.ts +0 -2
  170. package/types/common-hooks/useControlled.d.ts +0 -24
  171. package/types/common-hooks/useSelection.d.ts +0 -8
  172. package/types/cycle-state-button/CycleStateButton.d.ts +0 -11
  173. package/types/cycle-state-button/index.d.ts +0 -1
  174. package/types/date-input/DateInput.d.ts +0 -60
  175. package/types/date-input/index.d.ts +0 -1
  176. package/types/date-picker/DatePicker.d.ts +0 -66
  177. package/types/date-picker/DatePickerContext.d.ts +0 -19
  178. package/types/date-picker/DatePickerPanel.d.ts +0 -10
  179. package/types/date-picker/index.d.ts +0 -1
  180. package/types/drag-drop/DragDropProvider.d.ts +0 -38
  181. package/types/drag-drop/DragDropState.d.ts +0 -15
  182. package/types/drag-drop/Draggable.d.ts +0 -13
  183. package/types/drag-drop/DropIndicator.d.ts +0 -5
  184. package/types/drag-drop/dragDropTypes.d.ts +0 -100
  185. package/types/drag-drop/drop-target-utils.d.ts +0 -82
  186. package/types/drag-drop/index.d.ts +0 -6
  187. package/types/drag-drop/useAutoScroll.d.ts +0 -11
  188. package/types/drag-drop/useDragDisplacers.d.ts +0 -17
  189. package/types/drag-drop/useDragDrop.d.ts +0 -2
  190. package/types/drag-drop/useDragDropCopy.d.ts +0 -6
  191. package/types/drag-drop/useDragDropIndicator.d.ts +0 -2
  192. package/types/drag-drop/useDragDropNaturalMovement.d.ts +0 -2
  193. package/types/drag-drop/useDropIndicator.d.ts +0 -8
  194. package/types/drag-drop/useGlobalDragDrop.d.ts +0 -11
  195. package/types/drag-drop/useTransition.d.ts +0 -3
  196. package/types/editable/index.d.ts +0 -1
  197. package/types/editable/useEditableText.d.ts +0 -19
  198. package/types/editable-label/EditableLabel.d.ts +0 -19
  199. package/types/editable-label/index.d.ts +0 -1
  200. package/types/expando-input/ExpandoInput.d.ts +0 -6
  201. package/types/expando-input/index.d.ts +0 -1
  202. package/types/icon-button/Icon.d.ts +0 -6
  203. package/types/icon-button/IconButton.d.ts +0 -6
  204. package/types/icon-button/ToggleIconButton.d.ts +0 -5
  205. package/types/icon-button/index.d.ts +0 -3
  206. package/types/index.d.ts +0 -27
  207. package/types/instrument-picker/SearchCell.d.ts +0 -2
  208. package/types/instrument-picker/TablePicker.d.ts +0 -10
  209. package/types/instrument-picker/index.d.ts +0 -1
  210. package/types/instrument-picker/moving-window.d.ts +0 -14
  211. package/types/instrument-picker/useDataSource.d.ts +0 -6
  212. package/types/instrument-picker/useTablePicker.d.ts +0 -47
  213. package/types/list/ChevronIcon.d.ts +0 -7
  214. package/types/list/Highlighter.d.ts +0 -6
  215. package/types/list/List.d.ts +0 -6
  216. package/types/list/ListItem.d.ts +0 -6
  217. package/types/list/ListItemGroup.d.ts +0 -6
  218. package/types/list/ListItemHeader.d.ts +0 -5
  219. package/types/list/RadioIcon.d.ts +0 -4
  220. package/types/list/common-hooks/index.d.ts +0 -10
  221. package/types/list/common-hooks/keyUtils.d.ts +0 -14
  222. package/types/list/common-hooks/list-dom-utils.d.ts +0 -5
  223. package/types/list/common-hooks/useCollapsibleGroups.d.ts +0 -14
  224. package/types/list/common-hooks/useImperativeScrollingAPI.d.ts +0 -14
  225. package/types/list/common-hooks/useKeyboardNavigation.d.ts +0 -3
  226. package/types/list/common-hooks/useTypeahead.d.ts +0 -14
  227. package/types/list/common-hooks/useViewportTracking.d.ts +0 -14
  228. package/types/list/common-hooks/utils/collection-item-utils.d.ts +0 -21
  229. package/types/list/common-hooks/utils/filter-utils.d.ts +0 -4
  230. package/types/list/common-hooks/utils/index.d.ts +0 -4
  231. package/types/list/common-hooks/utils/isSelected.d.ts +0 -2
  232. package/types/list/index.d.ts +0 -9
  233. package/types/list/keyset.d.ts +0 -9
  234. package/types/list/listTypes.d.ts +0 -200
  235. package/types/list/useList.d.ts +0 -3
  236. package/types/list/useListDrop.d.ts +0 -15
  237. package/types/list/useListHeight.d.ts +0 -19
  238. package/types/list/useScrollPosition.d.ts +0 -19
  239. package/types/measured-container/MeasuredContainer.d.ts +0 -14
  240. package/types/measured-container/index.d.ts +0 -2
  241. package/types/measured-container/useMeasuredContainer.d.ts +0 -23
  242. package/types/measured-container/useResizeObserver.d.ts +0 -15
  243. package/types/overflow-container/OverflowContainer.d.ts +0 -15
  244. package/types/overflow-container/index.d.ts +0 -2
  245. package/types/overflow-container/overflow-utils.d.ts +0 -48
  246. package/types/overflow-container/useOverflowContainer.d.ts +0 -19
  247. package/types/price-ticker/PriceTicker.d.ts +0 -7
  248. package/types/price-ticker/index.d.ts +0 -1
  249. package/types/split-button/SplitButton.d.ts +0 -11
  250. package/types/split-button/SplitStateButton.d.ts +0 -5
  251. package/types/split-button/index.d.ts +0 -2
  252. package/types/split-button/useSplitButton.d.ts +0 -311
  253. package/types/table-search/SearchCell.d.ts +0 -2
  254. package/types/table-search/TableSearch.d.ts +0 -9
  255. package/types/table-search/index.d.ts +0 -1
  256. package/types/table-search/moving-window.d.ts +0 -14
  257. package/types/table-search/useTableSearch.d.ts +0 -15
  258. package/types/tabs-next/TabBar.d.ts +0 -12
  259. package/types/tabs-next/TabListNext.d.ts +0 -12
  260. package/types/tabs-next/TabNext.d.ts +0 -12
  261. package/types/tabs-next/TabNextAction.d.ts +0 -5
  262. package/types/tabs-next/TabNextContext.d.ts +0 -12
  263. package/types/tabs-next/TabNextPanel.d.ts +0 -8
  264. package/types/tabs-next/TabNextTrigger.d.ts +0 -5
  265. package/types/tabs-next/TabOverflowList.d.ts +0 -11
  266. package/types/tabs-next/TabsNext.d.ts +0 -17
  267. package/types/tabs-next/TabsNextContext.d.ts +0 -21
  268. package/types/tabs-next/hooks/useCollection.d.ts +0 -18
  269. package/types/tabs-next/hooks/useFocusOutside.d.ts +0 -2
  270. package/types/tabs-next/hooks/useOverflow.d.ts +0 -11
  271. package/types/tabs-next/index.d.ts +0 -7
  272. package/types/tabstrip/Tab.d.ts +0 -27
  273. package/types/tabstrip/TabMenu.d.ts +0 -23
  274. package/types/tabstrip/TabMenuOptions.d.ts +0 -10
  275. package/types/tabstrip/TabsTypes.d.ts +0 -127
  276. package/types/tabstrip/Tabstrip.d.ts +0 -2
  277. package/types/tabstrip/index.d.ts +0 -5
  278. package/types/tabstrip/tabstrip-dom-utils.d.ts +0 -2
  279. package/types/tabstrip/useAnimatedSelectionThumb.d.ts +0 -7
  280. package/types/tabstrip/useKeyboardNavigation.d.ts +0 -29
  281. package/types/tabstrip/useSelection.d.ts +0 -13
  282. package/types/tabstrip/useTabstrip.d.ts +0 -55
  283. package/types/toolbar/Toolbar.d.ts +0 -19
  284. package/types/toolbar/index.d.ts +0 -1
  285. package/types/toolbar/toolbar-dom-utils.d.ts +0 -3
  286. package/types/toolbar/useKeyboardNavigation.d.ts +0 -32
  287. package/types/toolbar/useSelection.d.ts +0 -22
  288. package/types/toolbar/useToolbar.d.ts +0 -28
  289. package/types/utils/deprecated-types.d.ts +0 -2
  290. package/types/utils/escapeRegExp.d.ts +0 -1
  291. package/types/utils/forwardCallbackProps.d.ts +0 -3
  292. package/types/utils/index.d.ts +0 -5
  293. package/types/utils/isOverflowElement.d.ts +0 -1
  294. package/types/utils/isPlainObject.d.ts +0 -1
  295. package/types/vuu-date-picker/VuuDatePicker.d.ts +0 -7
  296. package/types/vuu-date-picker/index.d.ts +0 -1
  297. package/types/vuu-input/VuuInput.d.ts +0 -17
  298. package/types/vuu-input/index.d.ts +0 -1
  299. package/types/vuu-typeahead-input/VuuTypeaheadInput.d.ts +0 -29
  300. package/types/vuu-typeahead-input/index.d.ts +0 -1
  301. package/types/vuu-typeahead-input/useVuuTypeaheadInput.d.ts +0 -15
@@ -1,131 +0,0 @@
1
- import { useRef, useCallback } from 'react';
2
- import '../../common-hooks/collectionProvider.js';
3
- import { useResizeObserver } from '../../common-hooks/use-resize-observer.js';
4
- import { useIsomorphicLayoutEffect } from '@salt-ds/core';
5
-
6
- const HeightOnly = ["height"];
7
- const HeightWithScroll = ["height", "scrollHeight"];
8
- const EMPTY_ARRAY = [];
9
- const ObservedDimensions = {
10
- containerOnly: [HeightWithScroll, EMPTY_ARRAY],
11
- withContent: [HeightOnly, HeightOnly]
12
- };
13
- const getObservedDimensions = (containerOnly) => containerOnly ? ObservedDimensions.containerOnly : ObservedDimensions.withContent;
14
- const NULL_REF = { current: null };
15
- const getItemTop = (element, offsetContainer) => {
16
- const { transform = "none" } = getComputedStyle(element);
17
- if (transform.startsWith("matrix")) {
18
- const pos = transform.lastIndexOf(",");
19
- return parseInt(transform.slice(pos + 1));
20
- } else {
21
- let offsetParent = element.offsetParent;
22
- if (offsetParent === offsetContainer || offsetContainer === null) {
23
- return element.offsetTop;
24
- } else {
25
- let top = element.offsetTop;
26
- while (offsetParent !== null && offsetParent !== offsetContainer) {
27
- top += offsetParent.offsetTop;
28
- offsetParent = offsetParent.offsetParent;
29
- }
30
- return top;
31
- }
32
- }
33
- };
34
- const useViewportTracking = ({
35
- containerRef,
36
- contentRef = NULL_REF,
37
- highlightedIdx = -1,
38
- indexPositions,
39
- stickyHeaders = false
40
- }) => {
41
- const scrolling = useRef(false);
42
- const viewport = useRef({
43
- height: 0,
44
- contentHeight: 0
45
- });
46
- const scrollTo = useCallback((scrollPos) => {
47
- scrolling.current = true;
48
- if (containerRef.current) {
49
- containerRef.current.scrollTop = scrollPos;
50
- }
51
- setTimeout(() => {
52
- scrolling.current = false;
53
- });
54
- }, []);
55
- const scrollToStart = useCallback(() => scrollTo(0), [scrollTo]);
56
- const scrollToEnd = useCallback(() => {
57
- scrollTo(viewport.current.contentHeight - viewport.current.height);
58
- }, [scrollTo]);
59
- const scrollIntoViewIfNeeded = useCallback(
60
- (item) => {
61
- const offsetContainer = contentRef.current || containerRef.current;
62
- if (item.id) {
63
- const el = document.getElementById(item.id);
64
- if (el && containerRef.current) {
65
- const { height: viewportHeight } = viewport.current;
66
- const targetEl = el.ariaExpanded && el.firstChild ? el.firstChild : el;
67
- const headerHeight = stickyHeaders ? 36 : 0;
68
- const itemTop = getItemTop(targetEl, offsetContainer);
69
- const itemHeight = targetEl.offsetHeight;
70
- const { scrollTop } = containerRef.current;
71
- const viewportStart = scrollTop + headerHeight;
72
- const viewportEnd = viewportStart + viewportHeight - headerHeight;
73
- if (itemTop + itemHeight > viewportEnd || itemTop < viewportStart) {
74
- const newScrollTop = itemTop + itemHeight > viewportEnd ? scrollTop + (itemTop + itemHeight) - viewportEnd : itemTop - headerHeight;
75
- scrollTo(newScrollTop);
76
- }
77
- }
78
- }
79
- },
80
- [containerRef, contentRef, scrollTo, stickyHeaders]
81
- );
82
- useIsomorphicLayoutEffect(() => {
83
- const { height, contentHeight } = viewport.current;
84
- const item = indexPositions[highlightedIdx];
85
- if (contentHeight > height && item) {
86
- const [firstItem] = indexPositions;
87
- const [lastItem] = indexPositions.slice(-1);
88
- if (item === firstItem) {
89
- scrollToStart();
90
- } else if (item === lastItem) {
91
- scrollToEnd();
92
- } else {
93
- scrollIntoViewIfNeeded(indexPositions[highlightedIdx]);
94
- }
95
- }
96
- }, [
97
- highlightedIdx,
98
- indexPositions,
99
- scrollIntoViewIfNeeded,
100
- scrollToEnd,
101
- scrollToStart
102
- ]);
103
- const onContainerResize = useCallback(
104
- ({ height, scrollHeight }) => {
105
- if (typeof height === "number") {
106
- viewport.current.height = height;
107
- }
108
- if (typeof scrollHeight === "number") {
109
- viewport.current.contentHeight = scrollHeight;
110
- }
111
- },
112
- []
113
- );
114
- const onContentResize = useCallback(({ height }) => {
115
- if (typeof height === "number") {
116
- viewport.current.contentHeight = height;
117
- }
118
- }, []);
119
- const [containerDimensions, contentDimensions] = getObservedDimensions(
120
- contentRef === NULL_REF
121
- );
122
- useResizeObserver(containerRef, containerDimensions, onContainerResize, true);
123
- useResizeObserver(contentRef, contentDimensions, onContentResize, true);
124
- return {
125
- isScrolling: scrolling,
126
- scrollIntoView: scrollIntoViewIfNeeded
127
- };
128
- };
129
-
130
- export { useViewportTracking };
131
- //# sourceMappingURL=useViewportTracking.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useViewportTracking.js","sources":["../../../src/list/common-hooks/useViewportTracking.ts"],"sourcesContent":["import { MutableRefObject, RefObject, useCallback, useRef } from \"react\";\nimport { CollectionItem } from \"../../common-hooks/collectionTypes\";\nimport { ResizeHandler, useResizeObserver } from \"../../common-hooks\";\nimport { useIsomorphicLayoutEffect } from \"@salt-ds/core\";\n\nconst HeightOnly = [\"height\"];\nconst HeightWithScroll = [\"height\", \"scrollHeight\"];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst EMPTY_ARRAY: any[] = [];\n\nconst ObservedDimensions = {\n containerOnly: [HeightWithScroll, EMPTY_ARRAY],\n withContent: [HeightOnly, HeightOnly],\n};\nconst getObservedDimensions = (containerOnly: boolean) =>\n containerOnly\n ? ObservedDimensions.containerOnly\n : ObservedDimensions.withContent;\n\nconst NULL_REF = { current: null };\n\nconst getItemTop = (\n element: HTMLElement,\n offsetContainer: HTMLElement | null,\n) => {\n const { transform = \"none\" } = getComputedStyle(element);\n if (transform.startsWith(\"matrix\")) {\n const pos = transform.lastIndexOf(\",\");\n return parseInt(transform.slice(pos + 1));\n } else {\n let offsetParent = element.offsetParent as HTMLElement;\n if (offsetParent === offsetContainer || offsetContainer === null) {\n return element.offsetTop;\n } else {\n let top = element.offsetTop;\n while (offsetParent !== null && offsetParent !== offsetContainer) {\n top += offsetParent.offsetTop;\n offsetParent = offsetParent.offsetParent as HTMLElement;\n }\n return top;\n }\n }\n};\n\nexport interface ViewportTrackingProps<Item> {\n containerRef: RefObject<HTMLElement | null>;\n contentRef?: RefObject<HTMLElement | null>;\n highlightedIdx?: number;\n indexPositions: CollectionItem<Item>[];\n stickyHeaders?: boolean;\n}\n\nexport interface ViewportTrackingResult<Item> {\n isScrolling: MutableRefObject<boolean>;\n scrollIntoView: (item: CollectionItem<Item>) => void;\n}\n\nexport const useViewportTracking = <Item>({\n containerRef,\n contentRef = NULL_REF,\n highlightedIdx = -1,\n indexPositions,\n stickyHeaders = false,\n}: ViewportTrackingProps<Item>): ViewportTrackingResult<Item> => {\n const scrolling = useRef<boolean>(false);\n const viewport = useRef({\n height: 0,\n contentHeight: 0,\n });\n\n const scrollTo = useCallback((scrollPos: number) => {\n scrolling.current = true;\n if (containerRef.current) {\n containerRef.current.scrollTop = scrollPos;\n }\n setTimeout(() => {\n scrolling.current = false;\n });\n }, []);\n\n const scrollToStart = useCallback(() => scrollTo(0), [scrollTo]);\n\n const scrollToEnd = useCallback(() => {\n scrollTo(viewport.current.contentHeight - viewport.current.height);\n }, [scrollTo]);\n\n const scrollIntoViewIfNeeded = useCallback(\n (item: CollectionItem<Item>) => {\n const offsetContainer = contentRef.current || containerRef.current;\n if (item.id) {\n const el = document.getElementById(item.id);\n if (el && containerRef.current) {\n const { height: viewportHeight } = viewport.current;\n const targetEl =\n el.ariaExpanded && el.firstChild\n ? (el.firstChild as HTMLElement)\n : el;\n const headerHeight = stickyHeaders ? 36 : 0;\n const itemTop = getItemTop(targetEl, offsetContainer);\n const itemHeight = targetEl.offsetHeight;\n const { scrollTop } = containerRef.current;\n const viewportStart = scrollTop + headerHeight;\n const viewportEnd = viewportStart + viewportHeight - headerHeight;\n\n if (itemTop + itemHeight > viewportEnd || itemTop < viewportStart) {\n const newScrollTop =\n itemTop + itemHeight > viewportEnd\n ? scrollTop + (itemTop + itemHeight) - viewportEnd\n : itemTop - headerHeight;\n\n scrollTo(newScrollTop);\n }\n }\n }\n },\n [containerRef, contentRef, scrollTo, stickyHeaders],\n );\n\n useIsomorphicLayoutEffect(() => {\n const { height, contentHeight } = viewport.current;\n const item = indexPositions[highlightedIdx];\n if (contentHeight > height && item) {\n const [firstItem] = indexPositions;\n const [lastItem] = indexPositions.slice(-1);\n if (item === firstItem) {\n scrollToStart();\n } else if (item === lastItem) {\n scrollToEnd();\n } else {\n scrollIntoViewIfNeeded(indexPositions[highlightedIdx]);\n }\n }\n }, [\n highlightedIdx,\n indexPositions,\n scrollIntoViewIfNeeded,\n scrollToEnd,\n scrollToStart,\n ]);\n\n const onContainerResize: ResizeHandler = useCallback(\n ({ height, scrollHeight }) => {\n if (typeof height === \"number\") {\n viewport.current.height = height;\n }\n if (typeof scrollHeight === \"number\") {\n viewport.current.contentHeight = scrollHeight;\n }\n },\n [],\n );\n\n const onContentResize: ResizeHandler = useCallback(({ height }) => {\n if (typeof height === \"number\") {\n viewport.current.contentHeight = height;\n }\n }, []);\n\n // If we only have a container, then we will observe its height and scrollHeight,\n // contentRef will be null, so second call to observer will observe nothing.\n // If we have both container and content, then we observe the height of each.\n const [containerDimensions, contentDimensions] = getObservedDimensions(\n contentRef === NULL_REF,\n );\n useResizeObserver(containerRef, containerDimensions, onContainerResize, true);\n useResizeObserver(contentRef, contentDimensions, onContentResize, true);\n\n return {\n isScrolling: scrolling,\n scrollIntoView: scrollIntoViewIfNeeded,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -1,168 +0,0 @@
1
- import { isValidElement, Children } from 'react';
2
- import { ListItemGroup } from '../../ListItemGroup.js';
3
- import { ListItemHeader } from '../../ListItemHeader.js';
4
- import { itemToString } from '../../../common-hooks/itemToString.js';
5
-
6
- const sourceItemHasProp = (item, propertyName) => {
7
- return item !== null && Object.prototype.hasOwnProperty.call(item, propertyName);
8
- };
9
- const isHeader = (item) => sourceItemHasProp(item, "header");
10
- const isGroupNode = (item) => sourceItemHasProp(item, "childNodes");
11
- const childItemHasProp = (item, propertyName) => {
12
- return item && Object.prototype.hasOwnProperty.call(item.props, propertyName);
13
- };
14
- const isDisabled = (item) => {
15
- if (isValidElement(item)) {
16
- if (childItemHasProp(item, "disabled")) {
17
- return item.props.disabled === true;
18
- }
19
- } else if (sourceItemHasProp(item, "disabled")) {
20
- return item.disabled === true;
21
- }
22
- return false;
23
- };
24
- const isFocusable = (item) => {
25
- if (isValidElement(item)) {
26
- if (childItemHasProp(item, "focusable")) {
27
- return item.props.focusable;
28
- }
29
- }
30
- return true;
31
- };
32
- const countChildItems = (item, items, idx) => {
33
- if (item.childNodes) {
34
- return item.childNodes.length;
35
- } else if (item.header) {
36
- let i = idx + 1;
37
- let count = 0;
38
- while (i < items.length && !items[i].header) {
39
- count++;
40
- i++;
41
- }
42
- return count;
43
- } else {
44
- return 0;
45
- }
46
- };
47
- const getChildLabel = (element) => {
48
- if (typeof element.props.children === "string") {
49
- return element.props.children;
50
- } else if (element.props.title) {
51
- return element.props.title;
52
- } else if (element.props.label) {
53
- return element.props.label;
54
- }
55
- };
56
- const childIsHeader = (child) => child.type === ListItemHeader || childItemHasProp(child, "data-header");
57
- const childIsGroup = (child) => child.type === ListItemGroup || childItemHasProp(child, "data-group");
58
- const childIsSelectable = (child) => {
59
- if (childItemHasProp(child, "selectable")) {
60
- return child.props.selectable === true;
61
- } else {
62
- return !childIsGroup(child) && !childIsHeader(child);
63
- }
64
- };
65
- const getChildNodes = (element) => {
66
- if (childIsGroup(element)) {
67
- const {
68
- props: { children }
69
- } = element;
70
- if (typeof children !== "string") {
71
- return childItems(children);
72
- }
73
- }
74
- };
75
- const mapReactElementChildren = (children, fn) => {
76
- const childElements = [];
77
- Children.forEach(children, (child) => {
78
- if (isValidElement(child)) {
79
- childElements.push(fn(child));
80
- }
81
- });
82
- return childElements;
83
- };
84
- const sourceItems = (source, options) => {
85
- if (Array.isArray(source)) {
86
- if (source.length === 0 && options?.noChildrenLabel) {
87
- return [
88
- {
89
- label: options.noChildrenLabel,
90
- value: null
91
- }
92
- ];
93
- } else {
94
- return source.map(
95
- (item) => ({
96
- childNodes: sourceItems(
97
- item.childNodes,
98
- options
99
- ),
100
- description: item.description,
101
- expanded: item.expanded,
102
- value: item,
103
- label: options?.itemToString?.(item) ?? itemToString(item)
104
- })
105
- );
106
- }
107
- } else if (source) {
108
- throw Error("list-child-items expects source to be an array");
109
- }
110
- };
111
- const childItems = (children) => {
112
- if (children) {
113
- return mapReactElementChildren(children, (child) => {
114
- const {
115
- "data-id": dataId,
116
- disabled,
117
- id = dataId,
118
- "data-expanded": dataExpanded,
119
- expanded = dataExpanded
120
- } = child.props;
121
- return {
122
- childNodes: getChildNodes(child),
123
- disabled,
124
- expanded,
125
- header: childIsHeader(child),
126
- id,
127
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
128
- label: getChildLabel(child),
129
- selectable: childIsSelectable(child),
130
- value: child
131
- };
132
- });
133
- }
134
- };
135
- const PathSeparators = /* @__PURE__ */ new Set(["/", "-", "."]);
136
- const isPathSeparator = (char) => PathSeparators.has(char);
137
- const isParentPath = (parentPath, childPath) => childPath.startsWith(parentPath) && isPathSeparator(childPath[parentPath.length]);
138
- const PATH_SEPARATORS = /* @__PURE__ */ new Set([".", "/"]);
139
- function isDescendantOf(basePath, targetPath) {
140
- if (!targetPath.startsWith(basePath)) {
141
- return false;
142
- } else {
143
- return PATH_SEPARATORS.has(targetPath.charAt(basePath.length));
144
- }
145
- }
146
- function replaceCollectionItem(nodes, id, props) {
147
- let childNodes;
148
- const newNodes = nodes.map((node) => {
149
- if (node.id === id) {
150
- return {
151
- ...node,
152
- ...props
153
- };
154
- } else if (isDescendantOf(node.id, id) && node.childNodes) {
155
- childNodes = replaceCollectionItem(node.childNodes, id, props);
156
- return {
157
- ...node,
158
- childNodes
159
- };
160
- } else {
161
- return node;
162
- }
163
- });
164
- return newNodes;
165
- }
166
-
167
- export { childIsGroup, childItems, countChildItems, getChildLabel, getChildNodes, isDisabled, isFocusable, isGroupNode, isHeader, isParentPath, replaceCollectionItem, sourceItemHasProp, sourceItems };
168
- //# sourceMappingURL=collection-item-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"collection-item-utils.js","sources":["../../../../src/list/common-hooks/utils/collection-item-utils.ts"],"sourcesContent":["import { isValidElement, Children, ReactElement, ReactNode } from \"react\";\n\nimport {\n CollectionItem,\n CollectionOptions,\n SourceGroup,\n} from \"../../../common-hooks/collectionTypes\";\n// TODO how do we configure these\nimport { ListItemGroup } from \"../../ListItemGroup\";\nimport { ListItemHeader } from \"../../ListItemHeader\";\nimport { itemToString as defaultItemToString } from \"../../../common-hooks/itemToString\";\n\ntype NonFocusableElement = ReactElement<{ focusable: false }>;\ntype DisablableElement = ReactElement<{ disabled: boolean }>;\ntype SelectableElement = ReactElement<{ selectable: boolean }>;\n\nexport const sourceItemHasProp = (\n item: unknown,\n propertyName: string,\n): boolean => {\n return (\n item !== null && Object.prototype.hasOwnProperty.call(item, propertyName)\n );\n};\n\nexport const isHeader = (item: unknown): boolean =>\n sourceItemHasProp(item, \"header\");\n\nexport const isGroupNode = (item: unknown): boolean =>\n sourceItemHasProp(item, \"childNodes\");\n\nconst childItemHasProp = (item: ReactElement, propertyName: string) => {\n return item && Object.prototype.hasOwnProperty.call(item.props, propertyName);\n};\n\nexport const isDisabled = (item: unknown): boolean => {\n if (isValidElement(item as DisablableElement)) {\n if (childItemHasProp(item as DisablableElement, \"disabled\")) {\n return (item as DisablableElement).props.disabled === true;\n }\n } else if (sourceItemHasProp(item, \"disabled\")) {\n return (item as { disabled: boolean }).disabled === true;\n }\n\n return false;\n};\n\nexport const isFocusable = (item: unknown): boolean => {\n if (isValidElement(item as NonFocusableElement)) {\n if (childItemHasProp(item as NonFocusableElement, \"focusable\")) {\n return (item as NonFocusableElement).props.focusable;\n }\n }\n return true;\n};\n\nexport const countChildItems = <Item>(\n item: CollectionItem<Item>,\n items: CollectionItem<Item>[],\n idx: number,\n): number => {\n if (item.childNodes) {\n return item.childNodes.length;\n } else if (item.header) {\n let i = idx + 1;\n let count = 0;\n while (i < items.length && !items[i].header) {\n count++;\n i++;\n }\n return count;\n } else {\n return 0;\n }\n};\n\nexport const getChildLabel = (\n element: ReactElement<{\n children?: ReactNode;\n label?: string;\n title?: string;\n }>,\n): string | undefined => {\n if (typeof element.props.children === \"string\") {\n return element.props.children;\n } else if (element.props.title) {\n return element.props.title;\n } else if (element.props.label) {\n return element.props.label;\n }\n};\n\nconst childIsHeader = (child: ReactElement) =>\n child.type === ListItemHeader || childItemHasProp(child, \"data-header\");\n\nexport const childIsGroup = (child: ReactElement): boolean =>\n child.type === ListItemGroup || childItemHasProp(child, \"data-group\");\n\nconst childIsSelectable = (child: ReactElement) => {\n if (childItemHasProp(child, \"selectable\")) {\n return (child as SelectableElement).props.selectable === true;\n } else {\n return !childIsGroup(child) && !childIsHeader(child);\n }\n};\n\nexport const getChildNodes = (\n element: ReactElement,\n): CollectionItem<ReactElement>[] | undefined => {\n if (childIsGroup(element)) {\n const {\n props: { children },\n } = element as ReactElement<{ children?: ReactNode }>;\n if (typeof children !== \"string\") {\n return childItems(children);\n }\n }\n};\n\nconst mapReactElementChildren = (\n children: ReactNode,\n fn: (el: ReactElement) => CollectionItem<ReactElement>,\n): CollectionItem<ReactElement>[] => {\n const childElements: CollectionItem<ReactElement>[] = [];\n Children.forEach(children, (child) => {\n if (isValidElement(child)) {\n childElements.push(fn(child));\n }\n });\n return childElements;\n};\n\ntype ListItemElementProps = {\n \"data-id\"?: string;\n disabled?: boolean;\n id?: string;\n \"data-expanded\"?: boolean;\n expanded?: boolean;\n};\n\ntype CollectionItemWithoutId<T> = Omit<CollectionItem<T>, \"id\">;\n\nexport const sourceItems = <T>(\n source?: ReadonlyArray<T>,\n options?: CollectionOptions<T>,\n): CollectionItemWithoutId<T>[] | undefined => {\n if (Array.isArray(source)) {\n if (source.length === 0 && options?.noChildrenLabel) {\n return [\n {\n label: options.noChildrenLabel,\n value: null,\n },\n ];\n } else {\n return source.map(\n (item: { description?: string; expanded?: boolean }) =>\n ({\n childNodes: sourceItems(\n (item as unknown as SourceGroup<T>).childNodes,\n options,\n ),\n description: item.description,\n expanded: item.expanded,\n value: item,\n label:\n options?.itemToString?.(item as T) ?? defaultItemToString(item),\n }) as CollectionItemWithoutId<T>,\n );\n }\n } else if (source) {\n throw Error(\"list-child-items expects source to be an array\");\n }\n};\n\nexport const childItems = (\n children: ReactNode,\n): CollectionItem<ReactElement>[] | undefined => {\n if (children) {\n return mapReactElementChildren(children, (child) => {\n const {\n \"data-id\": dataId,\n disabled,\n id = dataId,\n \"data-expanded\": dataExpanded,\n expanded = dataExpanded,\n } = (child as ReactElement<ListItemElementProps>).props;\n return {\n childNodes: getChildNodes(child),\n disabled,\n expanded,\n header: childIsHeader(child),\n id,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n label: getChildLabel(child as any),\n selectable: childIsSelectable(child),\n value: child,\n } as CollectionItem<ReactElement>;\n });\n }\n};\n\nconst PathSeparators = new Set<string>([\"/\", \"-\", \".\"]);\n// TODO where do we define or identify separators\nconst isPathSeparator = (char: string) => PathSeparators.has(char);\n\nexport const isParentPath = (parentPath: string, childPath: string): boolean =>\n childPath.startsWith(parentPath) &&\n isPathSeparator(childPath[parentPath.length]);\n\nconst PATH_SEPARATORS = new Set([\".\", \"/\"]);\n\nfunction isDescendantOf(basePath: string, targetPath: string) {\n if (!targetPath.startsWith(basePath)) {\n return false;\n } else {\n return PATH_SEPARATORS.has(targetPath.charAt(basePath.length));\n }\n}\n\nexport function replaceCollectionItem<Item>(\n nodes: CollectionItem<Item>[],\n id: string,\n props: Partial<CollectionItem<Item>>,\n): CollectionItem<Item>[] {\n let childNodes: CollectionItem<Item>[];\n const newNodes: CollectionItem<Item>[] = nodes.map((node) => {\n if (node.id === id) {\n return {\n ...node,\n ...props,\n };\n } else if (isDescendantOf(node.id, id) && node.childNodes) {\n childNodes = replaceCollectionItem<Item>(node.childNodes, id, props);\n return {\n ...node,\n childNodes,\n };\n } else {\n return node;\n }\n });\n\n return newNodes;\n}\n"],"names":["defaultItemToString"],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import { escapeRegExp } from '../../../utils/escapeRegExp.js';
2
-
3
- const leftTrim = (value) => value ? value.replace(/^\s+/g, "") : value;
4
- const getDefaultFilterRegex = (value) => new RegExp(`(${escapeRegExp(leftTrim(value))})`, "gi");
5
- const getDefaultFilter = (inputValue = "", getFilterRegex = getDefaultFilterRegex) => (itemValue = "") => Boolean(itemValue.length) && Boolean(inputValue.length) && itemValue.match(getFilterRegex(inputValue)) !== null;
6
-
7
- export { getDefaultFilter, getDefaultFilterRegex };
8
- //# sourceMappingURL=filter-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filter-utils.js","sources":["../../../../src/list/common-hooks/utils/filter-utils.ts"],"sourcesContent":["import { escapeRegExp } from \"../../../utils\";\n\nexport type GetFilterRegex = (inputValue: string) => RegExp;\n\nexport type FilterPredicate = (item: string) => boolean;\n\nconst leftTrim = (value: string) =>\n value ? value.replace(/^\\s+/g, \"\") : value;\n\nexport const getDefaultFilterRegex: GetFilterRegex = (value) =>\n new RegExp(`(${escapeRegExp(leftTrim(value))})`, \"gi\");\n\nexport const getDefaultFilter =\n (inputValue = \"\", getFilterRegex: GetFilterRegex = getDefaultFilterRegex) =>\n (itemValue = \"\"): boolean =>\n Boolean(itemValue.length) &&\n Boolean(inputValue.length) &&\n itemValue.match(getFilterRegex(inputValue)) !== null;\n"],"names":[],"mappings":";;AAMA,MAAM,QAAA,GAAW,CAAC,KAChB,KAAA,KAAA,GAAQ,MAAM,OAAQ,CAAA,OAAA,EAAS,EAAE,CAAI,GAAA,KAAA;AAEhC,MAAM,qBAAwC,GAAA,CAAC,KACpD,KAAA,IAAI,MAAO,CAAA,CAAA,CAAA,EAAI,YAAa,CAAA,QAAA,CAAS,KAAK,CAAC,CAAC,CAAA,CAAA,CAAA,EAAK,IAAI;AAE1C,MAAA,gBAAA,GACX,CAAC,UAAa,GAAA,EAAA,EAAI,iBAAiC,qBACnD,KAAA,CAAC,SAAY,GAAA,EAAA,KACX,OAAQ,CAAA,SAAA,CAAU,MAAM,CACxB,IAAA,OAAA,CAAQ,WAAW,MAAM,CAAA,IACzB,UAAU,KAAM,CAAA,cAAA,CAAe,UAAU,CAAC,CAAM,KAAA;;;;"}
@@ -1,7 +0,0 @@
1
- function isSelected(selectedId, item) {
2
- const isSelected2 = Array.isArray(selectedId) ? selectedId.includes(item.id) : selectedId === item.id;
3
- return isSelected2;
4
- }
5
-
6
- export { isSelected };
7
- //# sourceMappingURL=isSelected.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"isSelected.js","sources":["../../../../src/list/common-hooks/utils/isSelected.ts"],"sourcesContent":["import { CollectionItem } from \"../../../common-hooks/collectionTypes\";\n\nexport function isSelected<Item>(\n selectedId: string | string[] | null,\n item: CollectionItem<Item>\n): boolean {\n const isSelected = Array.isArray(selectedId)\n ? selectedId.includes(item.id)\n : selectedId === item.id;\n return isSelected;\n}\n"],"names":["isSelected"],"mappings":"AAEgB,SAAA,UAAA,CACd,YACA,IACS,EAAA;AACT,EAAMA,MAAAA,WAAAA,GAAa,KAAM,CAAA,OAAA,CAAQ,UAAU,CAAA,GACvC,UAAW,CAAA,QAAA,CAAS,IAAK,CAAA,EAAE,CAC3B,GAAA,UAAA,KAAe,IAAK,CAAA,EAAA;AACxB,EAAOA,OAAAA,WAAAA;AACT;;;;"}
@@ -1,276 +0,0 @@
1
- import { useLayoutEffectSkipFirst } from '@vuu-ui/vuu-utils';
2
- import { useRef, useCallback } from 'react';
3
- import '../common-hooks/collectionProvider.js';
4
- import '../common-hooks/use-resize-observer.js';
5
- import { isSingleSelection, isMultiSelection, hasSelection } from '../common-hooks/selectionTypes.js';
6
- import '../drag-drop/DragDropProvider.js';
7
- import { useDragDrop } from '../drag-drop/useDragDrop.js';
8
- import './common-hooks/keyUtils.js';
9
- import { useCollapsibleGroups } from './common-hooks/useCollapsibleGroups.js';
10
- import { closestListItemIndex } from './common-hooks/list-dom-utils.js';
11
- import { useKeyboardNavigation } from './common-hooks/useKeyboardNavigation.js';
12
- import { useSelection } from '../common-hooks/useSelection.js';
13
- import { useTypeahead } from './common-hooks/useTypeahead.js';
14
- import { useViewportTracking } from './common-hooks/useViewportTracking.js';
15
- import { useListDrop } from './useListDrop.js';
16
-
17
- const useList = ({
18
- allowDragDrop = false,
19
- collapsibleHeaders,
20
- collectionHook: dataHook,
21
- contentRef,
22
- defaultHighlightedIndex,
23
- defaultSelected,
24
- disabled,
25
- disableAriaActiveDescendant,
26
- disableHighlightOnFocus,
27
- disableTypeToSelect,
28
- highlightedIndex: highlightedIndexProp,
29
- id,
30
- label = "",
31
- listHandlers: listHandlersProp,
32
- onClick: onClickProp,
33
- onDragStart,
34
- onDrop,
35
- onHighlight,
36
- onKeyboardNavigation,
37
- onKeyDown,
38
- onMoveListItem,
39
- onSelect,
40
- onSelectionChange,
41
- restoreLastFocus,
42
- selected,
43
- selectionStrategy,
44
- selectionKeys,
45
- stickyHeaders,
46
- tabToSelect,
47
- viewportRange
48
- }) => {
49
- const containerRef = useRef(null);
50
- const scrollContainerRef = useRef(null);
51
- const lastSelection = useRef(
52
- selected || defaultSelected
53
- );
54
- const handleKeyboardNavigation = (evt, nextIndex) => {
55
- selectionHook.listHandlers.onKeyboardNavigation?.(evt, nextIndex);
56
- onKeyboardNavigation?.(evt, nextIndex);
57
- };
58
- const handleSelect = useCallback(
59
- (evt, selectedId) => {
60
- if (onSelect) {
61
- if (selectedId !== null) {
62
- onSelect(evt, dataHook.itemById(selectedId));
63
- }
64
- }
65
- },
66
- [dataHook, onSelect]
67
- );
68
- const setContainerRef = useCallback((el) => {
69
- if (el) {
70
- containerRef.current = el;
71
- scrollContainerRef.current = el.querySelector(".vuuList-viewport");
72
- }
73
- }, []);
74
- const handleSelectionChange = useCallback(
75
- (evt, selected2) => {
76
- if (onSelectionChange) {
77
- if (isSingleSelection(selectionStrategy)) {
78
- const [selectedItem] = selected2;
79
- onSelectionChange(
80
- evt,
81
- dataHook.itemById(selectedItem)
82
- );
83
- } else if (isMultiSelection(selectionStrategy)) {
84
- const selectedItems = selected2.map((id2) => dataHook.itemById(id2));
85
- onSelectionChange(
86
- evt,
87
- selectedItems
88
- );
89
- }
90
- }
91
- },
92
- [dataHook, onSelectionChange, selectionStrategy]
93
- );
94
- const {
95
- highlightedIndex,
96
- containerProps: {
97
- onKeyDown: navigationKeyDown,
98
- onMouseMove: navigationMouseMove,
99
- ...navigationControlProps
100
- },
101
- setHighlightedIndex,
102
- ...keyboardHook
103
- } = useKeyboardNavigation({
104
- containerRef: scrollContainerRef,
105
- defaultHighlightedIndex,
106
- disableHighlightOnFocus,
107
- highlightedIndex: highlightedIndexProp,
108
- itemCount: dataHook.data.length,
109
- label,
110
- onHighlight,
111
- onKeyboardNavigation: handleKeyboardNavigation,
112
- restoreLastFocus,
113
- selected: lastSelection.current,
114
- viewportItemCount: 10
115
- });
116
- const collapsibleHook = useCollapsibleGroups({
117
- collapsibleHeaders,
118
- highlightedIdx: highlightedIndex,
119
- collectionHook: dataHook
120
- });
121
- const handleDragStart = useCallback(
122
- (dragDropState) => {
123
- setHighlightedIndex(-1);
124
- onDragStart?.(dragDropState);
125
- },
126
- [onDragStart, setHighlightedIndex]
127
- );
128
- const selectionHook = useSelection({
129
- containerRef,
130
- defaultSelected,
131
- highlightedIndex,
132
- itemQuery: ".vuuListItem",
133
- label: `${label}:useList`,
134
- onClick: onClickProp,
135
- onSelect: handleSelect,
136
- onSelectionChange: handleSelectionChange,
137
- selected,
138
- selectionStrategy,
139
- selectionKeys,
140
- tabToSelect
141
- });
142
- const { handleDrop, onDropSettle } = useListDrop({
143
- dataHook,
144
- onDrop,
145
- onMoveListItem,
146
- selected: selectionHook.selected,
147
- setHighlightedIndex,
148
- setSelected: selectionHook.setSelected
149
- });
150
- const { setSelected } = selectionHook;
151
- useLayoutEffectSkipFirst(() => {
152
- if (hasSelection(lastSelection.current)) {
153
- setSelected([]);
154
- }
155
- }, [selected, dataHook.data, setSelected]);
156
- const {
157
- onMouseDown,
158
- isDragging,
159
- isScrolling: isDragDropScrolling,
160
- ...dragDropHook
161
- } = useDragDrop({
162
- allowDragDrop,
163
- draggableClassName: "list-item",
164
- orientation: "vertical",
165
- containerRef,
166
- id,
167
- itemQuery: ".vuuListItem",
168
- onDragStart: handleDragStart,
169
- onDrop: handleDrop,
170
- onDropSettle,
171
- viewportRange
172
- });
173
- const { onKeyDown: typeaheadOnKeyDown } = useTypeahead({
174
- disableTypeToSelect,
175
- highlightedIdx: highlightedIndex,
176
- highlightItemAtIndex: setHighlightedIndex,
177
- typeToNavigate: true,
178
- items: dataHook.data
179
- });
180
- const handleKeyDown = useCallback(
181
- (evt) => {
182
- if (!evt.defaultPrevented) {
183
- typeaheadOnKeyDown?.(evt);
184
- }
185
- navigationKeyDown(evt);
186
- if (!evt.defaultPrevented) {
187
- selectionHook.listHandlers.onKeyDown?.(evt);
188
- }
189
- if (!evt.defaultPrevented) {
190
- collapsibleHook?.onKeyDown?.(evt);
191
- }
192
- if (!evt.defaultPrevented) {
193
- onKeyDown?.(evt);
194
- }
195
- },
196
- [
197
- collapsibleHook,
198
- navigationKeyDown,
199
- onKeyDown,
200
- selectionHook.listHandlers,
201
- typeaheadOnKeyDown
202
- ]
203
- );
204
- const { isScrolling: isViewportScrolling, scrollIntoView } = useViewportTracking({
205
- containerRef: scrollContainerRef,
206
- contentRef,
207
- highlightedIdx: highlightedIndex,
208
- indexPositions: dataHook.data,
209
- stickyHeaders
210
- });
211
- const isScrolling = isViewportScrolling.current || isDragDropScrolling.current;
212
- const handleMouseMove = useCallback(
213
- (evt) => {
214
- if (!isScrolling && !disabled && !isDragging) {
215
- navigationMouseMove();
216
- const idx = closestListItemIndex(evt.target);
217
- if (idx !== -1 && idx !== highlightedIndex) {
218
- const item = dataHook.data[idx];
219
- if (!item || item.disabled) {
220
- setHighlightedIndex(-1);
221
- } else {
222
- setHighlightedIndex(idx);
223
- }
224
- }
225
- }
226
- },
227
- [
228
- isDragging,
229
- isScrolling,
230
- disabled,
231
- setHighlightedIndex,
232
- navigationMouseMove,
233
- highlightedIndex,
234
- dataHook.data
235
- ]
236
- );
237
- const getActiveDescendant = () => highlightedIndex === void 0 || highlightedIndex === -1 || disableAriaActiveDescendant ? void 0 : dataHook.data[highlightedIndex]?.id;
238
- lastSelection.current = selectionHook.selected;
239
- const listControlProps = {
240
- "aria-activedescendant": getActiveDescendant(),
241
- onBlur: navigationControlProps.onBlur,
242
- onFocus: navigationControlProps.onFocus,
243
- onKeyDown: handleKeyDown,
244
- onMouseDown,
245
- onMouseDownCapture: navigationControlProps.onMouseDownCapture,
246
- onMouseLeave: navigationControlProps.onMouseLeave
247
- };
248
- const listHandlers = listHandlersProp || {
249
- onClick: selectionHook.listHandlers.onClick,
250
- // MouseEnter would be much better for this. There is a bug in Cypress
251
- // wheby it emits spurious MouseEnter (and MouseOver) events around
252
- // keypress events, which break many tests.
253
- onMouseMove: handleMouseMove
254
- };
255
- return {
256
- containerRef,
257
- setContainerRef,
258
- focusVisible: keyboardHook.focusVisible,
259
- controlledHighlighting: keyboardHook.controlledHighlighting,
260
- highlightedIndex,
261
- keyboardNavigation: keyboardHook.keyboardNavigation,
262
- listHandlers,
263
- listItemHeaderHandlers: collapsibleHook,
264
- listControlProps,
265
- scrollIntoView,
266
- //TODO given that we firs onSelect and onSelectionCHange with Item(s), should we return Item(s) here ?
267
- selected: selectionHook.selected,
268
- setHighlightedIndex,
269
- setIgnoreFocus: keyboardHook.setIgnoreFocus,
270
- setSelected: selectionHook.setSelected,
271
- ...dragDropHook
272
- };
273
- };
274
-
275
- export { useList };
276
- //# sourceMappingURL=useList.js.map