@vuu-ui/vuu-table 0.8.35 → 0.8.37

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 (223) hide show
  1. package/README.md +0 -0
  2. package/cjs/Row.css.js +6 -0
  3. package/cjs/Row.css.js.map +1 -0
  4. package/cjs/Row.js +124 -0
  5. package/cjs/Row.js.map +1 -0
  6. package/cjs/Table.css.js +6 -0
  7. package/cjs/Table.css.js.map +1 -0
  8. package/cjs/Table.js +285 -0
  9. package/cjs/Table.js.map +1 -0
  10. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js +6 -0
  11. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  12. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js +42 -0
  13. package/cjs/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -0
  14. package/cjs/cell-renderers/input-cell/InputCell.css.js +6 -0
  15. package/cjs/cell-renderers/input-cell/InputCell.css.js.map +1 -0
  16. package/cjs/cell-renderers/input-cell/InputCell.js +58 -0
  17. package/cjs/cell-renderers/input-cell/InputCell.js.map +1 -0
  18. package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js +6 -0
  19. package/cjs/cell-renderers/toggle-cell/ToggleCell.css.js.map +1 -0
  20. package/cjs/cell-renderers/toggle-cell/ToggleCell.js +68 -0
  21. package/cjs/cell-renderers/toggle-cell/ToggleCell.js.map +1 -0
  22. package/cjs/column-header-pill/ColumnHeaderPill.css.js +6 -0
  23. package/cjs/column-header-pill/ColumnHeaderPill.css.js.map +1 -0
  24. package/cjs/column-header-pill/ColumnHeaderPill.js +53 -0
  25. package/cjs/column-header-pill/ColumnHeaderPill.js.map +1 -0
  26. package/cjs/column-header-pill/GroupColumnPill.css.js +6 -0
  27. package/cjs/column-header-pill/GroupColumnPill.css.js.map +1 -0
  28. package/cjs/column-header-pill/GroupColumnPill.js +29 -0
  29. package/cjs/column-header-pill/GroupColumnPill.js.map +1 -0
  30. package/cjs/column-header-pill/SortIndicator.css.js +6 -0
  31. package/cjs/column-header-pill/SortIndicator.css.js.map +1 -0
  32. package/cjs/column-header-pill/SortIndicator.js +27 -0
  33. package/cjs/column-header-pill/SortIndicator.js.map +1 -0
  34. package/cjs/column-menu/ColumnMenu.css.js +6 -0
  35. package/cjs/column-menu/ColumnMenu.css.js.map +1 -0
  36. package/cjs/column-menu/ColumnMenu.js +30 -0
  37. package/cjs/column-menu/ColumnMenu.js.map +1 -0
  38. package/cjs/column-resizing/ColumnResizer.css.js +6 -0
  39. package/cjs/column-resizing/ColumnResizer.css.js.map +1 -0
  40. package/cjs/column-resizing/ColumnResizer.js +72 -0
  41. package/cjs/column-resizing/ColumnResizer.js.map +1 -0
  42. package/cjs/column-resizing/useTableColumnResize.js +55 -0
  43. package/cjs/column-resizing/useTableColumnResize.js.map +1 -0
  44. package/cjs/context-menu/buildContextMenuDescriptors.js +214 -0
  45. package/cjs/context-menu/buildContextMenuDescriptors.js.map +1 -0
  46. package/cjs/context-menu/useHandleTableContextMenu.js +81 -0
  47. package/cjs/context-menu/useHandleTableContextMenu.js.map +1 -0
  48. package/cjs/header-cell/GroupHeaderCell.css.js +6 -0
  49. package/cjs/header-cell/GroupHeaderCell.css.js.map +1 -0
  50. package/cjs/header-cell/GroupHeaderCell.js +117 -0
  51. package/cjs/header-cell/GroupHeaderCell.js.map +1 -0
  52. package/cjs/header-cell/HeaderCell.css.js +6 -0
  53. package/cjs/header-cell/HeaderCell.css.js.map +1 -0
  54. package/cjs/header-cell/HeaderCell.js +109 -0
  55. package/cjs/header-cell/HeaderCell.js.map +1 -0
  56. package/cjs/index.js.map +1 -0
  57. package/cjs/moving-window.js +61 -0
  58. package/cjs/moving-window.js.map +1 -0
  59. package/cjs/table-cell/TableCell.css.js +6 -0
  60. package/cjs/table-cell/TableCell.css.js.map +1 -0
  61. package/cjs/table-cell/TableCell.js +72 -0
  62. package/cjs/table-cell/TableCell.js.map +1 -0
  63. package/cjs/table-cell/TableGroupCell.css.js +6 -0
  64. package/cjs/table-cell/TableGroupCell.css.js.map +1 -0
  65. package/cjs/table-cell/TableGroupCell.js +54 -0
  66. package/cjs/table-cell/TableGroupCell.js.map +1 -0
  67. package/cjs/table-config.js +25 -0
  68. package/cjs/table-config.js.map +1 -0
  69. package/cjs/table-dom-utils.js +60 -0
  70. package/cjs/table-dom-utils.js.map +1 -0
  71. package/cjs/table-header/TableHeader.js +87 -0
  72. package/cjs/table-header/TableHeader.js.map +1 -0
  73. package/cjs/table-header/useTableHeader.js +72 -0
  74. package/cjs/table-header/useTableHeader.js.map +1 -0
  75. package/cjs/useCell.js +28 -0
  76. package/cjs/useCell.js.map +1 -0
  77. package/cjs/useCellEditing.js +79 -0
  78. package/cjs/useCellEditing.js.map +1 -0
  79. package/cjs/useControlledTableNavigation.js +43 -0
  80. package/cjs/useControlledTableNavigation.js.map +1 -0
  81. package/cjs/useDataSource.js +104 -0
  82. package/cjs/useDataSource.js.map +1 -0
  83. package/cjs/useInitialValue.js +11 -0
  84. package/cjs/useInitialValue.js.map +1 -0
  85. package/cjs/useKeyboardNavigation.js +304 -0
  86. package/cjs/useKeyboardNavigation.js.map +1 -0
  87. package/cjs/useRowClassNameGenerators.js +34 -0
  88. package/cjs/useRowClassNameGenerators.js.map +1 -0
  89. package/cjs/useRowHeight.js +43 -0
  90. package/cjs/useRowHeight.js.map +1 -0
  91. package/cjs/useSelection.js +64 -0
  92. package/cjs/useSelection.js.map +1 -0
  93. package/cjs/useTable.js +553 -0
  94. package/cjs/useTable.js.map +1 -0
  95. package/cjs/useTableAndColumnSettings.js +128 -0
  96. package/cjs/useTableAndColumnSettings.js.map +1 -0
  97. package/cjs/useTableContextMenu.js +42 -0
  98. package/cjs/useTableContextMenu.js.map +1 -0
  99. package/cjs/useTableModel.js +297 -0
  100. package/cjs/useTableModel.js.map +1 -0
  101. package/cjs/useTableScroll.js +396 -0
  102. package/cjs/useTableScroll.js.map +1 -0
  103. package/cjs/useTableViewport.js +122 -0
  104. package/cjs/useTableViewport.js.map +1 -0
  105. package/esm/Row.css.js +4 -0
  106. package/esm/Row.css.js.map +1 -0
  107. package/esm/Row.js +121 -0
  108. package/esm/Row.js.map +1 -0
  109. package/esm/Table.css.js +4 -0
  110. package/esm/Table.css.js.map +1 -0
  111. package/esm/Table.js +283 -0
  112. package/esm/Table.js.map +1 -0
  113. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js +4 -0
  114. package/esm/cell-renderers/checkbox-cell/CheckboxCell.css.js.map +1 -0
  115. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js +40 -0
  116. package/esm/cell-renderers/checkbox-cell/CheckboxCell.js.map +1 -0
  117. package/esm/cell-renderers/input-cell/InputCell.css.js +4 -0
  118. package/esm/cell-renderers/input-cell/InputCell.css.js.map +1 -0
  119. package/esm/cell-renderers/input-cell/InputCell.js +56 -0
  120. package/esm/cell-renderers/input-cell/InputCell.js.map +1 -0
  121. package/esm/cell-renderers/toggle-cell/ToggleCell.css.js +4 -0
  122. package/esm/cell-renderers/toggle-cell/ToggleCell.css.js.map +1 -0
  123. package/esm/cell-renderers/toggle-cell/ToggleCell.js +66 -0
  124. package/esm/cell-renderers/toggle-cell/ToggleCell.js.map +1 -0
  125. package/esm/column-header-pill/ColumnHeaderPill.css.js +4 -0
  126. package/esm/column-header-pill/ColumnHeaderPill.css.js.map +1 -0
  127. package/esm/column-header-pill/ColumnHeaderPill.js +51 -0
  128. package/esm/column-header-pill/ColumnHeaderPill.js.map +1 -0
  129. package/esm/column-header-pill/GroupColumnPill.css.js +4 -0
  130. package/esm/column-header-pill/GroupColumnPill.css.js.map +1 -0
  131. package/esm/column-header-pill/GroupColumnPill.js +27 -0
  132. package/esm/column-header-pill/GroupColumnPill.js.map +1 -0
  133. package/esm/column-header-pill/SortIndicator.css.js +4 -0
  134. package/esm/column-header-pill/SortIndicator.css.js.map +1 -0
  135. package/esm/column-header-pill/SortIndicator.js +25 -0
  136. package/esm/column-header-pill/SortIndicator.js.map +1 -0
  137. package/esm/column-menu/ColumnMenu.css.js +4 -0
  138. package/esm/column-menu/ColumnMenu.css.js.map +1 -0
  139. package/esm/column-menu/ColumnMenu.js +28 -0
  140. package/esm/column-menu/ColumnMenu.js.map +1 -0
  141. package/esm/column-resizing/ColumnResizer.css.js +4 -0
  142. package/esm/column-resizing/ColumnResizer.css.js.map +1 -0
  143. package/esm/column-resizing/ColumnResizer.js +70 -0
  144. package/esm/column-resizing/ColumnResizer.js.map +1 -0
  145. package/esm/column-resizing/useTableColumnResize.js +53 -0
  146. package/esm/column-resizing/useTableColumnResize.js.map +1 -0
  147. package/esm/context-menu/buildContextMenuDescriptors.js +212 -0
  148. package/esm/context-menu/buildContextMenuDescriptors.js.map +1 -0
  149. package/esm/context-menu/useHandleTableContextMenu.js +79 -0
  150. package/esm/context-menu/useHandleTableContextMenu.js.map +1 -0
  151. package/esm/header-cell/GroupHeaderCell.css.js +4 -0
  152. package/esm/header-cell/GroupHeaderCell.css.js.map +1 -0
  153. package/esm/header-cell/GroupHeaderCell.js +115 -0
  154. package/esm/header-cell/GroupHeaderCell.js.map +1 -0
  155. package/esm/header-cell/HeaderCell.css.js +4 -0
  156. package/esm/header-cell/HeaderCell.css.js.map +1 -0
  157. package/esm/header-cell/HeaderCell.js +107 -0
  158. package/esm/header-cell/HeaderCell.js.map +1 -0
  159. package/esm/index.js +14 -0
  160. package/esm/index.js.map +1 -0
  161. package/esm/moving-window.js +59 -0
  162. package/esm/moving-window.js.map +1 -0
  163. package/esm/table-cell/TableCell.css.js +4 -0
  164. package/esm/table-cell/TableCell.css.js.map +1 -0
  165. package/esm/table-cell/TableCell.js +70 -0
  166. package/esm/table-cell/TableCell.js.map +1 -0
  167. package/esm/table-cell/TableGroupCell.css.js +4 -0
  168. package/esm/table-cell/TableGroupCell.css.js.map +1 -0
  169. package/esm/table-cell/TableGroupCell.js +52 -0
  170. package/esm/table-cell/TableGroupCell.js.map +1 -0
  171. package/esm/table-config.js +23 -0
  172. package/esm/table-config.js.map +1 -0
  173. package/esm/table-dom-utils.js +51 -0
  174. package/esm/table-dom-utils.js.map +1 -0
  175. package/esm/table-header/TableHeader.js +85 -0
  176. package/esm/table-header/TableHeader.js.map +1 -0
  177. package/esm/table-header/useTableHeader.js +70 -0
  178. package/esm/table-header/useTableHeader.js.map +1 -0
  179. package/esm/useCell.js +26 -0
  180. package/esm/useCell.js.map +1 -0
  181. package/esm/useCellEditing.js +77 -0
  182. package/esm/useCellEditing.js.map +1 -0
  183. package/esm/useControlledTableNavigation.js +41 -0
  184. package/esm/useControlledTableNavigation.js.map +1 -0
  185. package/esm/useDataSource.js +101 -0
  186. package/esm/useDataSource.js.map +1 -0
  187. package/esm/useInitialValue.js +9 -0
  188. package/esm/useInitialValue.js.map +1 -0
  189. package/esm/useKeyboardNavigation.js +300 -0
  190. package/esm/useKeyboardNavigation.js.map +1 -0
  191. package/esm/useRowClassNameGenerators.js +32 -0
  192. package/esm/useRowClassNameGenerators.js.map +1 -0
  193. package/esm/useRowHeight.js +41 -0
  194. package/esm/useRowHeight.js.map +1 -0
  195. package/esm/useSelection.js +62 -0
  196. package/esm/useSelection.js.map +1 -0
  197. package/esm/useTable.js +551 -0
  198. package/esm/useTable.js.map +1 -0
  199. package/esm/useTableAndColumnSettings.js +126 -0
  200. package/esm/useTableAndColumnSettings.js.map +1 -0
  201. package/esm/useTableContextMenu.js +40 -0
  202. package/esm/useTableContextMenu.js.map +1 -0
  203. package/esm/useTableModel.js +293 -0
  204. package/esm/useTableModel.js.map +1 -0
  205. package/esm/useTableScroll.js +393 -0
  206. package/esm/useTableScroll.js.map +1 -0
  207. package/esm/useTableViewport.js +120 -0
  208. package/esm/useTableViewport.js.map +1 -0
  209. package/package.json +12 -8
  210. package/types/Row.d.ts +0 -1
  211. package/types/Table.d.ts +0 -1
  212. package/types/cell-renderers/checkbox-cell/CheckboxCell.d.ts +0 -1
  213. package/types/cell-renderers/input-cell/InputCell.d.ts +0 -1
  214. package/types/cell-renderers/toggle-cell/ToggleCell.d.ts +0 -1
  215. package/types/column-header-pill/ColumnHeaderPill.d.ts +0 -1
  216. package/types/column-header-pill/GroupColumnPill.d.ts +0 -1
  217. package/types/column-header-pill/SortIndicator.d.ts +0 -1
  218. package/types/column-menu/ColumnMenu.d.ts +0 -1
  219. package/types/column-resizing/ColumnResizer.d.ts +0 -1
  220. package/types/header-cell/GroupHeaderCell.d.ts +0 -1
  221. package/types/header-cell/HeaderCell.d.ts +0 -1
  222. package/types/table-cell/TableCell.d.ts +0 -1
  223. package/types/table-cell/TableGroupCell.d.ts +0 -1
@@ -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":";;;;"}