@vuu-ui/vuu-table 0.8.34 → 0.8.35

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 (180) hide show
  1. package/package.json +8 -10
  2. package/cjs/Row.css +0 -115
  3. package/cjs/Row.js +0 -115
  4. package/cjs/Row.js.map +0 -1
  5. package/cjs/Table.css +0 -151
  6. package/cjs/Table.js +0 -276
  7. package/cjs/Table.js.map +0 -1
  8. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css +0 -5
  9. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +0 -33
  10. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +0 -1
  11. package/cjs/cell-renderers/input-cell/InputCell.css +0 -31
  12. package/cjs/cell-renderers/input-cell/InputCell.js +0 -49
  13. package/cjs/cell-renderers/input-cell/InputCell.js.map +0 -1
  14. package/cjs/cell-renderers/toggle-cell/ToggleCell.css +0 -32
  15. package/cjs/cell-renderers/toggle-cell/ToggleCell.js +0 -59
  16. package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +0 -1
  17. package/cjs/column-header-pill/ColumnHeaderPill.css +0 -30
  18. package/cjs/column-header-pill/ColumnHeaderPill.js +0 -44
  19. package/cjs/column-header-pill/ColumnHeaderPill.js.map +0 -1
  20. package/cjs/column-header-pill/GroupColumnPill.css +0 -7
  21. package/cjs/column-header-pill/GroupColumnPill.js +0 -20
  22. package/cjs/column-header-pill/GroupColumnPill.js.map +0 -1
  23. package/cjs/column-header-pill/SortIndicator.css +0 -7
  24. package/cjs/column-header-pill/SortIndicator.js +0 -18
  25. package/cjs/column-header-pill/SortIndicator.js.map +0 -1
  26. package/cjs/column-menu/ColumnMenu.css +0 -21
  27. package/cjs/column-menu/ColumnMenu.js +0 -21
  28. package/cjs/column-menu/ColumnMenu.js.map +0 -1
  29. package/cjs/column-resizing/ColumnResizer.css +0 -28
  30. package/cjs/column-resizing/ColumnResizer.js +0 -63
  31. package/cjs/column-resizing/ColumnResizer.js.map +0 -1
  32. package/cjs/column-resizing/useTableColumnResize.js +0 -55
  33. package/cjs/column-resizing/useTableColumnResize.js.map +0 -1
  34. package/cjs/context-menu/buildContextMenuDescriptors.js +0 -214
  35. package/cjs/context-menu/buildContextMenuDescriptors.js.map +0 -1
  36. package/cjs/context-menu/useHandleTableContextMenu.js +0 -81
  37. package/cjs/context-menu/useHandleTableContextMenu.js.map +0 -1
  38. package/cjs/header-cell/GroupHeaderCell.css +0 -65
  39. package/cjs/header-cell/GroupHeaderCell.js +0 -108
  40. package/cjs/header-cell/GroupHeaderCell.js.map +0 -1
  41. package/cjs/header-cell/HeaderCell.css +0 -146
  42. package/cjs/header-cell/HeaderCell.js +0 -100
  43. package/cjs/header-cell/HeaderCell.js.map +0 -1
  44. package/cjs/index.js.map +0 -1
  45. package/cjs/moving-window.js +0 -61
  46. package/cjs/moving-window.js.map +0 -1
  47. package/cjs/table-cell/TableCell.css +0 -41
  48. package/cjs/table-cell/TableCell.js +0 -63
  49. package/cjs/table-cell/TableCell.js.map +0 -1
  50. package/cjs/table-cell/TableGroupCell.css +0 -26
  51. package/cjs/table-cell/TableGroupCell.js +0 -45
  52. package/cjs/table-cell/TableGroupCell.js.map +0 -1
  53. package/cjs/table-config.js +0 -25
  54. package/cjs/table-config.js.map +0 -1
  55. package/cjs/table-dom-utils.js +0 -60
  56. package/cjs/table-dom-utils.js.map +0 -1
  57. package/cjs/table-header/TableHeader.js +0 -87
  58. package/cjs/table-header/TableHeader.js.map +0 -1
  59. package/cjs/table-header/useTableHeader.js +0 -72
  60. package/cjs/table-header/useTableHeader.js.map +0 -1
  61. package/cjs/useCell.js +0 -28
  62. package/cjs/useCell.js.map +0 -1
  63. package/cjs/useCellEditing.js +0 -79
  64. package/cjs/useCellEditing.js.map +0 -1
  65. package/cjs/useControlledTableNavigation.js +0 -43
  66. package/cjs/useControlledTableNavigation.js.map +0 -1
  67. package/cjs/useDataSource.js +0 -104
  68. package/cjs/useDataSource.js.map +0 -1
  69. package/cjs/useInitialValue.js +0 -11
  70. package/cjs/useInitialValue.js.map +0 -1
  71. package/cjs/useKeyboardNavigation.js +0 -304
  72. package/cjs/useKeyboardNavigation.js.map +0 -1
  73. package/cjs/useRowClassNameGenerators.js +0 -34
  74. package/cjs/useRowClassNameGenerators.js.map +0 -1
  75. package/cjs/useRowHeight.js +0 -43
  76. package/cjs/useRowHeight.js.map +0 -1
  77. package/cjs/useSelection.js +0 -64
  78. package/cjs/useSelection.js.map +0 -1
  79. package/cjs/useTable.js +0 -553
  80. package/cjs/useTable.js.map +0 -1
  81. package/cjs/useTableAndColumnSettings.js +0 -128
  82. package/cjs/useTableAndColumnSettings.js.map +0 -1
  83. package/cjs/useTableContextMenu.js +0 -42
  84. package/cjs/useTableContextMenu.js.map +0 -1
  85. package/cjs/useTableModel.js +0 -297
  86. package/cjs/useTableModel.js.map +0 -1
  87. package/cjs/useTableScroll.js +0 -396
  88. package/cjs/useTableScroll.js.map +0 -1
  89. package/cjs/useTableViewport.js +0 -122
  90. package/cjs/useTableViewport.js.map +0 -1
  91. package/esm/Row.css +0 -115
  92. package/esm/Row.js +0 -112
  93. package/esm/Row.js.map +0 -1
  94. package/esm/Table.css +0 -151
  95. package/esm/Table.js +0 -274
  96. package/esm/Table.js.map +0 -1
  97. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css +0 -5
  98. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +0 -31
  99. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +0 -1
  100. package/esm/cell-renderers/input-cell/InputCell.css +0 -31
  101. package/esm/cell-renderers/input-cell/InputCell.js +0 -47
  102. package/esm/cell-renderers/input-cell/InputCell.js.map +0 -1
  103. package/esm/cell-renderers/toggle-cell/ToggleCell.css +0 -32
  104. package/esm/cell-renderers/toggle-cell/ToggleCell.js +0 -57
  105. package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +0 -1
  106. package/esm/column-header-pill/ColumnHeaderPill.css +0 -30
  107. package/esm/column-header-pill/ColumnHeaderPill.js +0 -42
  108. package/esm/column-header-pill/ColumnHeaderPill.js.map +0 -1
  109. package/esm/column-header-pill/GroupColumnPill.css +0 -7
  110. package/esm/column-header-pill/GroupColumnPill.js +0 -18
  111. package/esm/column-header-pill/GroupColumnPill.js.map +0 -1
  112. package/esm/column-header-pill/SortIndicator.css +0 -7
  113. package/esm/column-header-pill/SortIndicator.js +0 -16
  114. package/esm/column-header-pill/SortIndicator.js.map +0 -1
  115. package/esm/column-menu/ColumnMenu.css +0 -21
  116. package/esm/column-menu/ColumnMenu.js +0 -19
  117. package/esm/column-menu/ColumnMenu.js.map +0 -1
  118. package/esm/column-resizing/ColumnResizer.css +0 -28
  119. package/esm/column-resizing/ColumnResizer.js +0 -61
  120. package/esm/column-resizing/ColumnResizer.js.map +0 -1
  121. package/esm/column-resizing/useTableColumnResize.js +0 -53
  122. package/esm/column-resizing/useTableColumnResize.js.map +0 -1
  123. package/esm/context-menu/buildContextMenuDescriptors.js +0 -212
  124. package/esm/context-menu/buildContextMenuDescriptors.js.map +0 -1
  125. package/esm/context-menu/useHandleTableContextMenu.js +0 -79
  126. package/esm/context-menu/useHandleTableContextMenu.js.map +0 -1
  127. package/esm/header-cell/GroupHeaderCell.css +0 -65
  128. package/esm/header-cell/GroupHeaderCell.js +0 -106
  129. package/esm/header-cell/GroupHeaderCell.js.map +0 -1
  130. package/esm/header-cell/HeaderCell.css +0 -146
  131. package/esm/header-cell/HeaderCell.js +0 -98
  132. package/esm/header-cell/HeaderCell.js.map +0 -1
  133. package/esm/index.js +0 -14
  134. package/esm/index.js.map +0 -1
  135. package/esm/moving-window.js +0 -59
  136. package/esm/moving-window.js.map +0 -1
  137. package/esm/table-cell/TableCell.css +0 -41
  138. package/esm/table-cell/TableCell.js +0 -61
  139. package/esm/table-cell/TableCell.js.map +0 -1
  140. package/esm/table-cell/TableGroupCell.css +0 -26
  141. package/esm/table-cell/TableGroupCell.js +0 -43
  142. package/esm/table-cell/TableGroupCell.js.map +0 -1
  143. package/esm/table-config.js +0 -23
  144. package/esm/table-config.js.map +0 -1
  145. package/esm/table-dom-utils.js +0 -51
  146. package/esm/table-dom-utils.js.map +0 -1
  147. package/esm/table-header/TableHeader.js +0 -85
  148. package/esm/table-header/TableHeader.js.map +0 -1
  149. package/esm/table-header/useTableHeader.js +0 -70
  150. package/esm/table-header/useTableHeader.js.map +0 -1
  151. package/esm/useCell.js +0 -26
  152. package/esm/useCell.js.map +0 -1
  153. package/esm/useCellEditing.js +0 -77
  154. package/esm/useCellEditing.js.map +0 -1
  155. package/esm/useControlledTableNavigation.js +0 -41
  156. package/esm/useControlledTableNavigation.js.map +0 -1
  157. package/esm/useDataSource.js +0 -101
  158. package/esm/useDataSource.js.map +0 -1
  159. package/esm/useInitialValue.js +0 -9
  160. package/esm/useInitialValue.js.map +0 -1
  161. package/esm/useKeyboardNavigation.js +0 -300
  162. package/esm/useKeyboardNavigation.js.map +0 -1
  163. package/esm/useRowClassNameGenerators.js +0 -32
  164. package/esm/useRowClassNameGenerators.js.map +0 -1
  165. package/esm/useRowHeight.js +0 -41
  166. package/esm/useRowHeight.js.map +0 -1
  167. package/esm/useSelection.js +0 -62
  168. package/esm/useSelection.js.map +0 -1
  169. package/esm/useTable.js +0 -551
  170. package/esm/useTable.js.map +0 -1
  171. package/esm/useTableAndColumnSettings.js +0 -126
  172. package/esm/useTableAndColumnSettings.js.map +0 -1
  173. package/esm/useTableContextMenu.js +0 -40
  174. package/esm/useTableContextMenu.js.map +0 -1
  175. package/esm/useTableModel.js +0 -293
  176. package/esm/useTableModel.js.map +0 -1
  177. package/esm/useTableScroll.js +0 -393
  178. package/esm/useTableScroll.js.map +0 -1
  179. package/esm/useTableViewport.js +0 -120
  180. package/esm/useTableViewport.js.map +0 -1
@@ -1,393 +0,0 @@
1
- import { getColumnsInViewport, itemsChanged, getRowElementAtIndex } from '@vuu-ui/vuu-utils';
2
- import { useRef, useState, useMemo, useCallback, useImperativeHandle, useEffect } from 'react';
3
- import { howFarIsRowOutsideViewport } from './table-dom-utils.js';
4
-
5
- const SCROLL_MOVE_CHECK_THRESHOLD = 100;
6
- const HORIZONTAL_SCROLL_BUFFER = 200;
7
- const getMaxScroll = (container) => {
8
- const { clientHeight, clientWidth, scrollHeight, scrollWidth } = container;
9
- return [scrollWidth - clientWidth, scrollHeight - clientHeight];
10
- };
11
- const getScrollDirection = (prevScrollPositions, scrollPos) => {
12
- if (prevScrollPositions === void 0) {
13
- return void 0;
14
- } else {
15
- const { scrollTop: prevTop } = prevScrollPositions;
16
- return scrollPos > prevTop ? "fwd" : "bwd";
17
- }
18
- };
19
- const getPctScroll = (container, currentScrollPos) => {
20
- const {
21
- clientHeight,
22
- clientWidth,
23
- scrollHeight,
24
- scrollLeft,
25
- scrollTop,
26
- scrollWidth
27
- } = container;
28
- const maxScrollLeft = scrollWidth - clientWidth;
29
- const pctScrollLeft = scrollLeft / (scrollWidth - clientWidth);
30
- const maxScrollTop = scrollHeight - clientHeight;
31
- let pctScrollTop = scrollTop / (scrollHeight - clientHeight);
32
- const scrollDirection = getScrollDirection(currentScrollPos, scrollTop);
33
- if (scrollDirection === "fwd" && pctScrollTop > 0.99) {
34
- pctScrollTop = 1;
35
- } else if (scrollDirection === "bwd" && pctScrollTop < 0.02) {
36
- pctScrollTop = 0;
37
- }
38
- return [
39
- scrollLeft,
40
- pctScrollLeft,
41
- maxScrollLeft,
42
- scrollTop,
43
- pctScrollTop,
44
- maxScrollTop
45
- ];
46
- };
47
- const noScrolling = {
48
- scrollToIndex: () => void 0,
49
- scrollToKey: () => void 0
50
- };
51
- const useCallbackRef = ({
52
- onAttach,
53
- onDetach
54
- }) => {
55
- const ref = useRef(null);
56
- const callbackRef = useCallback(
57
- (el) => {
58
- if (el) {
59
- ref.current = el;
60
- onAttach?.(el);
61
- } else if (ref.current) {
62
- const { current: originalRef } = ref;
63
- ref.current = el;
64
- onDetach?.(originalRef);
65
- }
66
- },
67
- [onAttach, onDetach]
68
- );
69
- return callbackRef;
70
- };
71
- const useTableScroll = ({
72
- columns,
73
- getRowAtPosition,
74
- onHorizontalScroll,
75
- onVerticalScroll,
76
- onVerticalScrollInSitu,
77
- rowHeight,
78
- scrollingApiRef,
79
- setRange,
80
- viewportMeasurements
81
- }) => {
82
- const firstRowRef = useRef(0);
83
- const rowHeightRef = useRef(rowHeight);
84
- const contentContainerScrolledRef = useRef(false);
85
- const contentContainerPosRef = useRef({
86
- scrollTop: 0,
87
- scrollLeft: 0
88
- });
89
- const scrollbarContainerScrolledRef = useRef(false);
90
- const scrollbarContainerPosRef = useRef({
91
- scrollTop: 0,
92
- scrollLeft: 0
93
- });
94
- const scrollbarContainerRef = useRef(null);
95
- const contentContainerRef = useRef(null);
96
- const lastHorizontalScrollCheckPoint = useRef(0);
97
- const {
98
- appliedPageSize,
99
- isVirtualScroll,
100
- rowCount: viewportRowCount,
101
- totalHeaderHeight,
102
- viewportWidth
103
- } = viewportMeasurements;
104
- const columnsWithinViewportRef = useRef([]);
105
- const [, forceRefresh] = useState({});
106
- const preSpanRef = useRef(0);
107
- useMemo(() => {
108
- const [visibleColumns, offset] = getColumnsInViewport(
109
- columns,
110
- contentContainerPosRef.current.scrollLeft,
111
- contentContainerPosRef.current.scrollLeft + viewportWidth + HORIZONTAL_SCROLL_BUFFER
112
- );
113
- preSpanRef.current = offset;
114
- columnsWithinViewportRef.current = visibleColumns;
115
- }, [viewportWidth, columns]);
116
- const handleHorizontalScroll = useCallback(
117
- (scrollLeft) => {
118
- contentContainerPosRef.current.scrollLeft = scrollLeft;
119
- onHorizontalScroll?.(scrollLeft);
120
- if (Math.abs(scrollLeft - lastHorizontalScrollCheckPoint.current) > SCROLL_MOVE_CHECK_THRESHOLD) {
121
- lastHorizontalScrollCheckPoint.current = scrollLeft;
122
- const [visibleColumns, pre] = getColumnsInViewport(
123
- columns,
124
- scrollLeft,
125
- scrollLeft + viewportWidth + HORIZONTAL_SCROLL_BUFFER
126
- );
127
- if (itemsChanged(columnsWithinViewportRef.current, visibleColumns)) {
128
- preSpanRef.current = pre;
129
- columnsWithinViewportRef.current = visibleColumns;
130
- forceRefresh({});
131
- }
132
- }
133
- },
134
- [columns, onHorizontalScroll, viewportWidth]
135
- );
136
- const handleVerticalScroll = useCallback(
137
- (scrollTop, pctScrollTop) => {
138
- contentContainerPosRef.current.scrollTop = scrollTop;
139
- onVerticalScroll?.(scrollTop, pctScrollTop);
140
- const firstRow = getRowAtPosition(scrollTop);
141
- if (firstRow !== firstRowRef.current) {
142
- firstRowRef.current = firstRow;
143
- setRange({ from: firstRow, to: firstRow + viewportRowCount });
144
- }
145
- onVerticalScrollInSitu?.(0);
146
- },
147
- [
148
- getRowAtPosition,
149
- onVerticalScroll,
150
- onVerticalScrollInSitu,
151
- setRange,
152
- viewportRowCount
153
- ]
154
- );
155
- const handleScrollbarContainerScroll = useCallback(() => {
156
- const { current: contentContainer } = contentContainerRef;
157
- const { current: scrollbarContainer } = scrollbarContainerRef;
158
- const { current: contentContainerScrolled } = contentContainerScrolledRef;
159
- const { current: scrollPos } = scrollbarContainerPosRef;
160
- if (contentContainerScrolled) {
161
- contentContainerScrolledRef.current = false;
162
- } else if (contentContainer && scrollbarContainer) {
163
- scrollbarContainerScrolledRef.current = true;
164
- const [scrollLeft, pctScrollLeft, , scrollTop, pctScrollTop] = getPctScroll(scrollbarContainer, scrollPos);
165
- scrollPos.scrollLeft = scrollLeft;
166
- scrollPos.scrollTop = scrollTop;
167
- const [maxScrollLeft, maxScrollTop] = getMaxScroll(scrollbarContainer);
168
- const contentScrollLeft = Math.round(pctScrollLeft * maxScrollLeft);
169
- const contentScrollTop = pctScrollTop * maxScrollTop;
170
- contentContainer.scrollTo({
171
- left: contentScrollLeft,
172
- top: contentScrollTop,
173
- behavior: "auto"
174
- });
175
- }
176
- onVerticalScrollInSitu?.(0);
177
- }, [onVerticalScrollInSitu]);
178
- const handleContentContainerScroll = useCallback(() => {
179
- const { current: scrollbarContainerScrolled } = scrollbarContainerScrolledRef;
180
- const { current: contentContainer } = contentContainerRef;
181
- const { current: scrollbarContainer } = scrollbarContainerRef;
182
- const { current: scrollPos } = contentContainerPosRef;
183
- if (contentContainer && scrollbarContainer) {
184
- const [
185
- scrollLeft,
186
- pctScrollLeft,
187
- maxScrollLeft,
188
- scrollTop,
189
- pctScrollTop,
190
- maxScrollTop
191
- ] = getPctScroll(contentContainer);
192
- contentContainerScrolledRef.current = true;
193
- if (scrollbarContainerScrolled) {
194
- scrollbarContainerScrolledRef.current = false;
195
- } else {
196
- scrollbarContainer.scrollLeft = Math.round(
197
- pctScrollLeft * maxScrollLeft
198
- );
199
- scrollbarContainer.scrollTop = pctScrollTop * maxScrollTop;
200
- }
201
- if (scrollPos.scrollTop !== scrollTop) {
202
- handleVerticalScroll(scrollTop, pctScrollTop);
203
- }
204
- if (scrollPos.scrollLeft !== scrollLeft) {
205
- handleHorizontalScroll(scrollLeft);
206
- }
207
- }
208
- }, [handleVerticalScroll, handleHorizontalScroll]);
209
- const handleAttachScrollbarContainer = useCallback(
210
- (el) => {
211
- scrollbarContainerRef.current = el;
212
- el.addEventListener("scroll", handleScrollbarContainerScroll, {
213
- passive: true
214
- });
215
- },
216
- [handleScrollbarContainerScroll]
217
- );
218
- const handleDetachScrollbarContainer = useCallback(
219
- (el) => {
220
- scrollbarContainerRef.current = null;
221
- el.removeEventListener("scroll", handleScrollbarContainerScroll);
222
- },
223
- [handleScrollbarContainerScroll]
224
- );
225
- const handleAttachContentContainer = useCallback(
226
- (el) => {
227
- contentContainerRef.current = el;
228
- el.addEventListener("scroll", handleContentContainerScroll, {
229
- passive: true
230
- });
231
- },
232
- [handleContentContainerScroll]
233
- );
234
- const handleDetachContentContainer = useCallback(
235
- (el) => {
236
- contentContainerRef.current = null;
237
- el.removeEventListener("scroll", handleContentContainerScroll);
238
- },
239
- [handleContentContainerScroll]
240
- );
241
- const contentContainerCallbackRef = useCallbackRef({
242
- onAttach: handleAttachContentContainer,
243
- onDetach: handleDetachContentContainer
244
- });
245
- const scrollbarContainerCallbackRef = useCallbackRef({
246
- onAttach: handleAttachScrollbarContainer,
247
- onDetach: handleDetachScrollbarContainer
248
- });
249
- const requestScroll = useCallback(
250
- (scrollRequest) => {
251
- const { current: contentContainer } = contentContainerRef;
252
- if (contentContainer) {
253
- const [maxScrollLeft, maxScrollTop] = getMaxScroll(contentContainer);
254
- const { scrollLeft, scrollTop } = contentContainer;
255
- contentContainerScrolledRef.current = false;
256
- if (scrollRequest.type === "scroll-row") {
257
- const activeRow = getRowElementAtIndex(
258
- contentContainer,
259
- scrollRequest.rowIndex
260
- );
261
- if (activeRow !== null) {
262
- const [direction, distance] = howFarIsRowOutsideViewport(
263
- activeRow,
264
- totalHeaderHeight
265
- );
266
- console.log(`outside viewport ? ${direction} ${distance}`);
267
- if (direction && distance) {
268
- if (isVirtualScroll) {
269
- const offset = direction === "down" ? 1 : -1;
270
- onVerticalScrollInSitu?.(offset);
271
- const firstRow = firstRowRef.current + offset;
272
- firstRowRef.current = firstRow;
273
- setRange({
274
- from: firstRow,
275
- to: firstRow + viewportRowCount
276
- });
277
- } else {
278
- let newScrollLeft = scrollLeft;
279
- let newScrollTop = scrollTop;
280
- if (direction === "up" || direction === "down") {
281
- newScrollTop = Math.min(
282
- Math.max(0, scrollTop + distance),
283
- maxScrollTop
284
- );
285
- } else {
286
- newScrollLeft = Math.min(
287
- Math.max(0, scrollLeft + distance),
288
- maxScrollLeft
289
- );
290
- }
291
- contentContainer.scrollTo({
292
- top: newScrollTop,
293
- left: newScrollLeft,
294
- behavior: "smooth"
295
- });
296
- }
297
- }
298
- }
299
- } else if (scrollRequest.type === "scroll-page") {
300
- const { direction } = scrollRequest;
301
- if (isVirtualScroll) {
302
- const offset = direction === "down" ? viewportRowCount : -viewportRowCount;
303
- onVerticalScrollInSitu?.(offset);
304
- const firstRow = firstRowRef.current + offset;
305
- firstRowRef.current = firstRow;
306
- setRange({ from: firstRow, to: firstRow + viewportRowCount });
307
- } else {
308
- const scrollBy = direction === "down" ? appliedPageSize : -appliedPageSize;
309
- const newScrollTop = Math.min(
310
- Math.max(0, scrollTop + scrollBy),
311
- maxScrollTop
312
- );
313
- contentContainer.scrollTo({
314
- top: newScrollTop,
315
- left: scrollLeft,
316
- behavior: "auto"
317
- });
318
- }
319
- } else if (scrollRequest.type === "scroll-end") {
320
- const { direction } = scrollRequest;
321
- const scrollTo = direction === "end" ? maxScrollTop : 0;
322
- contentContainer.scrollTo({
323
- top: scrollTo,
324
- left: contentContainer.scrollLeft,
325
- behavior: "auto"
326
- });
327
- }
328
- }
329
- },
330
- [
331
- appliedPageSize,
332
- isVirtualScroll,
333
- onVerticalScrollInSitu,
334
- setRange,
335
- totalHeaderHeight,
336
- viewportRowCount
337
- ]
338
- );
339
- const scrollHandles = useMemo(
340
- // TODO not complete yet
341
- () => ({
342
- scrollToIndex: (rowIndex) => {
343
- if (scrollbarContainerRef.current) {
344
- const scrollPos = (rowIndex - 30) * 20;
345
- scrollbarContainerRef.current.scrollTop = scrollPos;
346
- }
347
- },
348
- scrollToKey: (rowKey) => {
349
- console.log(`scrollToKey ${rowKey}`);
350
- }
351
- }),
352
- []
353
- );
354
- useImperativeHandle(
355
- scrollingApiRef,
356
- () => {
357
- if (scrollbarContainerRef.current) {
358
- return scrollHandles;
359
- } else {
360
- return noScrolling;
361
- }
362
- },
363
- [scrollHandles]
364
- );
365
- useEffect(() => {
366
- if (rowHeight !== rowHeightRef.current) {
367
- rowHeightRef.current = rowHeight;
368
- if (contentContainerPosRef.current.scrollTop > 0) {
369
- if (contentContainerRef.current) {
370
- contentContainerRef.current.scrollTop = 0;
371
- }
372
- }
373
- } else {
374
- const { current: from } = firstRowRef;
375
- const rowRange = { from, to: from + viewportRowCount };
376
- setRange(rowRange);
377
- }
378
- }, [rowHeight, setRange, viewportRowCount]);
379
- return {
380
- columnsWithinViewport: columnsWithinViewportRef.current,
381
- /** Ref to be assigned to ScrollbarContainer */
382
- scrollbarContainerRef: scrollbarContainerCallbackRef,
383
- /** Ref to be assigned to ContentContainer */
384
- contentContainerRef: contentContainerCallbackRef,
385
- /** Scroll the table */
386
- requestScroll,
387
- /** number of leading columns not rendered because of virtualization */
388
- virtualColSpan: preSpanRef.current
389
- };
390
- };
391
-
392
- export { noScrolling, useTableScroll };
393
- //# sourceMappingURL=useTableScroll.js.map
@@ -1 +0,0 @@
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":[],"mappings":"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"}
@@ -1,120 +0,0 @@
1
- import { measurePinnedColumns, virtualRowPositioning, actualRowPositioning } from '@vuu-ui/vuu-utils';
2
- import { useRef, useMemo, useCallback } from 'react';
3
-
4
- const MAX_PIXEL_HEIGHT = 1e7;
5
- const UNMEASURED_VIEWPORT = {
6
- appliedPageSize: 0,
7
- contentHeight: 0,
8
- contentWidth: 0,
9
- getRowAtPosition: () => -1,
10
- getRowOffset: () => -1,
11
- horizontalScrollbarHeight: 0,
12
- isVirtualScroll: false,
13
- pinnedWidthLeft: 0,
14
- pinnedWidthRight: 0,
15
- rowCount: 0,
16
- setInSituRowOffset: () => void 0,
17
- setScrollTop: () => void 0,
18
- totalHeaderHeight: 0,
19
- verticalScrollbarWidth: 0,
20
- viewportBodyHeight: 0,
21
- viewportWidth: 0
22
- };
23
- const useTableViewport = ({
24
- columns,
25
- headerHeight,
26
- headings,
27
- rowCount,
28
- rowHeight,
29
- selectionEndSize = 4,
30
- size
31
- }) => {
32
- const inSituRowOffsetRef = useRef(0);
33
- const pctScrollTopRef = useRef(0);
34
- const pixelContentHeight = Math.min(rowHeight * rowCount, MAX_PIXEL_HEIGHT);
35
- const virtualContentHeight = rowCount * rowHeight;
36
- const virtualisedExtent = virtualContentHeight - pixelContentHeight;
37
- const { pinnedWidthLeft, pinnedWidthRight, unpinnedWidth } = useMemo(
38
- () => measurePinnedColumns(columns, selectionEndSize),
39
- [columns, selectionEndSize]
40
- );
41
- const totalHeaderHeightRef = useRef(headerHeight);
42
- useMemo(() => {
43
- totalHeaderHeightRef.current = headerHeight * (1 + headings.length);
44
- }, [headerHeight, headings.length]);
45
- const [getRowOffset, getRowAtPosition, isVirtualScroll] = useMemo(() => {
46
- if (virtualisedExtent) {
47
- const [_getRowOffset, getRowAtPosition2, _isVirtual] = virtualRowPositioning(rowHeight, virtualisedExtent, pctScrollTopRef);
48
- const getOffset = (row) => {
49
- return _getRowOffset(row, inSituRowOffsetRef.current);
50
- };
51
- return [getOffset, getRowAtPosition2, _isVirtual];
52
- } else {
53
- return actualRowPositioning(rowHeight);
54
- }
55
- }, [virtualisedExtent, rowHeight]);
56
- const setScrollTop = useCallback((_, scrollPct) => {
57
- pctScrollTopRef.current = scrollPct;
58
- }, []);
59
- const setInSituRowOffset = useCallback((rowIndexOffset) => {
60
- if (rowIndexOffset === 0) {
61
- inSituRowOffsetRef.current = 0;
62
- } else {
63
- inSituRowOffsetRef.current = Math.max(
64
- 0,
65
- inSituRowOffsetRef.current + rowIndexOffset
66
- );
67
- }
68
- }, []);
69
- return useMemo(() => {
70
- if (size) {
71
- const { current: totalHeaderHeight } = totalHeaderHeightRef;
72
- const scrollbarSize = 15;
73
- const contentWidth = pinnedWidthLeft + unpinnedWidth + pinnedWidthRight;
74
- const horizontalScrollbarHeight = contentWidth > size.width ? scrollbarSize : 0;
75
- const visibleRows = (size.height - headerHeight) / rowHeight;
76
- const count = Number.isInteger(visibleRows) ? visibleRows : Math.ceil(visibleRows);
77
- const viewportBodyHeight = size.height - totalHeaderHeight;
78
- const verticalScrollbarWidth = pixelContentHeight > viewportBodyHeight ? scrollbarSize : 0;
79
- const appliedPageSize = count * rowHeight * (pixelContentHeight / virtualContentHeight);
80
- const viewportWidth = size.width;
81
- return {
82
- appliedPageSize,
83
- contentHeight: pixelContentHeight,
84
- contentWidth,
85
- getRowAtPosition,
86
- getRowOffset,
87
- isVirtualScroll,
88
- horizontalScrollbarHeight,
89
- pinnedWidthLeft,
90
- pinnedWidthRight,
91
- rowCount: count,
92
- setInSituRowOffset,
93
- setScrollTop,
94
- totalHeaderHeight,
95
- verticalScrollbarWidth,
96
- viewportBodyHeight,
97
- viewportWidth
98
- };
99
- } else {
100
- return UNMEASURED_VIEWPORT;
101
- }
102
- }, [
103
- getRowAtPosition,
104
- getRowOffset,
105
- headerHeight,
106
- isVirtualScroll,
107
- pinnedWidthLeft,
108
- unpinnedWidth,
109
- pinnedWidthRight,
110
- pixelContentHeight,
111
- rowHeight,
112
- setInSituRowOffset,
113
- setScrollTop,
114
- size,
115
- virtualContentHeight
116
- ]);
117
- };
118
-
119
- export { useTableViewport };
120
- //# sourceMappingURL=useTableViewport.js.map
@@ -1 +0,0 @@
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":["getRowAtPosition"],"mappings":"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"}