@infinite-table/infinite-react 0.4.13 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/API.md +0 -0
  3. package/build/buildPackageJson.js +43 -0
  4. package/build/scripts/test.js +37 -0
  5. package/bundler.config.js +25 -0
  6. package/globals.d.ts +7 -0
  7. package/package.json +102 -3
  8. package/rollup.config.js +15 -0
  9. package/run-build-deepmap.js +47 -0
  10. package/run-build.js +45 -0
  11. package/run-dts-concat.js +21 -0
  12. package/src/components/CSSVariableWatch.tsx +82 -0
  13. package/src/components/DataSource/BooleanCollectionState.ts +214 -0
  14. package/src/components/DataSource/BooleanDeepCollectionState.ts +208 -0
  15. package/src/components/DataSource/DataSourceContext.ts +20 -0
  16. package/src/components/DataSource/GroupRowsState.ts +74 -0
  17. package/src/components/DataSource/Indexer.ts +27 -0
  18. package/src/components/DataSource/RowSelectionState.ts +763 -0
  19. package/src/components/DataSource/defaultFilterTypes.ts +64 -0
  20. package/src/components/DataSource/index.tsx +108 -0
  21. package/src/components/DataSource/privateHooks/getChangeDetect.ts +7 -0
  22. package/src/components/DataSource/privateHooks/useLoadData.ts +783 -0
  23. package/src/components/DataSource/publicHooks/useDataSource.ts +19 -0
  24. package/src/components/DataSource/publicHooks/useDataSourceActions.ts +14 -0
  25. package/src/components/DataSource/state/getInitialState.ts +494 -0
  26. package/src/components/DataSource/state/normalizeSortInfo.ts +35 -0
  27. package/src/components/DataSource/state/reducer.ts +466 -0
  28. package/src/components/DataSource/state/rowInfoStatus.ts +27 -0
  29. package/src/components/DataSource/types.ts +548 -0
  30. package/src/components/HeadlessTable/HeadlessTableWithPinnedContainers.tsx +142 -0
  31. package/src/components/HeadlessTable/MappedCells.ts +251 -0
  32. package/src/components/HeadlessTable/RawTable.tsx +98 -0
  33. package/src/components/HeadlessTable/ReactHeadlessTableRenderer.tsx +1516 -0
  34. package/src/components/HeadlessTable/index.tsx +234 -0
  35. package/src/components/InfiniteTable/InfiniteCls.css.ts +164 -0
  36. package/src/components/InfiniteTable/InfiniteTableContext.ts +16 -0
  37. package/src/components/InfiniteTable/api/getImperativeApi.ts +391 -0
  38. package/src/components/InfiniteTable/api/getSelectionApi.ts +364 -0
  39. package/src/components/InfiniteTable/api/type.ts +11 -0
  40. package/src/components/InfiniteTable/components/ActiveCellIndicator.css.ts +51 -0
  41. package/src/components/InfiniteTable/components/ActiveCellIndicator.tsx +116 -0
  42. package/src/components/InfiniteTable/components/ActiveRowIndicator.css.ts +56 -0
  43. package/src/components/InfiniteTable/components/ActiveRowIndicator.tsx +94 -0
  44. package/src/components/InfiniteTable/components/CheckBox.css.ts +13 -0
  45. package/src/components/InfiniteTable/components/CheckBox.tsx +96 -0
  46. package/src/components/InfiniteTable/components/FilterEditors.tsx +52 -0
  47. package/src/components/InfiniteTable/components/InfiniteTableBody/InfiniteTableBody.tsx +27 -0
  48. package/src/components/InfiniteTable/components/InfiniteTableBody/index.tsx +1 -0
  49. package/src/components/InfiniteTable/components/InfiniteTableFooter/InfiniteTableFooter.tsx +31 -0
  50. package/src/components/InfiniteTable/components/InfiniteTableFooter/index.tsx +1 -0
  51. package/src/components/InfiniteTable/components/InfiniteTableHeader/InfiniteTableColumnHeaderFilter.tsx +102 -0
  52. package/src/components/InfiniteTable/components/InfiniteTableHeader/InfiniteTableHeader.tsx +163 -0
  53. package/src/components/InfiniteTable/components/InfiniteTableHeader/InfiniteTableHeaderCell.tsx +574 -0
  54. package/src/components/InfiniteTable/components/InfiniteTableHeader/InfiniteTableHeaderGroup.tsx +79 -0
  55. package/src/components/InfiniteTable/components/InfiniteTableHeader/InfiniteTableHeaderTypes.tsx +25 -0
  56. package/src/components/InfiniteTable/components/InfiniteTableHeader/InfiniteTableHeaderWrapper.tsx +185 -0
  57. package/src/components/InfiniteTable/components/InfiniteTableHeader/ResizeHandle/GroupResizeHandle.tsx +159 -0
  58. package/src/components/InfiniteTable/components/InfiniteTableHeader/ResizeHandle/ResizeHandle.css.ts +124 -0
  59. package/src/components/InfiniteTable/components/InfiniteTableHeader/ResizeHandle/columnResizer.ts +166 -0
  60. package/src/components/InfiniteTable/components/InfiniteTableHeader/ResizeHandle/index.tsx +146 -0
  61. package/src/components/InfiniteTable/components/InfiniteTableHeader/buildColumnAndGroupTree.ts +240 -0
  62. package/src/components/InfiniteTable/components/InfiniteTableHeader/header.css.ts +358 -0
  63. package/src/components/InfiniteTable/components/InfiniteTableHeader/index.tsx +1 -0
  64. package/src/components/InfiniteTable/components/InfiniteTableHeader/useColumnGroupResizeHandle.tsx +114 -0
  65. package/src/components/InfiniteTable/components/InfiniteTableHeader/useColumnResizeHandle.tsx +146 -0
  66. package/src/components/InfiniteTable/components/InfiniteTableLicenseFooter/footer.css.ts +7 -0
  67. package/src/components/InfiniteTable/components/InfiniteTableLicenseFooter/index.tsx +110 -0
  68. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableCell.tsx +120 -0
  69. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableCellTypes.ts +74 -0
  70. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableColumnCell.tsx +457 -0
  71. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableRow.tsx +107 -0
  72. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableRowClassName.ts +6 -0
  73. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableRowTypes.ts +32 -0
  74. package/src/components/InfiniteTable/components/InfiniteTableRow/InfiniteTableRowUnvirtualized.tsx +75 -0
  75. package/src/components/InfiniteTable/components/InfiniteTableRow/columnRendering.tsx +263 -0
  76. package/src/components/InfiniteTable/components/InfiniteTableRow/index.tsx +1 -0
  77. package/src/components/InfiniteTable/components/InfiniteTableRow/row.css.ts +74 -0
  78. package/src/components/InfiniteTable/components/InfiniteTableRow/useRowDOMProps.ts +199 -0
  79. package/src/components/InfiniteTable/components/LoadMask.css.ts +34 -0
  80. package/src/components/InfiniteTable/components/LoadMask.tsx +27 -0
  81. package/src/components/InfiniteTable/components/ScrollbarPlaceholder.tsx +56 -0
  82. package/src/components/InfiniteTable/components/cell.css.ts +192 -0
  83. package/src/components/InfiniteTable/components/icons/ArrowDown.tsx +14 -0
  84. package/src/components/InfiniteTable/components/icons/ArrowUp.tsx +14 -0
  85. package/src/components/InfiniteTable/components/icons/ExpanderIcon.css.ts +31 -0
  86. package/src/components/InfiniteTable/components/icons/ExpanderIcon.tsx +63 -0
  87. package/src/components/InfiniteTable/components/icons/Icon.tsx +18 -0
  88. package/src/components/InfiniteTable/components/icons/InfiniteTableIconClassName.ts +1 -0
  89. package/src/components/InfiniteTable/components/icons/LoadingIcon.css.ts +8 -0
  90. package/src/components/InfiniteTable/components/icons/LoadingIcon.tsx +45 -0
  91. package/src/components/InfiniteTable/components/icons/MenuIcon.tsx +50 -0
  92. package/src/components/InfiniteTable/components/icons/SortIcon.tsx +113 -0
  93. package/src/components/InfiniteTable/eventHandlers/eventHandlerTypes.ts +57 -0
  94. package/src/components/InfiniteTable/eventHandlers/index.ts +95 -0
  95. package/src/components/InfiniteTable/eventHandlers/keyboardNavigation.ts +232 -0
  96. package/src/components/InfiniteTable/eventHandlers/keyboardSelection.ts +110 -0
  97. package/src/components/InfiniteTable/eventHandlers/onCellClick.ts +94 -0
  98. package/src/components/InfiniteTable/eventHandlers/onKeyDown.ts +25 -0
  99. package/src/components/InfiniteTable/hooks/adjustColumnOrderForAllColumns.ts +70 -0
  100. package/src/components/InfiniteTable/hooks/reorderColumnsOnDrag.ts +476 -0
  101. package/src/components/InfiniteTable/hooks/useAutoSizeColumns.ts +206 -0
  102. package/src/components/InfiniteTable/hooks/useCellClassName.ts +80 -0
  103. package/src/components/InfiniteTable/hooks/useCellRendering.tsx +217 -0
  104. package/src/components/InfiniteTable/hooks/useColumnGroups.ts +71 -0
  105. package/src/components/InfiniteTable/hooks/useColumnMenu.ts +72 -0
  106. package/src/components/InfiniteTable/hooks/useColumnPointerEvents.ts +258 -0
  107. package/src/components/InfiniteTable/hooks/useColumnRowspan.ts +43 -0
  108. package/src/components/InfiniteTable/hooks/useColumnSizeFn.ts +24 -0
  109. package/src/components/InfiniteTable/hooks/useColumnsWhen.ts +582 -0
  110. package/src/components/InfiniteTable/hooks/useComputed.ts +186 -0
  111. package/src/components/InfiniteTable/hooks/useComputedVisibleColumns.ts +219 -0
  112. package/src/components/InfiniteTable/hooks/useDOMProps.ts +306 -0
  113. package/src/components/InfiniteTable/hooks/useEffectWithRaf.ts +47 -0
  114. package/src/components/InfiniteTable/hooks/useInfiniteTable.ts +10 -0
  115. package/src/components/InfiniteTable/hooks/useInfiniteTableState.ts +11 -0
  116. package/src/components/InfiniteTable/hooks/useInternalProps.ts +8 -0
  117. package/src/components/InfiniteTable/hooks/useLicense/LicenseDetails.ts +13 -0
  118. package/src/components/InfiniteTable/hooks/useLicense/crc32.ts +56 -0
  119. package/src/components/InfiniteTable/hooks/useLicense/decode.ts +147 -0
  120. package/src/components/InfiniteTable/hooks/useLicense/useLicense.ts +39 -0
  121. package/src/components/InfiniteTable/hooks/useRerenderOnKeyChange.ts +21 -0
  122. package/src/components/InfiniteTable/hooks/useRowHover.ts +18 -0
  123. package/src/components/InfiniteTable/hooks/useScrollToActiveCell.ts +48 -0
  124. package/src/components/InfiniteTable/hooks/useScrollToActiveRow.ts +44 -0
  125. package/src/components/InfiniteTable/hooks/useScrollbars.ts +51 -0
  126. package/src/components/InfiniteTable/hooks/useToggleGroupRow.ts +56 -0
  127. package/src/components/InfiniteTable/hooks/useUnpinnedRendering.tsx +165 -0
  128. package/src/components/InfiniteTable/hooks/useYourBrain.ts +55 -0
  129. package/src/components/InfiniteTable/index.tsx +352 -0
  130. package/src/components/InfiniteTable/internalProps.ts +4 -0
  131. package/src/components/InfiniteTable/state/computeColumnGroupsDepths.ts +29 -0
  132. package/src/components/InfiniteTable/state/getColumnVisibilityForHideEmptyGroupColumns.ts +127 -0
  133. package/src/components/InfiniteTable/state/getInitialState.ts +375 -0
  134. package/src/components/InfiniteTable/theme.css.ts +556 -0
  135. package/src/components/InfiniteTable/types/InfiniteTableAction.ts +6 -0
  136. package/src/components/InfiniteTable/types/InfiniteTableActionType.ts +12 -0
  137. package/src/components/InfiniteTable/types/InfiniteTableColumn.ts +478 -0
  138. package/src/components/InfiniteTable/types/InfiniteTableComputedValues.ts +43 -0
  139. package/src/components/InfiniteTable/types/InfiniteTableContextValue.ts +12 -0
  140. package/src/components/InfiniteTable/types/InfiniteTableInternalProps.ts +3 -0
  141. package/src/components/InfiniteTable/types/InfiniteTableProps.ts +511 -0
  142. package/src/components/InfiniteTable/types/InfiniteTableState.ts +195 -0
  143. package/src/components/InfiniteTable/types/Utility.ts +35 -0
  144. package/src/components/InfiniteTable/types/index.ts +96 -0
  145. package/src/components/InfiniteTable/utilities.css.ts +179 -0
  146. package/src/components/InfiniteTable/utils/MultiRowSelector.ts +111 -0
  147. package/src/components/InfiniteTable/utils/RenderHookComponentForInfinite.tsx +52 -0
  148. package/src/components/InfiniteTable/utils/adjustColumnOrderForPinning.ts +33 -0
  149. package/src/components/InfiniteTable/utils/assignFiltered.ts +29 -0
  150. package/src/components/InfiniteTable/utils/defaultGetColumContextMenuItems.tsx +108 -0
  151. package/src/components/InfiniteTable/utils/getColumnComputedType.ts +33 -0
  152. package/src/components/InfiniteTable/utils/getColumnForGroupBy.tsx +313 -0
  153. package/src/components/InfiniteTable/utils/getComputedVisibleColumns.ts +773 -0
  154. package/src/components/InfiniteTable/utils/getContextMenuForColumn.tsx +72 -0
  155. package/src/components/InfiniteTable/utils/infiniteDOMUtils.ts +189 -0
  156. package/src/components/InfiniteTable/utils/mapToObject.ts +20 -0
  157. package/src/components/InfiniteTable/utils/moveXatY.ts +25 -0
  158. package/src/components/InfiniteTable/utils/objectValuesExcept.ts +9 -0
  159. package/src/components/InfiniteTable/utils/progressiveSpeedScroller.ts +158 -0
  160. package/src/components/InfiniteTable/utils/rafFn.ts +13 -0
  161. package/src/components/InfiniteTable/utils/toCSSVarName.ts +1 -0
  162. package/src/components/InfiniteTable/utils/toMap.ts +24 -0
  163. package/src/components/Menu/Menu.tsx +750 -0
  164. package/src/components/Menu/MenuCls.css.ts +139 -0
  165. package/src/components/Menu/MenuContext.ts +10 -0
  166. package/src/components/Menu/MenuContextValue.ts +15 -0
  167. package/src/components/Menu/MenuProps.ts +98 -0
  168. package/src/components/Menu/MenuState.ts +56 -0
  169. package/src/components/Menu/MenuTriangleContext.ts +352 -0
  170. package/src/components/Menu/childrenToRuntimeItems.tsx +103 -0
  171. package/src/components/Menu/getMenuState.tsx +119 -0
  172. package/src/components/Menu/index.tsx +88 -0
  173. package/src/components/Menu/propToIdentifyMenu.ts +1 -0
  174. package/src/components/RawList/AvoidReactDiff.tsx +48 -0
  175. package/src/components/RawList/MappedItems.ts +143 -0
  176. package/src/components/RawList/ReactVirtualRenderer.tsx +307 -0
  177. package/src/components/RawList/index.tsx +42 -0
  178. package/src/components/RawList/types.ts +23 -0
  179. package/src/components/RawList/useVirtualRenderer.ts +36 -0
  180. package/src/components/RenderHookComponent.tsx +10 -0
  181. package/src/components/ResizeObserver/index.tsx +170 -0
  182. package/src/components/VirtualBrain/MatrixBrain.ts +1621 -0
  183. package/src/components/VirtualBrain/ScrollListener.ts +39 -0
  184. package/src/components/VirtualBrain/index.ts +664 -0
  185. package/src/components/VirtualList/ColumnListWithExternalScrolling.tsx +78 -0
  186. package/src/components/VirtualList/InfiniteListRootClassName.ts +1 -0
  187. package/src/components/VirtualList/RowListWithExternalScrolling.tsx +120 -0
  188. package/src/components/VirtualList/SpacePlaceholder.tsx +32 -0
  189. package/src/components/VirtualList/VirtualList.css.ts +29 -0
  190. package/src/components/VirtualList/VirtualList.tsx +141 -0
  191. package/src/components/VirtualList/VirtualRowList.tsx +34 -0
  192. package/src/components/VirtualList/types.ts +56 -0
  193. package/src/components/VirtualList/useCorrectHeightForRowElements.ts +14 -0
  194. package/src/components/VirtualScrollContainer/VirtualScrollContainer.css.ts +51 -0
  195. package/src/components/VirtualScrollContainer/getScrollableClassName.ts +30 -0
  196. package/src/components/VirtualScrollContainer/index.tsx +63 -0
  197. package/src/components/flexbox/index.ts +562 -0
  198. package/src/components/hooks/useComponentState/index.tsx +562 -0
  199. package/src/components/hooks/useComponentState/types.ts +32 -0
  200. package/src/components/hooks/useEffectOnceWithProperUnmount.ts +33 -0
  201. package/src/components/hooks/useEffectWithChanges.ts +56 -0
  202. package/src/components/hooks/useImmutableRef.ts +7 -0
  203. package/src/components/hooks/useInterceptedMap.ts +71 -0
  204. package/src/components/hooks/useLatest.tsx +8 -0
  205. package/src/components/hooks/useLazyLatest.ts +23 -0
  206. package/src/components/hooks/useMemoShallowObjectMerge.ts +16 -0
  207. package/src/components/hooks/useMounted.ts +18 -0
  208. package/src/components/hooks/useOnMount.ts +21 -0
  209. package/src/components/hooks/useOnScroll.ts +34 -0
  210. package/src/components/hooks/useOnce.ts +10 -0
  211. package/src/components/hooks/useOverlay/index.tsx +418 -0
  212. package/src/components/hooks/usePrevious.ts +8 -0
  213. package/src/components/hooks/usePropertyOld.ts +168 -0
  214. package/src/components/hooks/useRerender.ts +12 -0
  215. package/src/components/hooks/xuseProperty.ts +165 -0
  216. package/src/components/types/CellPosition.ts +4 -0
  217. package/src/components/types/NonUndefined.ts +1 -0
  218. package/src/components/types/RemoveObject.ts +22 -0
  219. package/src/components/types/Renderable.ts +3 -0
  220. package/src/components/types/ScrollPosition.ts +7 -0
  221. package/src/components/types/Setter.ts +2 -0
  222. package/src/components/types/Size.ts +6 -0
  223. package/src/components/types/SubscriptionCallback.ts +10 -0
  224. package/src/components/types/VoidFn.ts +1 -0
  225. package/src/components/utils/buildSubscriptionCallback.tsx +60 -0
  226. package/src/components/utils/clamp.ts +3 -0
  227. package/src/components/utils/debounce.ts +16 -0
  228. package/src/components/utils/decamelize.ts +11 -0
  229. package/src/components/utils/discardCallsWithEqualArg.ts +42 -0
  230. package/src/components/utils/getRenderIndexes.ts +33 -0
  231. package/src/components/utils/getScrollbarWidth.ts +31 -0
  232. package/src/components/utils/getVirtualRenderCount.ts +21 -0
  233. package/src/components/utils/isControlled.ts +12 -0
  234. package/src/components/utils/isControlledValue.ts +5 -0
  235. package/src/index.tsx +34 -0
  236. package/src/test.tsx +18 -0
  237. package/src/utils/DeepMap/index.ts +588 -0
  238. package/src/utils/DeepMap/once.ts +16 -0
  239. package/src/utils/DeepMap/sortAscending.ts +1 -0
  240. package/src/utils/DeepMap/tsconfig.deepmap.json +17 -0
  241. package/src/utils/DeepMap/xpackage.json +26 -0
  242. package/src/utils/debug.ts +40 -0
  243. package/src/utils/deepClone.ts +38 -0
  244. package/src/utils/getGlobal.ts +3 -0
  245. package/src/utils/groupAndPivot/defaultToKey.ts +3 -0
  246. package/src/utils/groupAndPivot/getGroupKeysForDataItem.ts +19 -0
  247. package/src/utils/groupAndPivot/getPivotColumnsAndColumnGroups.ts +361 -0
  248. package/src/utils/groupAndPivot/index.ts +1229 -0
  249. package/src/utils/groupAndPivot/types.ts +10 -0
  250. package/src/utils/join.ts +4 -0
  251. package/src/utils/mathIntersection.ts +21 -0
  252. package/src/utils/minified.d.ts +2 -0
  253. package/src/utils/minified.js +6 -0
  254. package/src/utils/multisort/index.ts +151 -0
  255. package/src/utils/multisort/sortTypes.ts +25 -0
  256. package/src/utils/notes-status.md +92 -0
  257. package/src/utils/pageGeometry/ConvexPoly.ts +34 -0
  258. package/src/utils/pageGeometry/Point.ts +51 -0
  259. package/src/utils/pageGeometry/PolyWithPoints.ts +52 -0
  260. package/src/utils/pageGeometry/Rectangle.ts +98 -0
  261. package/src/utils/pageGeometry/Triangle.ts +16 -0
  262. package/src/utils/pageGeometry/alignment/index.ts +221 -0
  263. package/src/utils/pageGeometry/polyContainsPoint.ts +182 -0
  264. package/src/utils/pageGeometry/types.ts +3 -0
  265. package/src/utils/proxyFnCall.ts +46 -0
  266. package/src/utils/raf.ts +13 -0
  267. package/src/utils/selectParent.ts +18 -0
  268. package/src/utils/shallowEqualObjects.ts +49 -0
  269. package/src/utils/stripVar.ts +3 -0
  270. package/src/utils/toUpperFirst.ts +5 -0
  271. package/todo.md +2 -0
  272. package/tsconfig.build.json +8 -0
  273. package/tsconfig.dev.json +7 -0
  274. package/tsconfig.json +30 -0
  275. package/tsconfig.typebundler.json +13 -0
  276. package/typedoc.json +4 -0
  277. package/README.md +0 -104
  278. package/index.css +0 -857
  279. package/index.d.ts +0 -2111
  280. package/index.esm.css +0 -857
  281. package/index.esm.js +0 -13695
  282. package/index.js +0 -13565
@@ -0,0 +1,165 @@
1
+ //@ts-nocheck - this file is not being used
2
+ import * as React from 'react';
3
+ import { useCallback } from 'react';
4
+
5
+ import { getScrollbarWidth } from '../../utils/getScrollbarWidth';
6
+ import { RenderRow } from '../../VirtualList/types';
7
+ import type { VirtualBrain, VirtualBrainOptions } from '../../VirtualBrain';
8
+
9
+ import { VirtualRowList } from '../../VirtualList/VirtualRowList';
10
+ import type { Size } from '../../types/Size';
11
+ import type {
12
+ InfiniteTableComputedColumn,
13
+ InfiniteTableRowInfo,
14
+ } from '../types';
15
+ import type { InfiniteTableRowProps } from '../components/InfiniteTableRow/InfiniteTableRowTypes';
16
+
17
+ import { InfiniteTableRow } from '../components/InfiniteTableRow';
18
+ import { TableRowUnvirtualized } from '../components/InfiniteTableRow/InfiniteTableRowUnvirtualized';
19
+ import { InfiniteTableState } from '../types/InfiniteTableState';
20
+ import { InfiniteTableToggleGroupRowFn } from '../types/InfiniteTableColumn';
21
+
22
+ type UnpinnedRenderingParams<T> = {
23
+ columnShifts: number[] | null;
24
+ bodySize: Size;
25
+ getData: () => InfiniteTableRowInfo<T>[];
26
+ rowHeight: number;
27
+ toggleGroupRow: InfiniteTableToggleGroupRowFn;
28
+
29
+ repaintId: string | number;
30
+ applyScrollHorizontal: ({ scrollLeft }: { scrollLeft: number }) => void;
31
+ verticalVirtualBrain: VirtualBrain;
32
+ horizontalVirtualBrain: VirtualBrain;
33
+
34
+ computedPinnedEndColumns: InfiniteTableComputedColumn<T>[];
35
+ computedUnpinnedColumns: InfiniteTableComputedColumn<T>[];
36
+ computedUnpinnedColumnsWidth: number;
37
+ computedPinnedStartWidth: number;
38
+ computedPinnedEndWidth: number;
39
+ rowSpan?: VirtualBrainOptions['itemSpan'];
40
+
41
+ getState: () => InfiniteTableState<T>;
42
+ };
43
+ export function useUnpinnedRendering<T>(params: UnpinnedRenderingParams<T>) {
44
+ const {
45
+ columnShifts,
46
+ bodySize,
47
+ getData,
48
+ rowHeight,
49
+ toggleGroupRow,
50
+
51
+ repaintId,
52
+
53
+ applyScrollHorizontal,
54
+ verticalVirtualBrain,
55
+ horizontalVirtualBrain,
56
+ computedUnpinnedColumnsWidth,
57
+ computedPinnedStartWidth,
58
+ computedPinnedEndWidth,
59
+
60
+ computedUnpinnedColumns,
61
+
62
+ rowSpan,
63
+ getState,
64
+ } = params;
65
+
66
+ const { virtualizeColumns } = getState();
67
+
68
+ const shouldVirtualizeColumns =
69
+ typeof virtualizeColumns === 'function'
70
+ ? virtualizeColumns(computedUnpinnedColumns)
71
+ : virtualizeColumns ?? true;
72
+
73
+ const renderRowUnpinned: RenderRow = useCallback(
74
+ (rowParams) => {
75
+ const dataArray = getData();
76
+ const rowInfo = dataArray[rowParams.rowIndex];
77
+
78
+ const { showZebraRows, showHoverRows } = getState();
79
+
80
+ const rowProps: InfiniteTableRowProps<T> = {
81
+ rowInfo,
82
+ showZebraRows,
83
+ showHoverRows,
84
+ getData,
85
+ rowSpan,
86
+ toggleGroupRow,
87
+ virtualizeColumns: shouldVirtualizeColumns,
88
+ brain: null!,
89
+ verticalBrain: verticalVirtualBrain,
90
+ columns: computedUnpinnedColumns,
91
+ rowWidth: computedUnpinnedColumnsWidth,
92
+ ...rowParams,
93
+ };
94
+
95
+ if (shouldVirtualizeColumns) {
96
+ rowProps.brain = horizontalVirtualBrain;
97
+ rowProps.repaintId = repaintId;
98
+ }
99
+
100
+ const TableRowComponent = shouldVirtualizeColumns
101
+ ? InfiniteTableRow
102
+ : TableRowUnvirtualized;
103
+
104
+ return <TableRowComponent<T> {...rowProps} />;
105
+ },
106
+ [
107
+ repaintId,
108
+ rowHeight,
109
+ rowSpan,
110
+
111
+ computedUnpinnedColumns,
112
+ computedUnpinnedColumnsWidth,
113
+
114
+ shouldVirtualizeColumns,
115
+ horizontalVirtualBrain,
116
+ verticalVirtualBrain,
117
+ ],
118
+ );
119
+
120
+ const fakeScrollbar = getScrollbarWidth() ? (
121
+ <div
122
+ data-name="horizontal-scrollbar-placeholder--fake"
123
+ style={{
124
+ position: 'absolute',
125
+ left: 0,
126
+ right: 0,
127
+ bottom: 0,
128
+ height: getScrollbarWidth() + 1,
129
+ overflow: 'auto',
130
+ visibility: columnShifts ? 'visible' : 'hidden',
131
+ }}
132
+ >
133
+ <div style={{ height: '100%', width: computedUnpinnedColumnsWidth }} />
134
+ </div>
135
+ ) : null;
136
+
137
+ //TODO in the future, we can use something more lightweight instead of the VirtualRowList
138
+ // as the root of the InfiniteTable already renders a VirtualScrollContainer
139
+ // and the VirtualRowList contains another VirtualScrollContainer
140
+ // so I think we could optimize this 🤔 or remove the root VirtualScrollContainer there 🤷‍♂️
141
+ return rowHeight != 0 ? (
142
+ <VirtualRowList
143
+ repaintId={`${repaintId}-unpinned-`}
144
+ brain={verticalVirtualBrain}
145
+ onContainerScroll={applyScrollHorizontal}
146
+ scrollable={
147
+ columnShifts
148
+ ? 'visible'
149
+ : { vertical: false, horizontal: !columnShifts }
150
+ }
151
+ style={{
152
+ height: bodySize.height,
153
+ top: 0,
154
+ position: 'absolute',
155
+ left: computedPinnedStartWidth,
156
+ right: computedPinnedEndWidth,
157
+ }}
158
+ count={getData().length}
159
+ rowHeight={rowHeight}
160
+ renderRow={renderRowUnpinned}
161
+ rowWidth={computedUnpinnedColumnsWidth}
162
+ outerChildren={fakeScrollbar}
163
+ ></VirtualRowList>
164
+ ) : null;
165
+ }
@@ -0,0 +1,55 @@
1
+ // CONFESSION: this should have been named `useVirtualAndHorizontalBrains`
2
+ // but I couldn't stand naming it `useYourBrain` instead 🤷‍♂️
3
+
4
+ import { useMatrixBrain } from '../../HeadlessTable';
5
+ import { Size } from '../../types/Size';
6
+ import { MatrixBrain, SpanFunction } from '../../VirtualBrain/MatrixBrain';
7
+ import { InfiniteTableComputedColumn } from '../types';
8
+
9
+ type UseYourBrainParam<T = any> = {
10
+ brain: MatrixBrain;
11
+
12
+ columnSize: (rowIndex: number) => number;
13
+ computedVisibleColumns: InfiniteTableComputedColumn<T>[];
14
+ computedPinnedStartColumns: InfiniteTableComputedColumn<T>[];
15
+ computedPinnedEndColumns: InfiniteTableComputedColumn<T>[];
16
+
17
+ dataArray: any[];
18
+ rowHeight: number;
19
+ bodySize: Size;
20
+ rowspan?: SpanFunction;
21
+ colspan?: SpanFunction;
22
+ };
23
+ export function useYourBrain<T = any>(param: UseYourBrainParam<T>) {
24
+ const {
25
+ dataArray,
26
+ brain,
27
+ computedPinnedEndColumns,
28
+ computedPinnedStartColumns,
29
+ computedVisibleColumns,
30
+ columnSize,
31
+ rowHeight,
32
+ rowspan,
33
+ } = param;
34
+
35
+ useMatrixBrain(
36
+ brain,
37
+ {
38
+ colWidth: columnSize,
39
+ rowHeight,
40
+ // don't update width and height here
41
+ // since it's updated by HeadlessTable, to account also for scrollbar sizes
42
+ // height: bodySize.height,
43
+ // width: bodySize.width,
44
+ rows: dataArray.length,
45
+ cols: computedVisibleColumns.length,
46
+ rowspan,
47
+ },
48
+ {
49
+ fixedColsEnd: computedPinnedEndColumns.length,
50
+ fixedColsStart: computedPinnedStartColumns.length,
51
+ },
52
+ );
53
+
54
+ return brain;
55
+ }
@@ -0,0 +1,352 @@
1
+ import * as React from 'react';
2
+ import { RefObject } from 'react';
3
+
4
+ import { join } from '../../utils/join';
5
+ import { CSSVariableWatch } from '../CSSVariableWatch';
6
+
7
+ import {
8
+ useDataSource,
9
+ useDataSourceContextValue,
10
+ } from '../DataSource/publicHooks/useDataSource';
11
+ import { HeadlessTable } from '../HeadlessTable';
12
+
13
+ import {
14
+ getComponentStateRoot,
15
+ useComponentState,
16
+ } from '../hooks/useComponentState';
17
+ import { useLatest } from '../hooks/useLatest';
18
+ import { useResizeObserver } from '../ResizeObserver';
19
+
20
+ import { debounce } from '../utils/debounce';
21
+
22
+ import { InfiniteTableBody } from './components/InfiniteTableBody';
23
+ import { InfiniteTableFooter } from './components/InfiniteTableFooter';
24
+ import { useInfiniteHeaderCell } from './components/InfiniteTableHeader/InfiniteTableHeaderCell';
25
+ import { TableHeaderWrapper } from './components/InfiniteTableHeader/InfiniteTableHeaderWrapper';
26
+ import { InfiniteTableLicenseFooter } from './components/InfiniteTableLicenseFooter';
27
+ import { useInfiniteColumnCell } from './components/InfiniteTableRow/InfiniteTableColumnCell';
28
+ import { RowHoverCls } from './components/InfiniteTableRow/row.css';
29
+ import { LoadMask } from './components/LoadMask';
30
+ import { getImperativeApi } from './api/getImperativeApi';
31
+ import { useAutoSizeColumns } from './hooks/useAutoSizeColumns';
32
+ import { useCellRendering } from './hooks/useCellRendering';
33
+ import { useComputed } from './hooks/useComputed';
34
+ import { useDOMProps } from './hooks/useDOMProps';
35
+ import { useInfiniteTable } from './hooks/useInfiniteTable';
36
+ import { useLicense } from './hooks/useLicense/useLicense';
37
+
38
+ import { useScrollToActiveCell } from './hooks/useScrollToActiveCell';
39
+ import { useScrollToActiveRow } from './hooks/useScrollToActiveRow';
40
+ import {
41
+ PinnedEndIndicatorBorder,
42
+ PinnedStartIndicatorBorder,
43
+ } from './InfiniteCls.css';
44
+ import { getInfiniteTableContext } from './InfiniteTableContext';
45
+ import { internalProps, rootClassName } from './internalProps';
46
+
47
+ import {
48
+ forwardProps,
49
+ mapPropsToState,
50
+ initSetupState,
51
+ cleanupState,
52
+ } from './state/getInitialState';
53
+ import { columnHeaderHeightName } from './theme.css';
54
+
55
+ import type {
56
+ InfiniteTableContextValue,
57
+ InfiniteTableProps,
58
+ InfiniteTableState,
59
+ } from './types';
60
+ import { position, zIndex, top, left } from './utilities.css';
61
+ import { toCSSVarName } from './utils/toCSSVarName';
62
+ import { useDOMEventHandlers } from './eventHandlers';
63
+ import { useColumnMenu } from './hooks/useColumnMenu';
64
+
65
+ export const InfiniteTableClassName = internalProps.rootClassName;
66
+
67
+ const HOVERED_CLASS_NAMES = [RowHoverCls, 'InfiniteColumnCell--hovered'];
68
+
69
+ const InfiniteTableRoot = getComponentStateRoot({
70
+ // @ts-ignore
71
+ initSetupState,
72
+ // @ts-ignore
73
+ forwardProps,
74
+ // @ts-ignore
75
+ mapPropsToState,
76
+ // @ts-ignore
77
+ cleanup: cleanupState,
78
+ // @ts-ignore
79
+ allowedControlledPropOverrides: {
80
+ rowHeight: true,
81
+ columnHeaderHeight: true,
82
+ } as Record<keyof InfiniteTableProps<any>, true>,
83
+ // @ts-ignore
84
+ getParentState: () => useDataSource(),
85
+ debugName: 'InfiniteTable',
86
+ });
87
+
88
+ // const InfiniteTableFactory = <T extends unknown>(
89
+ // _cfg: InfiniteTableFactoryConfig = {},
90
+ // ) => {
91
+ export const InfiniteTableComponent = React.memo(
92
+ function InfiniteTableComponent<T>() {
93
+ const context = useInfiniteTable<T>();
94
+ const { componentState, getComputed, computed, imperativeApi } = context;
95
+ const {
96
+ componentState: { loading, dataArray },
97
+ getState: getDataSourceState,
98
+ componentActions: dataSourceActions,
99
+ } = useDataSourceContextValue<T>();
100
+
101
+ const {
102
+ domRef,
103
+ scrollerDOMRef,
104
+ portalDOMRef,
105
+
106
+ licenseKey,
107
+ loadingText,
108
+
109
+ header,
110
+ onRowHeightCSSVarChange,
111
+ onColumnHeaderHeightCSSVarChange,
112
+ rowHeightCSSVar,
113
+ columnHeaderHeightCSSVar,
114
+ components,
115
+ scrollStopDelay,
116
+ brain,
117
+ headerBrain,
118
+ renderer,
119
+ keyboardNavigation,
120
+ activeRowIndex,
121
+ activeCellIndex,
122
+ onRenderUpdater,
123
+ } = componentState;
124
+
125
+ useScrollToActiveRow(activeRowIndex, dataArray.length, imperativeApi);
126
+ useScrollToActiveCell(activeCellIndex, dataArray.length, imperativeApi);
127
+ // useRowSelection();
128
+
129
+ const { onKeyDown } = useDOMEventHandlers<T>();
130
+
131
+ const { bodySize } = componentState;
132
+
133
+ const { scrollbars } = computed;
134
+
135
+ const { renderCell } = useCellRendering({
136
+ imperativeApi,
137
+ getComputed,
138
+ domRef: componentState.domRef,
139
+
140
+ bodySize,
141
+ computed,
142
+ });
143
+
144
+ React.useEffect(() => {
145
+ const dataSourceState = getDataSourceState();
146
+ const onChange = debounce(
147
+ (renderRange: [number, number]) => {
148
+ dataSourceState.notifyRenderRangeChange({
149
+ renderStartIndex: renderRange[0],
150
+ renderEndIndex: renderRange[1],
151
+ });
152
+ },
153
+ { wait: scrollStopDelay },
154
+ );
155
+
156
+ return brain.onVerticalRenderRangeChange(onChange);
157
+ }, [brain, scrollStopDelay]);
158
+
159
+ const licenseValid = useLicense(licenseKey);
160
+
161
+ const domProps = useDOMProps<T>(componentState.domProps);
162
+
163
+ const LoadMaskCmp = components?.LoadMask ?? LoadMask;
164
+
165
+ React.useEffect(() => {
166
+ brain.setScrollStopDelay(scrollStopDelay);
167
+ dataSourceActions.scrollStopDelayUpdatedByTable = scrollStopDelay;
168
+ }, [scrollStopDelay]);
169
+
170
+ useAutoSizeColumns();
171
+
172
+ const { menuPortal } = useColumnMenu();
173
+
174
+ React.useEffect(() => {
175
+ if (
176
+ typeof (globalThis as any)
177
+ .__DO_NOT_USE_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_IS_READY === 'function'
178
+ ) {
179
+ (
180
+ globalThis as any
181
+ ).__DO_NOT_USE_UNLESS_YOU_KNOW_WHAT_YOURE_DOING_IS_READY(
182
+ componentState.id,
183
+ componentState.ready,
184
+ );
185
+ }
186
+ }, [componentState.ready]);
187
+
188
+ return (
189
+ <div onKeyDown={onKeyDown} ref={domRef} {...domProps}>
190
+ {header ? (
191
+ <TableHeaderWrapper
192
+ bodyBrain={brain}
193
+ headerBrain={headerBrain}
194
+ scrollbars={scrollbars}
195
+ />
196
+ ) : null}
197
+
198
+ <InfiniteTableBody>
199
+ <HeadlessTable
200
+ tabIndex={0}
201
+ activeRowIndex={
202
+ componentState.ready && keyboardNavigation === 'row'
203
+ ? activeRowIndex
204
+ : null
205
+ }
206
+ activeCellIndex={
207
+ componentState.ready &&
208
+ keyboardNavigation === 'cell' &&
209
+ // we want to hide the active cell indicator while column reodering is happening
210
+ !componentState.columnReorderDragColumnId
211
+ ? activeCellIndex
212
+ : null
213
+ }
214
+ scrollStopDelay={scrollStopDelay}
215
+ renderer={renderer}
216
+ onRenderUpdater={onRenderUpdater}
217
+ brain={brain}
218
+ renderCell={renderCell}
219
+ cellHoverClassNames={HOVERED_CLASS_NAMES}
220
+ scrollerDOMRef={scrollerDOMRef}
221
+ ></HeadlessTable>
222
+
223
+ <LoadMaskCmp visible={loading}>{loadingText}</LoadMaskCmp>
224
+ </InfiniteTableBody>
225
+
226
+ <div
227
+ data-name="pinned-start-border"
228
+ className={PinnedStartIndicatorBorder}
229
+ />
230
+ <div
231
+ data-name="pinned-end-border"
232
+ className={PinnedEndIndicatorBorder}
233
+ />
234
+ <div
235
+ ref={portalDOMRef as RefObject<HTMLDivElement>}
236
+ className={join(
237
+ `${rootClassName}Portal`,
238
+ zIndex[10_000_000],
239
+ position.absolute,
240
+ top[0],
241
+ left[0],
242
+ )}
243
+ >
244
+ {menuPortal}
245
+ </div>
246
+ {rowHeightCSSVar ? (
247
+ <CSSVariableWatch
248
+ varName={rowHeightCSSVar}
249
+ onChange={onRowHeightCSSVarChange}
250
+ />
251
+ ) : null}
252
+ {columnHeaderHeightCSSVar ? (
253
+ <CSSVariableWatch
254
+ varName={columnHeaderHeightCSSVar}
255
+ onChange={onColumnHeaderHeightCSSVarChange}
256
+ />
257
+ ) : null}
258
+ <InfiniteTableFooter />
259
+ {licenseValid ? null : <InfiniteTableLicenseFooter />}
260
+ </div>
261
+ );
262
+ },
263
+ );
264
+ function InfiniteTableContextProvider<T>() {
265
+ const { componentActions, componentState } =
266
+ useComponentState<InfiniteTableState<T>>();
267
+
268
+ const { scrollerDOMRef, scrollTopKey } = componentState;
269
+
270
+ const computed = useComputed<T>();
271
+ const getComputed = useLatest(computed);
272
+ const getState = useLatest(componentState);
273
+
274
+ if (__DEV__) {
275
+ (globalThis as any).getState = getState;
276
+ (globalThis as any).getComputed = getComputed;
277
+ (globalThis as any).componentActions = componentActions;
278
+ }
279
+
280
+ const { getState: getDataSourceState, componentActions: dataSourceActions } =
281
+ useDataSourceContextValue<T>();
282
+
283
+ const [imperativeApi] = React.useState(() => {
284
+ return getImperativeApi({
285
+ getComputed,
286
+ getState,
287
+ getDataSourceState,
288
+ componentActions,
289
+ dataSourceActions,
290
+ });
291
+ });
292
+
293
+ const contextValue: InfiniteTableContextValue<T> = {
294
+ componentActions,
295
+ componentState,
296
+ computed,
297
+ getComputed,
298
+ getState,
299
+ imperativeApi,
300
+ };
301
+
302
+ useResizeObserver(
303
+ scrollerDOMRef,
304
+ (size) => {
305
+ const bodySize = {
306
+ width: size.width, //- reservedScrollSpace,
307
+ height: size.height,
308
+ };
309
+
310
+ // TODO this was here before, but cant remember why
311
+ // bodySize.width = scrollerDOMRef.current?.scrollWidth ?? bodySize.width;
312
+
313
+ componentActions.bodySize = bodySize;
314
+ },
315
+ { earlyAttach: true, debounce: 50 },
316
+ );
317
+
318
+ React.useEffect(() => {
319
+ if (scrollerDOMRef.current) {
320
+ scrollerDOMRef.current.scrollTop = 0;
321
+ }
322
+ }, [scrollTopKey, scrollerDOMRef]);
323
+
324
+ const TableContext = getInfiniteTableContext<T>();
325
+
326
+ return (
327
+ <TableContext.Provider value={contextValue}>
328
+ <InfiniteTableComponent />
329
+ </TableContext.Provider>
330
+ );
331
+ }
332
+
333
+ export function InfiniteTable<T>(props: InfiniteTableProps<T>) {
334
+ const table = (
335
+ //@ts-ignore
336
+ <InfiniteTableRoot {...props}>
337
+ <InfiniteTableContextProvider />
338
+ </InfiniteTableRoot>
339
+ );
340
+ if (__DEV__) {
341
+ return <React.StrictMode>{table}</React.StrictMode>;
342
+ }
343
+ return table;
344
+ }
345
+ InfiniteTable.defaultProps = {
346
+ rowHeight: 40,
347
+ columnHeaderHeight: toCSSVarName(columnHeaderHeightName),
348
+ };
349
+
350
+ export * from './types';
351
+
352
+ export { useInfiniteColumnCell, useInfiniteHeaderCell };
@@ -0,0 +1,4 @@
1
+ export const rootClassName = 'Infinite';
2
+ export const internalProps = {
3
+ rootClassName,
4
+ };
@@ -0,0 +1,29 @@
1
+ import type { InfiniteTablePropColumnGroupsMap } from '../types/InfiniteTableProps';
2
+ import type { InfiniteTableColumnGroupsDepthsMap } from '../types/InfiniteTableState';
3
+
4
+ export function computeColumnGroupsDepths(
5
+ columnGroups: InfiniteTablePropColumnGroupsMap,
6
+ ): InfiniteTableColumnGroupsDepthsMap {
7
+ const map = new Map();
8
+
9
+ columnGroups.forEach((colGroup, colGroupId) => {
10
+ let parentGroupId = colGroup.columnGroup;
11
+ let depth = 0;
12
+
13
+ while (parentGroupId) {
14
+ const parent = columnGroups.get(parentGroupId);
15
+
16
+ if (!parent) {
17
+ if (__DEV__) {
18
+ console.warn(`Cannot find column group ${parentGroupId}`);
19
+ }
20
+ break;
21
+ }
22
+ depth++;
23
+ parentGroupId = parent.columnGroup;
24
+ }
25
+ map.set(colGroupId, depth);
26
+ });
27
+
28
+ return map;
29
+ }