@vuu-ui/vuu-table 0.0.26

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 (260) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +0 -0
  3. package/cjs/Row.css.js +6 -0
  4. package/cjs/Row.css.js.map +1 -0
  5. package/cjs/Row.js +130 -0
  6. package/cjs/Row.js.map +1 -0
  7. package/cjs/Table.css.js +6 -0
  8. package/cjs/Table.css.js.map +1 -0
  9. package/cjs/Table.js +285 -0
  10. package/cjs/Table.js.map +1 -0
  11. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js +6 -0
  12. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  13. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +42 -0
  14. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -0
  15. package/cjs/cell-renderers/input-cell/InputCell.css.js +6 -0
  16. package/cjs/cell-renderers/input-cell/InputCell.css.js.map +1 -0
  17. package/cjs/cell-renderers/input-cell/InputCell.js +58 -0
  18. package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -0
  19. package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js +6 -0
  20. package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js.map +1 -0
  21. package/cjs/cell-renderers/toggle-cell/ToggleCell.js +68 -0
  22. package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +1 -0
  23. package/cjs/column-header-pill/ColumnHeaderPill.css.js +6 -0
  24. package/cjs/column-header-pill/ColumnHeaderPill.css.js.map +1 -0
  25. package/cjs/column-header-pill/ColumnHeaderPill.js +53 -0
  26. package/cjs/column-header-pill/ColumnHeaderPill.js.map +1 -0
  27. package/cjs/column-header-pill/GroupColumnPill.css.js +6 -0
  28. package/cjs/column-header-pill/GroupColumnPill.css.js.map +1 -0
  29. package/cjs/column-header-pill/GroupColumnPill.js +29 -0
  30. package/cjs/column-header-pill/GroupColumnPill.js.map +1 -0
  31. package/cjs/column-header-pill/SortIndicator.css.js +6 -0
  32. package/cjs/column-header-pill/SortIndicator.css.js.map +1 -0
  33. package/cjs/column-header-pill/SortIndicator.js +27 -0
  34. package/cjs/column-header-pill/SortIndicator.js.map +1 -0
  35. package/cjs/column-menu/ColumnMenu.css.js +6 -0
  36. package/cjs/column-menu/ColumnMenu.css.js.map +1 -0
  37. package/cjs/column-menu/ColumnMenu.js +30 -0
  38. package/cjs/column-menu/ColumnMenu.js.map +1 -0
  39. package/cjs/column-resizing/ColumnResizer.css.js +6 -0
  40. package/cjs/column-resizing/ColumnResizer.css.js.map +1 -0
  41. package/cjs/column-resizing/ColumnResizer.js +72 -0
  42. package/cjs/column-resizing/ColumnResizer.js.map +1 -0
  43. package/cjs/column-resizing/useTableColumnResize.js +55 -0
  44. package/cjs/column-resizing/useTableColumnResize.js.map +1 -0
  45. package/cjs/context-menu/buildContextMenuDescriptors.js +214 -0
  46. package/cjs/context-menu/buildContextMenuDescriptors.js.map +1 -0
  47. package/cjs/context-menu/useHandleTableContextMenu.js +81 -0
  48. package/cjs/context-menu/useHandleTableContextMenu.js.map +1 -0
  49. package/cjs/header-cell/GroupHeaderCell.css.js +6 -0
  50. package/cjs/header-cell/GroupHeaderCell.css.js.map +1 -0
  51. package/cjs/header-cell/GroupHeaderCell.js +117 -0
  52. package/cjs/header-cell/GroupHeaderCell.js.map +1 -0
  53. package/cjs/header-cell/HeaderCell.css.js +6 -0
  54. package/cjs/header-cell/HeaderCell.css.js.map +1 -0
  55. package/cjs/header-cell/HeaderCell.js +109 -0
  56. package/cjs/header-cell/HeaderCell.js.map +1 -0
  57. package/cjs/index.js +36 -0
  58. package/cjs/index.js.map +1 -0
  59. package/cjs/moving-window.js +61 -0
  60. package/cjs/moving-window.js.map +1 -0
  61. package/cjs/table-cell/TableCell.css.js +6 -0
  62. package/cjs/table-cell/TableCell.css.js.map +1 -0
  63. package/cjs/table-cell/TableCell.js +72 -0
  64. package/cjs/table-cell/TableCell.js.map +1 -0
  65. package/cjs/table-cell/TableGroupCell.css.js +6 -0
  66. package/cjs/table-cell/TableGroupCell.css.js.map +1 -0
  67. package/cjs/table-cell/TableGroupCell.js +54 -0
  68. package/cjs/table-cell/TableGroupCell.js.map +1 -0
  69. package/cjs/table-config.js +25 -0
  70. package/cjs/table-config.js.map +1 -0
  71. package/cjs/table-dom-utils.js +60 -0
  72. package/cjs/table-dom-utils.js.map +1 -0
  73. package/cjs/table-header/TableHeader.js +87 -0
  74. package/cjs/table-header/TableHeader.js.map +1 -0
  75. package/cjs/table-header/useTableHeader.js +72 -0
  76. package/cjs/table-header/useTableHeader.js.map +1 -0
  77. package/cjs/useCell.js +28 -0
  78. package/cjs/useCell.js.map +1 -0
  79. package/cjs/useCellEditing.js +79 -0
  80. package/cjs/useCellEditing.js.map +1 -0
  81. package/cjs/useControlledTableNavigation.js +43 -0
  82. package/cjs/useControlledTableNavigation.js.map +1 -0
  83. package/cjs/useDataSource.js +104 -0
  84. package/cjs/useDataSource.js.map +1 -0
  85. package/cjs/useInitialValue.js +11 -0
  86. package/cjs/useInitialValue.js.map +1 -0
  87. package/cjs/useKeyboardNavigation.js +304 -0
  88. package/cjs/useKeyboardNavigation.js.map +1 -0
  89. package/cjs/useRowClassNameGenerators.js +34 -0
  90. package/cjs/useRowClassNameGenerators.js.map +1 -0
  91. package/cjs/useRowHeight.js +43 -0
  92. package/cjs/useRowHeight.js.map +1 -0
  93. package/cjs/useSelection.js +64 -0
  94. package/cjs/useSelection.js.map +1 -0
  95. package/cjs/useTable.js +553 -0
  96. package/cjs/useTable.js.map +1 -0
  97. package/cjs/useTableAndColumnSettings.js +128 -0
  98. package/cjs/useTableAndColumnSettings.js.map +1 -0
  99. package/cjs/useTableContextMenu.js +42 -0
  100. package/cjs/useTableContextMenu.js.map +1 -0
  101. package/cjs/useTableModel.js +297 -0
  102. package/cjs/useTableModel.js.map +1 -0
  103. package/cjs/useTableScroll.js +396 -0
  104. package/cjs/useTableScroll.js.map +1 -0
  105. package/cjs/useTableViewport.js +122 -0
  106. package/cjs/useTableViewport.js.map +1 -0
  107. package/esm/Row.css.js +4 -0
  108. package/esm/Row.css.js.map +1 -0
  109. package/esm/Row.js +127 -0
  110. package/esm/Row.js.map +1 -0
  111. package/esm/Table.css.js +4 -0
  112. package/esm/Table.css.js.map +1 -0
  113. package/esm/Table.js +283 -0
  114. package/esm/Table.js.map +1 -0
  115. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js +4 -0
  116. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  117. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +40 -0
  118. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -0
  119. package/esm/cell-renderers/input-cell/InputCell.css.js +4 -0
  120. package/esm/cell-renderers/input-cell/InputCell.css.js.map +1 -0
  121. package/esm/cell-renderers/input-cell/InputCell.js +56 -0
  122. package/esm/cell-renderers/input-cell/InputCell.js.map +1 -0
  123. package/esm/cell-renderers/toggle-cell/ToggleCell.css.js +4 -0
  124. package/esm/cell-renderers/toggle-cell/ToggleCell.css.js.map +1 -0
  125. package/esm/cell-renderers/toggle-cell/ToggleCell.js +66 -0
  126. package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +1 -0
  127. package/esm/column-header-pill/ColumnHeaderPill.css.js +4 -0
  128. package/esm/column-header-pill/ColumnHeaderPill.css.js.map +1 -0
  129. package/esm/column-header-pill/ColumnHeaderPill.js +51 -0
  130. package/esm/column-header-pill/ColumnHeaderPill.js.map +1 -0
  131. package/esm/column-header-pill/GroupColumnPill.css.js +4 -0
  132. package/esm/column-header-pill/GroupColumnPill.css.js.map +1 -0
  133. package/esm/column-header-pill/GroupColumnPill.js +27 -0
  134. package/esm/column-header-pill/GroupColumnPill.js.map +1 -0
  135. package/esm/column-header-pill/SortIndicator.css.js +4 -0
  136. package/esm/column-header-pill/SortIndicator.css.js.map +1 -0
  137. package/esm/column-header-pill/SortIndicator.js +25 -0
  138. package/esm/column-header-pill/SortIndicator.js.map +1 -0
  139. package/esm/column-menu/ColumnMenu.css.js +4 -0
  140. package/esm/column-menu/ColumnMenu.css.js.map +1 -0
  141. package/esm/column-menu/ColumnMenu.js +28 -0
  142. package/esm/column-menu/ColumnMenu.js.map +1 -0
  143. package/esm/column-resizing/ColumnResizer.css.js +4 -0
  144. package/esm/column-resizing/ColumnResizer.css.js.map +1 -0
  145. package/esm/column-resizing/ColumnResizer.js +70 -0
  146. package/esm/column-resizing/ColumnResizer.js.map +1 -0
  147. package/esm/column-resizing/useTableColumnResize.js +53 -0
  148. package/esm/column-resizing/useTableColumnResize.js.map +1 -0
  149. package/esm/context-menu/buildContextMenuDescriptors.js +212 -0
  150. package/esm/context-menu/buildContextMenuDescriptors.js.map +1 -0
  151. package/esm/context-menu/useHandleTableContextMenu.js +79 -0
  152. package/esm/context-menu/useHandleTableContextMenu.js.map +1 -0
  153. package/esm/header-cell/GroupHeaderCell.css.js +4 -0
  154. package/esm/header-cell/GroupHeaderCell.css.js.map +1 -0
  155. package/esm/header-cell/GroupHeaderCell.js +115 -0
  156. package/esm/header-cell/GroupHeaderCell.js.map +1 -0
  157. package/esm/header-cell/HeaderCell.css.js +4 -0
  158. package/esm/header-cell/HeaderCell.css.js.map +1 -0
  159. package/esm/header-cell/HeaderCell.js +107 -0
  160. package/esm/header-cell/HeaderCell.js.map +1 -0
  161. package/esm/index.js +14 -0
  162. package/esm/index.js.map +1 -0
  163. package/esm/moving-window.js +59 -0
  164. package/esm/moving-window.js.map +1 -0
  165. package/esm/table-cell/TableCell.css.js +4 -0
  166. package/esm/table-cell/TableCell.css.js.map +1 -0
  167. package/esm/table-cell/TableCell.js +70 -0
  168. package/esm/table-cell/TableCell.js.map +1 -0
  169. package/esm/table-cell/TableGroupCell.css.js +4 -0
  170. package/esm/table-cell/TableGroupCell.css.js.map +1 -0
  171. package/esm/table-cell/TableGroupCell.js +52 -0
  172. package/esm/table-cell/TableGroupCell.js.map +1 -0
  173. package/esm/table-config.js +23 -0
  174. package/esm/table-config.js.map +1 -0
  175. package/esm/table-dom-utils.js +51 -0
  176. package/esm/table-dom-utils.js.map +1 -0
  177. package/esm/table-header/TableHeader.js +85 -0
  178. package/esm/table-header/TableHeader.js.map +1 -0
  179. package/esm/table-header/useTableHeader.js +70 -0
  180. package/esm/table-header/useTableHeader.js.map +1 -0
  181. package/esm/useCell.js +26 -0
  182. package/esm/useCell.js.map +1 -0
  183. package/esm/useCellEditing.js +77 -0
  184. package/esm/useCellEditing.js.map +1 -0
  185. package/esm/useControlledTableNavigation.js +41 -0
  186. package/esm/useControlledTableNavigation.js.map +1 -0
  187. package/esm/useDataSource.js +101 -0
  188. package/esm/useDataSource.js.map +1 -0
  189. package/esm/useInitialValue.js +9 -0
  190. package/esm/useInitialValue.js.map +1 -0
  191. package/esm/useKeyboardNavigation.js +300 -0
  192. package/esm/useKeyboardNavigation.js.map +1 -0
  193. package/esm/useRowClassNameGenerators.js +32 -0
  194. package/esm/useRowClassNameGenerators.js.map +1 -0
  195. package/esm/useRowHeight.js +41 -0
  196. package/esm/useRowHeight.js.map +1 -0
  197. package/esm/useSelection.js +62 -0
  198. package/esm/useSelection.js.map +1 -0
  199. package/esm/useTable.js +551 -0
  200. package/esm/useTable.js.map +1 -0
  201. package/esm/useTableAndColumnSettings.js +126 -0
  202. package/esm/useTableAndColumnSettings.js.map +1 -0
  203. package/esm/useTableContextMenu.js +40 -0
  204. package/esm/useTableContextMenu.js.map +1 -0
  205. package/esm/useTableModel.js +293 -0
  206. package/esm/useTableModel.js.map +1 -0
  207. package/esm/useTableScroll.js +393 -0
  208. package/esm/useTableScroll.js.map +1 -0
  209. package/esm/useTableViewport.js +120 -0
  210. package/esm/useTableViewport.js.map +1 -0
  211. package/package.json +42 -0
  212. package/types/Row.d.ts +23 -0
  213. package/types/Table.d.ts +91 -0
  214. package/types/cell-renderers/checkbox-cell/CheckboxCell.d.ts +3 -0
  215. package/types/cell-renderers/checkbox-cell/index.d.ts +1 -0
  216. package/types/cell-renderers/index.d.ts +3 -0
  217. package/types/cell-renderers/input-cell/InputCell.d.ts +3 -0
  218. package/types/cell-renderers/input-cell/index.d.ts +1 -0
  219. package/types/cell-renderers/toggle-cell/ToggleCell.d.ts +3 -0
  220. package/types/cell-renderers/toggle-cell/index.d.ts +1 -0
  221. package/types/column-header-pill/ColumnHeaderPill.d.ts +8 -0
  222. package/types/column-header-pill/GroupColumnPill.d.ts +7 -0
  223. package/types/column-header-pill/SortIndicator.d.ts +6 -0
  224. package/types/column-header-pill/index.d.ts +3 -0
  225. package/types/column-menu/ColumnMenu.d.ts +6 -0
  226. package/types/column-menu/index.d.ts +1 -0
  227. package/types/column-resizing/ColumnResizer.d.ts +7 -0
  228. package/types/column-resizing/index.d.ts +2 -0
  229. package/types/column-resizing/useTableColumnResize.d.ts +15 -0
  230. package/types/context-menu/buildContextMenuDescriptors.d.ts +3 -0
  231. package/types/context-menu/index.d.ts +2 -0
  232. package/types/context-menu/useHandleTableContextMenu.d.ts +20 -0
  233. package/types/header-cell/GroupHeaderCell.d.ts +8 -0
  234. package/types/header-cell/HeaderCell.d.ts +3 -0
  235. package/types/header-cell/index.d.ts +2 -0
  236. package/types/index.d.ts +11 -0
  237. package/types/moving-window.d.ts +14 -0
  238. package/types/table-cell/TableCell.d.ts +3 -0
  239. package/types/table-cell/TableGroupCell.d.ts +3 -0
  240. package/types/table-cell/index.d.ts +2 -0
  241. package/types/table-config.d.ts +25 -0
  242. package/types/table-dom-utils.d.ts +14 -0
  243. package/types/table-header/TableHeader.d.ts +19 -0
  244. package/types/table-header/useTableHeader.d.ts +15 -0
  245. package/types/useCell.d.ts +6 -0
  246. package/types/useCellEditing.d.ts +10 -0
  247. package/types/useControlledTableNavigation.d.ts +7 -0
  248. package/types/useDataSource.d.ts +20 -0
  249. package/types/useInitialValue.d.ts +1 -0
  250. package/types/useKeyboardNavigation.d.ts +36 -0
  251. package/types/useResizeObserver.d.ts +15 -0
  252. package/types/useRowClassNameGenerators.d.ts +3 -0
  253. package/types/useRowHeight.d.ts +8 -0
  254. package/types/useSelection.d.ts +14 -0
  255. package/types/useTable.d.ts +71 -0
  256. package/types/useTableAndColumnSettings.d.ts +15 -0
  257. package/types/useTableContextMenu.d.ts +10 -0
  258. package/types/useTableModel.d.ts +103 -0
  259. package/types/useTableScroll.d.ts +57 -0
  260. package/types/useTableViewport.d.ts +41 -0
@@ -0,0 +1,396 @@
1
+ 'use strict';
2
+
3
+ var vuuUtils = require('@vuu-ui/vuu-utils');
4
+ var react = require('react');
5
+ var tableDomUtils = require('./table-dom-utils.js');
6
+
7
+ const SCROLL_MOVE_CHECK_THRESHOLD = 100;
8
+ const HORIZONTAL_SCROLL_BUFFER = 200;
9
+ const getMaxScroll = (container) => {
10
+ const { clientHeight, clientWidth, scrollHeight, scrollWidth } = container;
11
+ return [scrollWidth - clientWidth, scrollHeight - clientHeight];
12
+ };
13
+ const getScrollDirection = (prevScrollPositions, scrollPos) => {
14
+ if (prevScrollPositions === void 0) {
15
+ return void 0;
16
+ } else {
17
+ const { scrollTop: prevTop } = prevScrollPositions;
18
+ return scrollPos > prevTop ? "fwd" : "bwd";
19
+ }
20
+ };
21
+ const getPctScroll = (container, currentScrollPos) => {
22
+ const {
23
+ clientHeight,
24
+ clientWidth,
25
+ scrollHeight,
26
+ scrollLeft,
27
+ scrollTop,
28
+ scrollWidth
29
+ } = container;
30
+ const maxScrollLeft = scrollWidth - clientWidth;
31
+ const pctScrollLeft = scrollLeft / (scrollWidth - clientWidth);
32
+ const maxScrollTop = scrollHeight - clientHeight;
33
+ let pctScrollTop = scrollTop / (scrollHeight - clientHeight);
34
+ const scrollDirection = getScrollDirection(currentScrollPos, scrollTop);
35
+ if (scrollDirection === "fwd" && pctScrollTop > 0.99) {
36
+ pctScrollTop = 1;
37
+ } else if (scrollDirection === "bwd" && pctScrollTop < 0.02) {
38
+ pctScrollTop = 0;
39
+ }
40
+ return [
41
+ scrollLeft,
42
+ pctScrollLeft,
43
+ maxScrollLeft,
44
+ scrollTop,
45
+ pctScrollTop,
46
+ maxScrollTop
47
+ ];
48
+ };
49
+ const noScrolling = {
50
+ scrollToIndex: () => void 0,
51
+ scrollToKey: () => void 0
52
+ };
53
+ const useCallbackRef = ({
54
+ onAttach,
55
+ onDetach
56
+ }) => {
57
+ const ref = react.useRef(null);
58
+ const callbackRef = react.useCallback(
59
+ (el) => {
60
+ if (el) {
61
+ ref.current = el;
62
+ onAttach?.(el);
63
+ } else if (ref.current) {
64
+ const { current: originalRef } = ref;
65
+ ref.current = el;
66
+ onDetach?.(originalRef);
67
+ }
68
+ },
69
+ [onAttach, onDetach]
70
+ );
71
+ return callbackRef;
72
+ };
73
+ const useTableScroll = ({
74
+ columns,
75
+ getRowAtPosition,
76
+ onHorizontalScroll,
77
+ onVerticalScroll,
78
+ onVerticalScrollInSitu,
79
+ rowHeight,
80
+ scrollingApiRef,
81
+ setRange,
82
+ viewportMeasurements
83
+ }) => {
84
+ const firstRowRef = react.useRef(0);
85
+ const rowHeightRef = react.useRef(rowHeight);
86
+ const contentContainerScrolledRef = react.useRef(false);
87
+ const contentContainerPosRef = react.useRef({
88
+ scrollTop: 0,
89
+ scrollLeft: 0
90
+ });
91
+ const scrollbarContainerScrolledRef = react.useRef(false);
92
+ const scrollbarContainerPosRef = react.useRef({
93
+ scrollTop: 0,
94
+ scrollLeft: 0
95
+ });
96
+ const scrollbarContainerRef = react.useRef(null);
97
+ const contentContainerRef = react.useRef(null);
98
+ const lastHorizontalScrollCheckPoint = react.useRef(0);
99
+ const {
100
+ appliedPageSize,
101
+ isVirtualScroll,
102
+ rowCount: viewportRowCount,
103
+ totalHeaderHeight,
104
+ viewportWidth
105
+ } = viewportMeasurements;
106
+ const columnsWithinViewportRef = react.useRef([]);
107
+ const [, forceRefresh] = react.useState({});
108
+ const preSpanRef = react.useRef(0);
109
+ react.useMemo(() => {
110
+ const [visibleColumns, offset] = vuuUtils.getColumnsInViewport(
111
+ columns,
112
+ contentContainerPosRef.current.scrollLeft,
113
+ contentContainerPosRef.current.scrollLeft + viewportWidth + HORIZONTAL_SCROLL_BUFFER
114
+ );
115
+ preSpanRef.current = offset;
116
+ columnsWithinViewportRef.current = visibleColumns;
117
+ }, [viewportWidth, columns]);
118
+ const handleHorizontalScroll = react.useCallback(
119
+ (scrollLeft) => {
120
+ contentContainerPosRef.current.scrollLeft = scrollLeft;
121
+ onHorizontalScroll?.(scrollLeft);
122
+ if (Math.abs(scrollLeft - lastHorizontalScrollCheckPoint.current) > SCROLL_MOVE_CHECK_THRESHOLD) {
123
+ lastHorizontalScrollCheckPoint.current = scrollLeft;
124
+ const [visibleColumns, pre] = vuuUtils.getColumnsInViewport(
125
+ columns,
126
+ scrollLeft,
127
+ scrollLeft + viewportWidth + HORIZONTAL_SCROLL_BUFFER
128
+ );
129
+ if (vuuUtils.itemsChanged(columnsWithinViewportRef.current, visibleColumns)) {
130
+ preSpanRef.current = pre;
131
+ columnsWithinViewportRef.current = visibleColumns;
132
+ forceRefresh({});
133
+ }
134
+ }
135
+ },
136
+ [columns, onHorizontalScroll, viewportWidth]
137
+ );
138
+ const handleVerticalScroll = react.useCallback(
139
+ (scrollTop, pctScrollTop) => {
140
+ contentContainerPosRef.current.scrollTop = scrollTop;
141
+ onVerticalScroll?.(scrollTop, pctScrollTop);
142
+ const firstRow = getRowAtPosition(scrollTop);
143
+ if (firstRow !== firstRowRef.current) {
144
+ firstRowRef.current = firstRow;
145
+ setRange({ from: firstRow, to: firstRow + viewportRowCount });
146
+ }
147
+ onVerticalScrollInSitu?.(0);
148
+ },
149
+ [
150
+ getRowAtPosition,
151
+ onVerticalScroll,
152
+ onVerticalScrollInSitu,
153
+ setRange,
154
+ viewportRowCount
155
+ ]
156
+ );
157
+ const handleScrollbarContainerScroll = react.useCallback(() => {
158
+ const { current: contentContainer } = contentContainerRef;
159
+ const { current: scrollbarContainer } = scrollbarContainerRef;
160
+ const { current: contentContainerScrolled } = contentContainerScrolledRef;
161
+ const { current: scrollPos } = scrollbarContainerPosRef;
162
+ if (contentContainerScrolled) {
163
+ contentContainerScrolledRef.current = false;
164
+ } else if (contentContainer && scrollbarContainer) {
165
+ scrollbarContainerScrolledRef.current = true;
166
+ const [scrollLeft, pctScrollLeft, , scrollTop, pctScrollTop] = getPctScroll(scrollbarContainer, scrollPos);
167
+ scrollPos.scrollLeft = scrollLeft;
168
+ scrollPos.scrollTop = scrollTop;
169
+ const [maxScrollLeft, maxScrollTop] = getMaxScroll(scrollbarContainer);
170
+ const contentScrollLeft = Math.round(pctScrollLeft * maxScrollLeft);
171
+ const contentScrollTop = pctScrollTop * maxScrollTop;
172
+ contentContainer.scrollTo({
173
+ left: contentScrollLeft,
174
+ top: contentScrollTop,
175
+ behavior: "auto"
176
+ });
177
+ }
178
+ onVerticalScrollInSitu?.(0);
179
+ }, [onVerticalScrollInSitu]);
180
+ const handleContentContainerScroll = react.useCallback(() => {
181
+ const { current: scrollbarContainerScrolled } = scrollbarContainerScrolledRef;
182
+ const { current: contentContainer } = contentContainerRef;
183
+ const { current: scrollbarContainer } = scrollbarContainerRef;
184
+ const { current: scrollPos } = contentContainerPosRef;
185
+ if (contentContainer && scrollbarContainer) {
186
+ const [
187
+ scrollLeft,
188
+ pctScrollLeft,
189
+ maxScrollLeft,
190
+ scrollTop,
191
+ pctScrollTop,
192
+ maxScrollTop
193
+ ] = getPctScroll(contentContainer);
194
+ contentContainerScrolledRef.current = true;
195
+ if (scrollbarContainerScrolled) {
196
+ scrollbarContainerScrolledRef.current = false;
197
+ } else {
198
+ scrollbarContainer.scrollLeft = Math.round(
199
+ pctScrollLeft * maxScrollLeft
200
+ );
201
+ scrollbarContainer.scrollTop = pctScrollTop * maxScrollTop;
202
+ }
203
+ if (scrollPos.scrollTop !== scrollTop) {
204
+ handleVerticalScroll(scrollTop, pctScrollTop);
205
+ }
206
+ if (scrollPos.scrollLeft !== scrollLeft) {
207
+ handleHorizontalScroll(scrollLeft);
208
+ }
209
+ }
210
+ }, [handleVerticalScroll, handleHorizontalScroll]);
211
+ const handleAttachScrollbarContainer = react.useCallback(
212
+ (el) => {
213
+ scrollbarContainerRef.current = el;
214
+ el.addEventListener("scroll", handleScrollbarContainerScroll, {
215
+ passive: true
216
+ });
217
+ },
218
+ [handleScrollbarContainerScroll]
219
+ );
220
+ const handleDetachScrollbarContainer = react.useCallback(
221
+ (el) => {
222
+ scrollbarContainerRef.current = null;
223
+ el.removeEventListener("scroll", handleScrollbarContainerScroll);
224
+ },
225
+ [handleScrollbarContainerScroll]
226
+ );
227
+ const handleAttachContentContainer = react.useCallback(
228
+ (el) => {
229
+ contentContainerRef.current = el;
230
+ el.addEventListener("scroll", handleContentContainerScroll, {
231
+ passive: true
232
+ });
233
+ },
234
+ [handleContentContainerScroll]
235
+ );
236
+ const handleDetachContentContainer = react.useCallback(
237
+ (el) => {
238
+ contentContainerRef.current = null;
239
+ el.removeEventListener("scroll", handleContentContainerScroll);
240
+ },
241
+ [handleContentContainerScroll]
242
+ );
243
+ const contentContainerCallbackRef = useCallbackRef({
244
+ onAttach: handleAttachContentContainer,
245
+ onDetach: handleDetachContentContainer
246
+ });
247
+ const scrollbarContainerCallbackRef = useCallbackRef({
248
+ onAttach: handleAttachScrollbarContainer,
249
+ onDetach: handleDetachScrollbarContainer
250
+ });
251
+ const requestScroll = react.useCallback(
252
+ (scrollRequest) => {
253
+ const { current: contentContainer } = contentContainerRef;
254
+ if (contentContainer) {
255
+ const [maxScrollLeft, maxScrollTop] = getMaxScroll(contentContainer);
256
+ const { scrollLeft, scrollTop } = contentContainer;
257
+ contentContainerScrolledRef.current = false;
258
+ if (scrollRequest.type === "scroll-row") {
259
+ const activeRow = vuuUtils.getRowElementAtIndex(
260
+ contentContainer,
261
+ scrollRequest.rowIndex
262
+ );
263
+ if (activeRow !== null) {
264
+ const [direction, distance] = tableDomUtils.howFarIsRowOutsideViewport(
265
+ activeRow,
266
+ totalHeaderHeight
267
+ );
268
+ console.log(`outside viewport ? ${direction} ${distance}`);
269
+ if (direction && distance) {
270
+ if (isVirtualScroll) {
271
+ const offset = direction === "down" ? 1 : -1;
272
+ onVerticalScrollInSitu?.(offset);
273
+ const firstRow = firstRowRef.current + offset;
274
+ firstRowRef.current = firstRow;
275
+ setRange({
276
+ from: firstRow,
277
+ to: firstRow + viewportRowCount
278
+ });
279
+ } else {
280
+ let newScrollLeft = scrollLeft;
281
+ let newScrollTop = scrollTop;
282
+ if (direction === "up" || direction === "down") {
283
+ newScrollTop = Math.min(
284
+ Math.max(0, scrollTop + distance),
285
+ maxScrollTop
286
+ );
287
+ } else {
288
+ newScrollLeft = Math.min(
289
+ Math.max(0, scrollLeft + distance),
290
+ maxScrollLeft
291
+ );
292
+ }
293
+ contentContainer.scrollTo({
294
+ top: newScrollTop,
295
+ left: newScrollLeft,
296
+ behavior: "smooth"
297
+ });
298
+ }
299
+ }
300
+ }
301
+ } else if (scrollRequest.type === "scroll-page") {
302
+ const { direction } = scrollRequest;
303
+ if (isVirtualScroll) {
304
+ const offset = direction === "down" ? viewportRowCount : -viewportRowCount;
305
+ onVerticalScrollInSitu?.(offset);
306
+ const firstRow = firstRowRef.current + offset;
307
+ firstRowRef.current = firstRow;
308
+ setRange({ from: firstRow, to: firstRow + viewportRowCount });
309
+ } else {
310
+ const scrollBy = direction === "down" ? appliedPageSize : -appliedPageSize;
311
+ const newScrollTop = Math.min(
312
+ Math.max(0, scrollTop + scrollBy),
313
+ maxScrollTop
314
+ );
315
+ contentContainer.scrollTo({
316
+ top: newScrollTop,
317
+ left: scrollLeft,
318
+ behavior: "auto"
319
+ });
320
+ }
321
+ } else if (scrollRequest.type === "scroll-end") {
322
+ const { direction } = scrollRequest;
323
+ const scrollTo = direction === "end" ? maxScrollTop : 0;
324
+ contentContainer.scrollTo({
325
+ top: scrollTo,
326
+ left: contentContainer.scrollLeft,
327
+ behavior: "auto"
328
+ });
329
+ }
330
+ }
331
+ },
332
+ [
333
+ appliedPageSize,
334
+ isVirtualScroll,
335
+ onVerticalScrollInSitu,
336
+ setRange,
337
+ totalHeaderHeight,
338
+ viewportRowCount
339
+ ]
340
+ );
341
+ const scrollHandles = react.useMemo(
342
+ // TODO not complete yet
343
+ () => ({
344
+ scrollToIndex: (rowIndex) => {
345
+ if (scrollbarContainerRef.current) {
346
+ const scrollPos = (rowIndex - 30) * 20;
347
+ scrollbarContainerRef.current.scrollTop = scrollPos;
348
+ }
349
+ },
350
+ scrollToKey: (rowKey) => {
351
+ console.log(`scrollToKey ${rowKey}`);
352
+ }
353
+ }),
354
+ []
355
+ );
356
+ react.useImperativeHandle(
357
+ scrollingApiRef,
358
+ () => {
359
+ if (scrollbarContainerRef.current) {
360
+ return scrollHandles;
361
+ } else {
362
+ return noScrolling;
363
+ }
364
+ },
365
+ [scrollHandles]
366
+ );
367
+ react.useEffect(() => {
368
+ if (rowHeight !== rowHeightRef.current) {
369
+ rowHeightRef.current = rowHeight;
370
+ if (contentContainerPosRef.current.scrollTop > 0) {
371
+ if (contentContainerRef.current) {
372
+ contentContainerRef.current.scrollTop = 0;
373
+ }
374
+ }
375
+ } else {
376
+ const { current: from } = firstRowRef;
377
+ const rowRange = { from, to: from + viewportRowCount };
378
+ setRange(rowRange);
379
+ }
380
+ }, [rowHeight, setRange, viewportRowCount]);
381
+ return {
382
+ columnsWithinViewport: columnsWithinViewportRef.current,
383
+ /** Ref to be assigned to ScrollbarContainer */
384
+ scrollbarContainerRef: scrollbarContainerCallbackRef,
385
+ /** Ref to be assigned to ContentContainer */
386
+ contentContainerRef: contentContainerCallbackRef,
387
+ /** Scroll the table */
388
+ requestScroll,
389
+ /** number of leading columns not rendered because of virtualization */
390
+ virtualColSpan: preSpanRef.current
391
+ };
392
+ };
393
+
394
+ exports.noScrolling = noScrolling;
395
+ exports.useTableScroll = useTableScroll;
396
+ //# sourceMappingURL=useTableScroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableScroll.js","sources":["../src/useTableScroll.ts"],"sourcesContent":["import {\n getColumnsInViewport,\n getRowElementAtIndex,\n itemsChanged,\n RowAtPositionFunc,\n} from \"@vuu-ui/vuu-utils\";\nimport type { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n ForwardedRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ViewportMeasurements } from \"./useTableViewport\";\nimport { howFarIsRowOutsideViewport } from \"./table-dom-utils\";\nimport type { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport type ScrollDirectionVertical = \"up\" | \"down\";\nexport type ScrollDirectionHorizontal = \"left\" | \"right\";\nexport type ScrollDirection =\n | ScrollDirectionVertical\n | ScrollDirectionHorizontal;\n\n/**\n * scroll into view the row at given index posiiton.\n */\nexport interface ScrollRequestRow {\n rowIndex: number;\n type: \"scroll-row\";\n}\nexport interface ScrollRequestEnd {\n type: \"scroll-end\";\n direction: \"home\" | \"end\";\n}\n\nexport interface ScrollRequestPage {\n type: \"scroll-page\";\n direction: ScrollDirectionVertical;\n}\n\nexport type ScrollRequest =\n | ScrollRequestPage\n | ScrollRequestEnd\n | ScrollRequestRow;\n\nexport type ScrollRequestHandler = (request: ScrollRequest) => void;\n\nexport interface ScrollingAPI {\n scrollToIndex: (itemIndex: number) => void;\n scrollToKey: (rowKey: string) => void;\n}\n\n/** How far we allow horizontal scroll movement before we recheck the rendered columns */\nconst SCROLL_MOVE_CHECK_THRESHOLD = 100;\n\n/** The buffer size in pixels that we allow for rendering columns just outside the viewport */\nconst HORIZONTAL_SCROLL_BUFFER = 200;\n\n/**\n * Return the maximum scroll positions for gioven container\n * @param container\n * @returns [maxScrollLeft, maxScrollTop]\n */\nconst getMaxScroll = (container: HTMLElement) => {\n const { clientHeight, clientWidth, scrollHeight, scrollWidth } = container;\n return [scrollWidth - clientWidth, scrollHeight - clientHeight];\n};\n\nconst getScrollDirection = (\n prevScrollPositions: ScrollPos | undefined,\n scrollPos: number\n) => {\n if (prevScrollPositions === undefined) {\n return undefined;\n } else {\n const { scrollTop: prevTop } = prevScrollPositions;\n return scrollPos > prevTop ? \"fwd\" : \"bwd\";\n }\n};\n\nconst getPctScroll = (container: HTMLElement, currentScrollPos?: ScrollPos) => {\n const {\n clientHeight,\n clientWidth,\n scrollHeight,\n scrollLeft,\n scrollTop,\n scrollWidth,\n } = container;\n\n const maxScrollLeft = scrollWidth - clientWidth;\n const pctScrollLeft = scrollLeft / (scrollWidth - clientWidth);\n const maxScrollTop = scrollHeight - clientHeight;\n let pctScrollTop = scrollTop / (scrollHeight - clientHeight);\n\n const scrollDirection = getScrollDirection(currentScrollPos, scrollTop);\n\n if (scrollDirection === \"fwd\" && pctScrollTop > 0.99) {\n pctScrollTop = 1;\n } else if (scrollDirection === \"bwd\" && pctScrollTop < 0.02) {\n pctScrollTop = 0;\n }\n\n return [\n scrollLeft,\n pctScrollLeft,\n maxScrollLeft,\n scrollTop,\n pctScrollTop,\n maxScrollTop,\n ];\n};\n\nexport const noScrolling: ScrollingAPI = {\n scrollToIndex: () => undefined,\n scrollToKey: () => undefined,\n};\n\ninterface CallbackRefHookProps<T = HTMLElement> {\n onAttach?: (el: T) => void;\n onDetach: (el: T) => void;\n label?: string;\n}\n\nconst useCallbackRef = <T = HTMLElement>({\n onAttach,\n onDetach,\n}: CallbackRefHookProps<T>) => {\n const ref = useRef<T | null>(null);\n const callbackRef = useCallback(\n (el: T | null) => {\n if (el) {\n ref.current = el;\n onAttach?.(el);\n } else if (ref.current) {\n const { current: originalRef } = ref;\n ref.current = el;\n onDetach?.(originalRef);\n }\n },\n [onAttach, onDetach]\n );\n return callbackRef;\n};\n\ntype ScrollPos = {\n scrollLeft: number;\n scrollTop: number;\n};\n\nexport interface TableScrollHookProps {\n columns: RuntimeColumnDescriptor[];\n getRowAtPosition: RowAtPositionFunc;\n onHorizontalScroll?: (scrollLeft: number) => void;\n onVerticalScroll?: (scrollTop: number, pctScrollTop: number) => void;\n /**\n * When we have a virtualized scroll container, keyboard navigation is\n * performed `in situ`. We shift the range of rows rendered within the\n * viewport, whithout actually moving the scroll position\n */\n onVerticalScrollInSitu?: (rowIndexOffsetCount: number) => void;\n rowHeight: number;\n scrollingApiRef?: ForwardedRef<ScrollingAPI>;\n setRange: (range: VuuRange) => void;\n viewportMeasurements: ViewportMeasurements;\n}\n\nexport const useTableScroll = ({\n columns,\n getRowAtPosition,\n onHorizontalScroll,\n onVerticalScroll,\n onVerticalScrollInSitu,\n rowHeight,\n scrollingApiRef,\n setRange,\n viewportMeasurements,\n}: TableScrollHookProps) => {\n const firstRowRef = useRef<number>(0);\n const rowHeightRef = useRef(rowHeight);\n const contentContainerScrolledRef = useRef(false);\n const contentContainerPosRef = useRef<ScrollPos>({\n scrollTop: 0,\n scrollLeft: 0,\n });\n const scrollbarContainerScrolledRef = useRef(false);\n const scrollbarContainerPosRef = useRef<ScrollPos>({\n scrollTop: 0,\n scrollLeft: 0,\n });\n const scrollbarContainerRef = useRef<HTMLDivElement | null>(null);\n const contentContainerRef = useRef<HTMLDivElement | null>(null);\n const lastHorizontalScrollCheckPoint = useRef(0);\n\n const {\n appliedPageSize,\n isVirtualScroll,\n rowCount: viewportRowCount,\n totalHeaderHeight,\n viewportWidth,\n } = viewportMeasurements;\n\n const columnsWithinViewportRef = useRef<RuntimeColumnDescriptor[]>([]);\n const [, forceRefresh] = useState({});\n\n const preSpanRef = useRef(0);\n\n useMemo(() => {\n const [visibleColumns, offset] = getColumnsInViewport(\n columns,\n contentContainerPosRef.current.scrollLeft,\n contentContainerPosRef.current.scrollLeft +\n viewportWidth +\n HORIZONTAL_SCROLL_BUFFER\n );\n preSpanRef.current = offset;\n columnsWithinViewportRef.current = visibleColumns;\n }, [viewportWidth, columns]);\n\n const handleHorizontalScroll = useCallback(\n (scrollLeft: number) => {\n contentContainerPosRef.current.scrollLeft = scrollLeft;\n onHorizontalScroll?.(scrollLeft);\n\n if (\n Math.abs(scrollLeft - lastHorizontalScrollCheckPoint.current) >\n SCROLL_MOVE_CHECK_THRESHOLD\n ) {\n lastHorizontalScrollCheckPoint.current = scrollLeft;\n\n const [visibleColumns, pre] = getColumnsInViewport(\n columns,\n scrollLeft,\n scrollLeft + viewportWidth + HORIZONTAL_SCROLL_BUFFER\n );\n\n if (itemsChanged(columnsWithinViewportRef.current, visibleColumns)) {\n preSpanRef.current = pre;\n columnsWithinViewportRef.current = visibleColumns;\n forceRefresh({});\n }\n }\n },\n [columns, onHorizontalScroll, viewportWidth]\n );\n const handleVerticalScroll = useCallback(\n (scrollTop: number, pctScrollTop: number) => {\n contentContainerPosRef.current.scrollTop = scrollTop;\n\n onVerticalScroll?.(scrollTop, pctScrollTop);\n const firstRow = getRowAtPosition(scrollTop);\n if (firstRow !== firstRowRef.current) {\n firstRowRef.current = firstRow;\n setRange({ from: firstRow, to: firstRow + viewportRowCount });\n }\n onVerticalScrollInSitu?.(0);\n },\n [\n getRowAtPosition,\n onVerticalScroll,\n onVerticalScrollInSitu,\n setRange,\n viewportRowCount,\n ]\n );\n\n const handleScrollbarContainerScroll = useCallback(() => {\n const { current: contentContainer } = contentContainerRef;\n const { current: scrollbarContainer } = scrollbarContainerRef;\n const { current: contentContainerScrolled } = contentContainerScrolledRef;\n const { current: scrollPos } = scrollbarContainerPosRef;\n\n if (contentContainerScrolled) {\n contentContainerScrolledRef.current = false;\n } else if (contentContainer && scrollbarContainer) {\n scrollbarContainerScrolledRef.current = true;\n const [scrollLeft, pctScrollLeft, , scrollTop, pctScrollTop] =\n getPctScroll(scrollbarContainer, scrollPos);\n\n scrollPos.scrollLeft = scrollLeft;\n scrollPos.scrollTop = scrollTop;\n\n const [maxScrollLeft, maxScrollTop] = getMaxScroll(scrollbarContainer);\n const contentScrollLeft = Math.round(pctScrollLeft * maxScrollLeft);\n const contentScrollTop = pctScrollTop * maxScrollTop;\n\n contentContainer.scrollTo({\n left: contentScrollLeft,\n top: contentScrollTop,\n behavior: \"auto\",\n });\n }\n onVerticalScrollInSitu?.(0);\n }, [onVerticalScrollInSitu]);\n\n const handleContentContainerScroll = useCallback(() => {\n const { current: scrollbarContainerScrolled } =\n scrollbarContainerScrolledRef;\n const { current: contentContainer } = contentContainerRef;\n const { current: scrollbarContainer } = scrollbarContainerRef;\n const { current: scrollPos } = contentContainerPosRef;\n\n if (contentContainer && scrollbarContainer) {\n const [\n scrollLeft,\n pctScrollLeft,\n maxScrollLeft,\n scrollTop,\n pctScrollTop,\n maxScrollTop,\n ] = getPctScroll(contentContainer);\n\n contentContainerScrolledRef.current = true;\n\n if (scrollbarContainerScrolled) {\n scrollbarContainerScrolledRef.current = false;\n } else {\n scrollbarContainer.scrollLeft = Math.round(\n pctScrollLeft * maxScrollLeft\n );\n scrollbarContainer.scrollTop = pctScrollTop * maxScrollTop;\n }\n\n if (scrollPos.scrollTop !== scrollTop) {\n handleVerticalScroll(scrollTop, pctScrollTop);\n }\n if (scrollPos.scrollLeft !== scrollLeft) {\n handleHorizontalScroll(scrollLeft);\n }\n }\n }, [handleVerticalScroll, handleHorizontalScroll]);\n\n const handleAttachScrollbarContainer = useCallback(\n (el: HTMLDivElement) => {\n scrollbarContainerRef.current = el;\n el.addEventListener(\"scroll\", handleScrollbarContainerScroll, {\n passive: true,\n });\n },\n [handleScrollbarContainerScroll]\n );\n\n const handleDetachScrollbarContainer = useCallback(\n (el: HTMLDivElement) => {\n scrollbarContainerRef.current = null;\n el.removeEventListener(\"scroll\", handleScrollbarContainerScroll);\n },\n [handleScrollbarContainerScroll]\n );\n\n const handleAttachContentContainer = useCallback(\n (el: HTMLDivElement) => {\n contentContainerRef.current = el;\n el.addEventListener(\"scroll\", handleContentContainerScroll, {\n passive: true,\n });\n },\n [handleContentContainerScroll]\n );\n\n const handleDetachContentContainer = useCallback(\n (el: HTMLDivElement) => {\n contentContainerRef.current = null;\n el.removeEventListener(\"scroll\", handleContentContainerScroll);\n },\n [handleContentContainerScroll]\n );\n\n const contentContainerCallbackRef = useCallbackRef({\n onAttach: handleAttachContentContainer,\n onDetach: handleDetachContentContainer,\n });\n\n const scrollbarContainerCallbackRef = useCallbackRef({\n onAttach: handleAttachScrollbarContainer,\n onDetach: handleDetachScrollbarContainer,\n });\n\n const requestScroll: ScrollRequestHandler = useCallback(\n (scrollRequest) => {\n const { current: contentContainer } = contentContainerRef;\n if (contentContainer) {\n const [maxScrollLeft, maxScrollTop] = getMaxScroll(contentContainer);\n const { scrollLeft, scrollTop } = contentContainer;\n contentContainerScrolledRef.current = false;\n if (scrollRequest.type === \"scroll-row\") {\n const activeRow = getRowElementAtIndex(\n contentContainer,\n scrollRequest.rowIndex\n );\n\n if (activeRow !== null) {\n const [direction, distance] = howFarIsRowOutsideViewport(\n activeRow,\n totalHeaderHeight\n );\n console.log(`outside viewport ? ${direction} ${distance}`);\n if (direction && distance) {\n if (isVirtualScroll) {\n const offset = direction === \"down\" ? 1 : -1;\n onVerticalScrollInSitu?.(offset);\n const firstRow = firstRowRef.current + offset;\n firstRowRef.current = firstRow;\n setRange({\n from: firstRow,\n to: firstRow + viewportRowCount,\n });\n } else {\n let newScrollLeft = scrollLeft;\n let newScrollTop = scrollTop;\n if (direction === \"up\" || direction === \"down\") {\n newScrollTop = Math.min(\n Math.max(0, scrollTop + distance),\n maxScrollTop\n );\n } else {\n newScrollLeft = Math.min(\n Math.max(0, scrollLeft + distance),\n maxScrollLeft\n );\n }\n contentContainer.scrollTo({\n top: newScrollTop,\n left: newScrollLeft,\n behavior: \"smooth\",\n });\n }\n }\n }\n } else if (scrollRequest.type === \"scroll-page\") {\n const { direction } = scrollRequest;\n if (isVirtualScroll) {\n const offset =\n direction === \"down\" ? viewportRowCount : -viewportRowCount;\n onVerticalScrollInSitu?.(offset);\n const firstRow = firstRowRef.current + offset;\n firstRowRef.current = firstRow;\n setRange({ from: firstRow, to: firstRow + viewportRowCount });\n } else {\n const scrollBy =\n direction === \"down\" ? appliedPageSize : -appliedPageSize;\n const newScrollTop = Math.min(\n Math.max(0, scrollTop + scrollBy),\n maxScrollTop\n );\n contentContainer.scrollTo({\n top: newScrollTop,\n left: scrollLeft,\n behavior: \"auto\",\n });\n }\n } else if (scrollRequest.type === \"scroll-end\") {\n const { direction } = scrollRequest;\n const scrollTo = direction === \"end\" ? maxScrollTop : 0;\n contentContainer.scrollTo({\n top: scrollTo,\n left: contentContainer.scrollLeft,\n behavior: \"auto\",\n });\n }\n }\n },\n [\n appliedPageSize,\n isVirtualScroll,\n onVerticalScrollInSitu,\n setRange,\n totalHeaderHeight,\n viewportRowCount,\n ]\n );\n\n const scrollHandles: ScrollingAPI = useMemo(\n // TODO not complete yet\n () => ({\n scrollToIndex: (rowIndex: number) => {\n if (scrollbarContainerRef.current) {\n // TODO hardcoded rowHeight\n const scrollPos = (rowIndex - 30) * 20;\n scrollbarContainerRef.current.scrollTop = scrollPos;\n }\n },\n scrollToKey: (rowKey: string) => {\n console.log(`scrollToKey ${rowKey}`);\n },\n }),\n []\n );\n\n useImperativeHandle(\n scrollingApiRef,\n () => {\n if (scrollbarContainerRef.current) {\n return scrollHandles;\n } else {\n return noScrolling;\n }\n },\n [scrollHandles]\n );\n\n useEffect(() => {\n if (rowHeight !== rowHeightRef.current) {\n rowHeightRef.current = rowHeight;\n if (contentContainerPosRef.current.scrollTop > 0) {\n if (contentContainerRef.current) {\n contentContainerRef.current.scrollTop = 0;\n }\n }\n } else {\n const { current: from } = firstRowRef;\n const rowRange = { from, to: from + viewportRowCount };\n setRange(rowRange);\n }\n }, [rowHeight, setRange, viewportRowCount]);\n\n return {\n columnsWithinViewport: columnsWithinViewportRef.current,\n /** Ref to be assigned to ScrollbarContainer */\n scrollbarContainerRef: scrollbarContainerCallbackRef,\n /** Ref to be assigned to ContentContainer */\n contentContainerRef: contentContainerCallbackRef,\n /** Scroll the table */\n requestScroll,\n /** number of leading columns not rendered because of virtualization */\n virtualColSpan: preSpanRef.current,\n };\n};\n"],"names":["useRef","useCallback","useState","useMemo","getColumnsInViewport","itemsChanged","getRowElementAtIndex","howFarIsRowOutsideViewport","useImperativeHandle","useEffect"],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ 'use strict';
2
+
3
+ var vuuUtils = require('@vuu-ui/vuu-utils');
4
+ var react = require('react');
5
+
6
+ const MAX_PIXEL_HEIGHT = 1e7;
7
+ const UNMEASURED_VIEWPORT = {
8
+ appliedPageSize: 0,
9
+ contentHeight: 0,
10
+ contentWidth: 0,
11
+ getRowAtPosition: () => -1,
12
+ getRowOffset: () => -1,
13
+ horizontalScrollbarHeight: 0,
14
+ isVirtualScroll: false,
15
+ pinnedWidthLeft: 0,
16
+ pinnedWidthRight: 0,
17
+ rowCount: 0,
18
+ setInSituRowOffset: () => void 0,
19
+ setScrollTop: () => void 0,
20
+ totalHeaderHeight: 0,
21
+ verticalScrollbarWidth: 0,
22
+ viewportBodyHeight: 0,
23
+ viewportWidth: 0
24
+ };
25
+ const useTableViewport = ({
26
+ columns,
27
+ headerHeight,
28
+ headings,
29
+ rowCount,
30
+ rowHeight,
31
+ selectionEndSize = 4,
32
+ size
33
+ }) => {
34
+ const inSituRowOffsetRef = react.useRef(0);
35
+ const pctScrollTopRef = react.useRef(0);
36
+ const pixelContentHeight = Math.min(rowHeight * rowCount, MAX_PIXEL_HEIGHT);
37
+ const virtualContentHeight = rowCount * rowHeight;
38
+ const virtualisedExtent = virtualContentHeight - pixelContentHeight;
39
+ const { pinnedWidthLeft, pinnedWidthRight, unpinnedWidth } = react.useMemo(
40
+ () => vuuUtils.measurePinnedColumns(columns, selectionEndSize),
41
+ [columns, selectionEndSize]
42
+ );
43
+ const totalHeaderHeightRef = react.useRef(headerHeight);
44
+ react.useMemo(() => {
45
+ totalHeaderHeightRef.current = headerHeight * (1 + headings.length);
46
+ }, [headerHeight, headings.length]);
47
+ const [getRowOffset, getRowAtPosition, isVirtualScroll] = react.useMemo(() => {
48
+ if (virtualisedExtent) {
49
+ const [_getRowOffset, getRowAtPosition2, _isVirtual] = vuuUtils.virtualRowPositioning(rowHeight, virtualisedExtent, pctScrollTopRef);
50
+ const getOffset = (row) => {
51
+ return _getRowOffset(row, inSituRowOffsetRef.current);
52
+ };
53
+ return [getOffset, getRowAtPosition2, _isVirtual];
54
+ } else {
55
+ return vuuUtils.actualRowPositioning(rowHeight);
56
+ }
57
+ }, [virtualisedExtent, rowHeight]);
58
+ const setScrollTop = react.useCallback((_, scrollPct) => {
59
+ pctScrollTopRef.current = scrollPct;
60
+ }, []);
61
+ const setInSituRowOffset = react.useCallback((rowIndexOffset) => {
62
+ if (rowIndexOffset === 0) {
63
+ inSituRowOffsetRef.current = 0;
64
+ } else {
65
+ inSituRowOffsetRef.current = Math.max(
66
+ 0,
67
+ inSituRowOffsetRef.current + rowIndexOffset
68
+ );
69
+ }
70
+ }, []);
71
+ return react.useMemo(() => {
72
+ if (size) {
73
+ const { current: totalHeaderHeight } = totalHeaderHeightRef;
74
+ const scrollbarSize = 15;
75
+ const contentWidth = pinnedWidthLeft + unpinnedWidth + pinnedWidthRight;
76
+ const horizontalScrollbarHeight = contentWidth > size.width ? scrollbarSize : 0;
77
+ const visibleRows = (size.height - headerHeight) / rowHeight;
78
+ const count = Number.isInteger(visibleRows) ? visibleRows : Math.ceil(visibleRows);
79
+ const viewportBodyHeight = size.height - totalHeaderHeight;
80
+ const verticalScrollbarWidth = pixelContentHeight > viewportBodyHeight ? scrollbarSize : 0;
81
+ const appliedPageSize = count * rowHeight * (pixelContentHeight / virtualContentHeight);
82
+ const viewportWidth = size.width;
83
+ return {
84
+ appliedPageSize,
85
+ contentHeight: pixelContentHeight,
86
+ contentWidth,
87
+ getRowAtPosition,
88
+ getRowOffset,
89
+ isVirtualScroll,
90
+ horizontalScrollbarHeight,
91
+ pinnedWidthLeft,
92
+ pinnedWidthRight,
93
+ rowCount: count,
94
+ setInSituRowOffset,
95
+ setScrollTop,
96
+ totalHeaderHeight,
97
+ verticalScrollbarWidth,
98
+ viewportBodyHeight,
99
+ viewportWidth
100
+ };
101
+ } else {
102
+ return UNMEASURED_VIEWPORT;
103
+ }
104
+ }, [
105
+ getRowAtPosition,
106
+ getRowOffset,
107
+ headerHeight,
108
+ isVirtualScroll,
109
+ pinnedWidthLeft,
110
+ unpinnedWidth,
111
+ pinnedWidthRight,
112
+ pixelContentHeight,
113
+ rowHeight,
114
+ setInSituRowOffset,
115
+ setScrollTop,
116
+ size,
117
+ virtualContentHeight
118
+ ]);
119
+ };
120
+
121
+ exports.useTableViewport = useTableViewport;
122
+ //# sourceMappingURL=useTableViewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableViewport.js","sources":["../src/useTableViewport.ts"],"sourcesContent":["/**\n * This hook measures and calculates the values needed to manage layout\n * and virtualisation of the table. This includes measurements required\n * to support pinned columns.\n */\nimport {\n RuntimeColumnDescriptor,\n TableHeadings,\n} from \"@vuu-ui/vuu-table-types\";\nimport { MeasuredSize } from \"@vuu-ui/vuu-ui-controls\";\nimport {\n actualRowPositioning,\n measurePinnedColumns,\n RowAtPositionFunc,\n RowOffsetFunc,\n RowPositioning,\n virtualRowPositioning,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\nexport interface TableViewportHookProps {\n columns: RuntimeColumnDescriptor[];\n headerHeight: number;\n headings: TableHeadings;\n rowCount: number;\n rowHeight: number;\n /**\n * this is the solid left/right `border` rendered on the selection block\n */\n selectionEndSize?: number;\n size: MeasuredSize | undefined;\n}\n\nexport interface ViewportMeasurements {\n appliedPageSize: number;\n contentHeight: number;\n horizontalScrollbarHeight: number;\n isVirtualScroll: boolean;\n pinnedWidthLeft: number;\n pinnedWidthRight: number;\n rowCount: number;\n contentWidth: number;\n totalHeaderHeight: number;\n verticalScrollbarWidth: number;\n viewportBodyHeight: number;\n viewportWidth: number;\n}\n\nexport interface TableViewportHookResult extends ViewportMeasurements {\n getRowAtPosition: RowAtPositionFunc;\n getRowOffset: RowOffsetFunc;\n setInSituRowOffset: (rowIndexOffset: number) => void;\n setScrollTop: (scrollTop: number, scrollPct: number) => void;\n}\n\n// Too simplistic, it depends on rowHeight\nconst MAX_PIXEL_HEIGHT = 10_000_000;\n\nconst UNMEASURED_VIEWPORT: TableViewportHookResult = {\n appliedPageSize: 0,\n contentHeight: 0,\n contentWidth: 0,\n getRowAtPosition: () => -1,\n getRowOffset: () => -1,\n horizontalScrollbarHeight: 0,\n isVirtualScroll: false,\n pinnedWidthLeft: 0,\n pinnedWidthRight: 0,\n rowCount: 0,\n setInSituRowOffset: () => undefined,\n setScrollTop: () => undefined,\n totalHeaderHeight: 0,\n verticalScrollbarWidth: 0,\n viewportBodyHeight: 0,\n viewportWidth: 0,\n};\n\nexport const useTableViewport = ({\n columns,\n headerHeight,\n headings,\n rowCount,\n rowHeight,\n selectionEndSize = 4,\n size,\n}: TableViewportHookProps): TableViewportHookResult => {\n const inSituRowOffsetRef = useRef(0);\n const pctScrollTopRef = useRef(0);\n // TODO we are limited by pixels not an arbitraty number of rows\n const pixelContentHeight = Math.min(rowHeight * rowCount, MAX_PIXEL_HEIGHT);\n const virtualContentHeight = rowCount * rowHeight;\n const virtualisedExtent = virtualContentHeight - pixelContentHeight;\n\n const { pinnedWidthLeft, pinnedWidthRight, unpinnedWidth } = useMemo(\n () => measurePinnedColumns(columns, selectionEndSize),\n [columns, selectionEndSize]\n );\n\n const totalHeaderHeightRef = useRef(headerHeight);\n useMemo(() => {\n totalHeaderHeightRef.current = headerHeight * (1 + headings.length);\n }, [headerHeight, headings.length]);\n\n const [getRowOffset, getRowAtPosition, isVirtualScroll] =\n useMemo<RowPositioning>(() => {\n if (virtualisedExtent) {\n const [_getRowOffset, getRowAtPosition, _isVirtual] =\n virtualRowPositioning(rowHeight, virtualisedExtent, pctScrollTopRef);\n const getOffset: RowOffsetFunc = (row) => {\n return _getRowOffset(row, inSituRowOffsetRef.current);\n };\n return [getOffset, getRowAtPosition, _isVirtual];\n } else {\n return actualRowPositioning(rowHeight);\n }\n }, [virtualisedExtent, rowHeight]);\n\n const setScrollTop = useCallback((_: number, scrollPct: number) => {\n pctScrollTopRef.current = scrollPct;\n }, []);\n\n /**\n * The inSituRowOffset is used to simulate scrolling through a very large dataset\n * without actually moving the scroll position. It is triggered by keyboard\n * navigation. A simulated scroll operation will always be of one or more rows.\n * A value of zero is a request to reset the offset.\n */\n const setInSituRowOffset = useCallback((rowIndexOffset: number) => {\n if (rowIndexOffset === 0) {\n inSituRowOffsetRef.current = 0;\n } else {\n inSituRowOffsetRef.current = Math.max(\n 0,\n inSituRowOffsetRef.current + rowIndexOffset\n );\n }\n }, []);\n\n return useMemo(() => {\n if (size) {\n const { current: totalHeaderHeight } = totalHeaderHeightRef;\n // TODO determine this at runtime\n const scrollbarSize = 15;\n const contentWidth = pinnedWidthLeft + unpinnedWidth + pinnedWidthRight;\n const horizontalScrollbarHeight =\n contentWidth > size.width ? scrollbarSize : 0;\n const visibleRows = (size.height - headerHeight) / rowHeight;\n const count = Number.isInteger(visibleRows)\n ? visibleRows\n : Math.ceil(visibleRows);\n const viewportBodyHeight = size.height - totalHeaderHeight;\n const verticalScrollbarWidth =\n pixelContentHeight > viewportBodyHeight ? scrollbarSize : 0;\n\n const appliedPageSize =\n count * rowHeight * (pixelContentHeight / virtualContentHeight);\n\n const viewportWidth = size.width;\n\n return {\n appliedPageSize,\n contentHeight: pixelContentHeight,\n contentWidth,\n getRowAtPosition,\n getRowOffset,\n isVirtualScroll,\n horizontalScrollbarHeight,\n pinnedWidthLeft,\n pinnedWidthRight,\n rowCount: count,\n setInSituRowOffset,\n setScrollTop,\n totalHeaderHeight,\n verticalScrollbarWidth,\n viewportBodyHeight,\n viewportWidth,\n };\n } else {\n return UNMEASURED_VIEWPORT;\n }\n }, [\n getRowAtPosition,\n getRowOffset,\n headerHeight,\n isVirtualScroll,\n pinnedWidthLeft,\n unpinnedWidth,\n pinnedWidthRight,\n pixelContentHeight,\n rowHeight,\n setInSituRowOffset,\n setScrollTop,\n size,\n virtualContentHeight,\n ]);\n};\n"],"names":["useRef","useMemo","measurePinnedColumns","getRowAtPosition","virtualRowPositioning","actualRowPositioning","useCallback"],"mappings":"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"}
package/esm/Row.css.js ADDED
@@ -0,0 +1,4 @@
1
+ var rowCss = ".vuuTableRow {\n background: var(--row-background,var(--table-background));\n color: var(--salt-content-secondary-foreground);\n border-bottom: 1px solid var(--row-borderColor, var(--table-background));\n box-sizing: border-box;\n height: var(--row-height);\n line-height: calc(var(--row-height) - 1px);\n position: absolute;\n top:0;\n white-space: nowrap;\n}\n \n.vuuTableRow-proxy {\n visibility: hidden;\n}\n\n.vuuTableRow-even {\n --row-background: var(--row-background-even);\n}\n\n.vuuTableRow-highlighted {\n background: var(--salt-selectable-background-hover);\n}\n\n\n.vuuTableRow-selected,\n.vuuTableRow-selectedEnd {\n /* --row-borderColor: var(--salt-separable-secondary-borderColor); */\n background-color: var(--salt-selectable-background-selected);\n}\n\n.vuuTableRow-selectedEnd {\n z-index: 1;\n}\n\n.vuuTableRow-selectedStart {\n --vuu-selection-decorator-left-radius: 5px 0 0 0;\n --vuu-selection-decorator-right-radius: 0 5px 0 0;\n\n border-radius: 5px 5px 0 0;\n}\n \n .vuuTableRow-selectedEnd {\n --vuu-selection-decorator-left-radius: 0 0 0 5px;\n --vuu-selection-decorator-right-radius: 0 0 5px 0;\n border-radius: 0 0 5px 5px;\n }\n \n .vuuTableRow-selectedStart.vuuTableRow-selectedEnd {\n --vuu-selection-decorator-left-radius: 5px 0 0 5px;\n --vuu-selection-decorator-right-radius: 0 5px 5px 0;\n border-radius: 5px 5px 5px 5px;\n \n }\n \n .vuuTableRow-selectedStart:after {\n content: '';\n position: absolute;\n top: -1px;\n left: 4px;\n height: 1px;\n background: var(--vuuTableRow-selectionBlock-borderColor);\n width: calc(var(--content-width) - 8px);\n z-index: 1;\n }\n \n .vuuTableRow-selectedEnd {\n border-bottom-color: var(--vuuTableRow-selectionBlock-borderColor, var(--row-borderColor));\n }\n \n .vuuTableRow-selectionDecorator {\n background: var(--table-background);\n display: inline-block;\n position: relative;\n height: var(--row-height);\n width: 4px;\n z-index: 2;\n }\n \n .vuuTableRow-selectionDecorator.vuuStickyLeft {\n left:0;\n position: sticky;\n }\n \n .vuuTableRow-selectionDecorator.vuuStickyRight {\n right:0;\n position: sticky;\n } \n \n .vuuTableRow-selectedStart .vuuTableRow-selectionDecorator:before,\n .vuuTableRow-selectedEnd .vuuTableRow-selectionDecorator:before {\n content: '';\n inset: -1px 0 0 0;\n position: absolute;\n background: var(--table-background);\n }\n \n .vuuTableRow-selectionDecorator.vuuStickyLeft:before {\n border-radius: var(--vuu-selection-decorator-left-radius, 0);\n }\n \n .vuuTableRow-selectionDecorator.vuuStickyRight:before {\n border-radius: var(--vuu-selection-decorator-right-radius, 0);\n }\n\n .vuuTableRow-expanded {\n --toggle-icon-transform: rotate(90deg);\n }\n \n.vuuDraggable .vuuTableRow {\n --cell-borderColor: transparent;\n --vuu-selection-decorator-bg: transparent;\n transform: none!important;\n z-index: 1;\n}";
2
+
3
+ export { rowCss as default };
4
+ //# sourceMappingURL=Row.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Row.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}