@infinite-table/infinite-react 0.4.13 → 0.5.0

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 +95 -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,476 @@
1
+ import binarySearch from 'binary-search';
2
+ import { stripVar } from '../../../utils/stripVar';
3
+
4
+ import { MatrixBrain } from '../../VirtualBrain/MatrixBrain';
5
+ import { InternalVars } from '../theme.css';
6
+
7
+ import { InfiniteTableComputedColumn } from '../types';
8
+ import {
9
+ InfiniteTableApi,
10
+ InfiniteTablePropColumnPinning,
11
+ } from '../types/InfiniteTableProps';
12
+ import {
13
+ clearInfiniteColumnReorderDuration,
14
+ restoreInfiniteColumnReorderDuration,
15
+ setInfiniteColumnOffsetWhileReordering,
16
+ setInfiniteVarOnRoot,
17
+ } from '../utils/infiniteDOMUtils';
18
+ import { moveXatY } from '../utils/moveXatY';
19
+ import { progressiveSpeedScroller } from '../utils/progressiveSpeedScroller';
20
+
21
+ type TopLeft = {
22
+ left: number;
23
+ top: number;
24
+ };
25
+ type TopLeftOrNull = TopLeft | null;
26
+
27
+ type MousePosition = {
28
+ clientX: number;
29
+ clientY: number;
30
+ };
31
+
32
+ type ColumnBreakpoint = {
33
+ columnId: string;
34
+ index: number;
35
+ breakpoint: number;
36
+ };
37
+
38
+ export type ReorderDragResult = {
39
+ columnPinning: InfiniteTablePropColumnPinning;
40
+ columnOrder: string[];
41
+ };
42
+
43
+ export type ReorderParams<T> = {
44
+ computedVisibleColumns: InfiniteTableComputedColumn<T>[];
45
+ computedPinnedStartColumns: InfiniteTableComputedColumn<T>[];
46
+ computedPinnedEndColumns: InfiniteTableComputedColumn<T>[];
47
+ computedUnpinnedColumns: InfiniteTableComputedColumn<T>[];
48
+
49
+ computedVisibleColumnsMap: Map<string, InfiniteTableComputedColumn<T>>;
50
+
51
+ brain: MatrixBrain;
52
+
53
+ tableRect: DOMRect;
54
+ /**
55
+ * The rect of the column header which is being dragged
56
+ */
57
+ dragColumnHeaderTargetRect: DOMRect;
58
+
59
+ infiniteDOMNode: HTMLElement;
60
+
61
+ dragColumnId: string;
62
+
63
+ initialMousePosition: MousePosition;
64
+
65
+ imperativeApi: InfiniteTableApi<T>;
66
+
67
+ setProxyPosition: (position: TopLeftOrNull) => void;
68
+ columnOffsetAtIndexCSSVar: string;
69
+ columnWidthAtIndexCSSVar: string;
70
+ };
71
+
72
+ const PROXY_OFFSET = 10;
73
+
74
+ const pinnedStartWidthCSSVar = stripVar(InternalVars.pinnedStartWidth);
75
+ // const pinnedEndWidthCSSVar = stripVar(InternalVars.pinnedEndWidth);
76
+
77
+ export function reorderColumnsOnDrag<T>(params: ReorderParams<T>) {
78
+ const {
79
+ columnOffsetAtIndexCSSVar,
80
+ columnWidthAtIndexCSSVar,
81
+ computedVisibleColumns,
82
+ computedVisibleColumnsMap,
83
+ computedPinnedEndColumns,
84
+ computedPinnedStartColumns,
85
+ dragColumnId,
86
+ infiniteDOMNode,
87
+ brain,
88
+ dragColumnHeaderTargetRect,
89
+ tableRect,
90
+ setProxyPosition,
91
+ imperativeApi,
92
+ } = params;
93
+
94
+ // returns the total width of the pinned start columns
95
+ // we need to take into account that one of them may be the drag column
96
+ // and it might have been dragged out of pinning
97
+ // so we need to substract it
98
+ function getCurrentPinnedWidth(pinned: 'start' | 'end') {
99
+ let currentWidth =
100
+ pinned === 'start' ? pinnedStartInitialWidth : pinnedEndInitialWidth;
101
+
102
+ // the pinning has not changed
103
+ if (initialDragColumnPinned === currentDragColumnPinned) {
104
+ return currentWidth;
105
+ }
106
+ if (currentDragColumnPinned === pinned) {
107
+ // was not pinned, but is now
108
+ return currentWidth + dragColumn.computedWidth;
109
+ }
110
+ if (initialDragColumnPinned === pinned) {
111
+ // was pinned, but by dragging it's no longer pinned
112
+ return currentWidth - dragColumn.computedWidth;
113
+ }
114
+
115
+ return currentWidth;
116
+ }
117
+
118
+ function isColumnVisible(b: ColumnBreakpoint) {
119
+ if (b.index === dragColumnIndex) {
120
+ return true;
121
+ }
122
+ const col = computedVisibleColumns[b.index];
123
+
124
+ if (col.computedPinned) {
125
+ return true;
126
+ }
127
+
128
+ const scrollLeft = brain.getScrollPosition().scrollLeft;
129
+
130
+ return (
131
+ col.computedOffset >= scrollLeft + getCurrentPinnedWidth('start') &&
132
+ col.computedOffset + col.computedWidth <
133
+ scrollLeft + tableRect.width - getCurrentPinnedWidth('end')
134
+ );
135
+ }
136
+
137
+ const getBreakPoints = <T>(columns: InfiniteTableComputedColumn<T>[]) => {
138
+ const breakpoints: ColumnBreakpoint[] = [];
139
+
140
+ columns.forEach((c) => {
141
+ const b = {
142
+ columnId: c.id,
143
+ index: c.computedVisibleIndex,
144
+ breakpoint:
145
+ // tableRect.left +
146
+ c.computedOffset + Math.round(c.computedWidth / 2),
147
+ };
148
+
149
+ if (isColumnVisible(b)) {
150
+ breakpoints.push(b);
151
+ }
152
+ // if (c.computedPinned === 'start' && c.computedLastInCategory) {
153
+ // breakpoints.push({
154
+ // index: c.computedVisibleIndex,
155
+ // breakpoint: c.computedOffset + c.computedWidth,
156
+ // });
157
+ // }
158
+
159
+ // if (c.computedPinned === 'end' && c.computedFirstInCategory) {
160
+ // breakpoints.push({
161
+ // index: c.computedVisibleIndex,
162
+ // breakpoint: c.computedOffset,
163
+ // });
164
+ // }
165
+ });
166
+
167
+ return breakpoints;
168
+ };
169
+
170
+ const initialPinnedStartCount = computedPinnedStartColumns.length;
171
+ let currentPinnedStartCount = initialPinnedStartCount;
172
+
173
+ // const initialPinnedEndCount = computedPinnedEndColumns.length;
174
+ // let currentPinnedEndCount = initialPinnedEndCount;
175
+
176
+ const initialMousePosition: MousePosition = {
177
+ clientX: Math.round(params.initialMousePosition.clientX),
178
+ clientY: Math.round(params.initialMousePosition.clientY),
179
+ };
180
+
181
+ const initialProxyPosition: TopLeft = {
182
+ left:
183
+ initialMousePosition.clientX -
184
+ tableRect.left -
185
+ (initialMousePosition.clientX - dragColumnHeaderTargetRect.left) +
186
+ PROXY_OFFSET,
187
+ top:
188
+ initialMousePosition.clientY -
189
+ tableRect.top -
190
+ (initialMousePosition.clientY - dragColumnHeaderTargetRect.top) +
191
+ PROXY_OFFSET,
192
+ };
193
+
194
+ const initialScrollPosition = brain.getScrollPosition();
195
+
196
+ const initialIndexes = computedVisibleColumns.map(
197
+ (c) => c.computedVisibleIndex,
198
+ );
199
+ let currentIndexes = initialIndexes;
200
+
201
+ const dragColumn = computedVisibleColumnsMap.get(dragColumnId)!;
202
+ const dragColumnIndex = dragColumn.computedVisibleIndex;
203
+ const initialDragColumnPinned = dragColumn?.computedPinned;
204
+
205
+ let currentDropIndex = dragColumnIndex;
206
+ let currentDragColumnPinned = initialDragColumnPinned;
207
+
208
+ const pinnedStartInitialWidth = brain.getFixedStartColsWidth();
209
+ const pinnedEndInitialWidth = brain.getFixedEndColsWidth();
210
+
211
+ let currentMousePosition: MousePosition = initialMousePosition;
212
+ let currentDiff = {
213
+ x: 0,
214
+ y: 0,
215
+ };
216
+
217
+ let dir: -1 | 1 = 1;
218
+ let diffX = 0;
219
+
220
+ function updatePositionAndDiff(mousePosition: MousePosition) {
221
+ const clientX = Math.round(mousePosition.clientX);
222
+ const clientY = Math.round(mousePosition.clientY);
223
+
224
+ if (
225
+ clientX === currentMousePosition.clientX &&
226
+ clientY === currentMousePosition.clientY
227
+ ) {
228
+ return;
229
+ }
230
+
231
+ currentMousePosition = { clientX, clientY };
232
+
233
+ const currentScrollLeft = brain.getScrollPosition().scrollLeft;
234
+
235
+ const scrollLeftDiff = currentScrollLeft - initialScrollPosition.scrollLeft;
236
+
237
+ currentDiff.x =
238
+ currentMousePosition.clientX - initialMousePosition!.clientX;
239
+ currentDiff.y =
240
+ currentMousePosition.clientY - initialMousePosition!.clientY;
241
+
242
+ diffX = currentDiff.x + scrollLeftDiff;
243
+
244
+ dir = diffX < 0 ? -1 : 1;
245
+
246
+ setProxyPosition({
247
+ left: initialProxyPosition.left + currentDiff.x,
248
+ top: initialProxyPosition.top + currentDiff.y,
249
+ });
250
+ }
251
+
252
+ function updatePinnedStartCount(columnIndexes: number[]) {
253
+ let pinnedStartCount = 0;
254
+
255
+ if (!initialDragColumnPinned) {
256
+ columnIndexes.forEach((colIndex, i) => {
257
+ if (computedVisibleColumns[colIndex]?.computedPinned === 'start') {
258
+ pinnedStartCount = i + 1;
259
+ }
260
+ });
261
+ } else if (initialDragColumnPinned === 'start') {
262
+ columnIndexes.forEach((colIndex, i) => {
263
+ if (pinnedStartCount) {
264
+ return;
265
+ }
266
+ if (computedVisibleColumns[colIndex]?.computedPinned !== 'start') {
267
+ pinnedStartCount = i;
268
+ }
269
+ });
270
+ }
271
+
272
+ currentPinnedStartCount = pinnedStartCount;
273
+
274
+ updatePinningMarker('start', columnIndexes, pinnedStartCount);
275
+ }
276
+
277
+ function updatePinningMarker(
278
+ where: 'start', //| 'end' // pinning end marker coming soon
279
+ columnIndexes: number[],
280
+ pinnedCount: number,
281
+ ) {
282
+ if (where === 'start') {
283
+ let width = 0;
284
+
285
+ for (let i = 0; i < pinnedCount; i++) {
286
+ const colIndex = columnIndexes[i];
287
+ const col = computedVisibleColumns[colIndex];
288
+ width += col.computedWidth;
289
+ }
290
+ // update pinned start marker to correct offset/width
291
+ setInfiniteVarOnRoot(
292
+ pinnedStartWidthCSSVar,
293
+ `${width}px`,
294
+ infiniteDOMNode,
295
+ );
296
+ }
297
+ }
298
+
299
+ function updateDropIndex(newDropIndex: number) {
300
+ if (newDropIndex === currentDropIndex) {
301
+ return;
302
+ }
303
+
304
+ currentDropIndex = newDropIndex;
305
+
306
+ const newColumnIndexes = moveXatY(
307
+ initialIndexes,
308
+ dragColumnIndex,
309
+ currentDropIndex > dragColumnIndex
310
+ ? currentDropIndex - 1
311
+ : currentDropIndex,
312
+ );
313
+
314
+ let pinnedStartCount = 0;
315
+ // let pinnedEndCount = 0;
316
+
317
+ currentPinnedStartCount = pinnedStartCount;
318
+ // currentPinnedEndCount = pinnedEndCount;
319
+
320
+ const indexesWithTransition = new Set<number>();
321
+
322
+ newColumnIndexes.forEach((newIndex, i) => {
323
+ const currentIndex = currentIndexes[i];
324
+
325
+ if (newIndex !== currentIndex) {
326
+ indexesWithTransition.add(newIndex);
327
+ }
328
+
329
+ updatePinnedStartCount(newColumnIndexes);
330
+ });
331
+
332
+ currentIndexes = newColumnIndexes;
333
+
334
+ adjustAllOffsets(indexesWithTransition);
335
+
336
+ return {
337
+ newColumnIndexes,
338
+ indexesWithTransition,
339
+ pinnedStartCount: currentPinnedStartCount,
340
+ };
341
+ }
342
+
343
+ function adjustAllOffsets(indexesWithTransition: Set<number>) {
344
+ computedVisibleColumns.forEach((col) => {
345
+ const colIndex = col.computedVisibleIndex;
346
+
347
+ if (indexesWithTransition.has(colIndex)) {
348
+ restoreInfiniteColumnReorderDuration(colIndex, infiniteDOMNode);
349
+ } else {
350
+ clearInfiniteColumnReorderDuration(colIndex, infiniteDOMNode);
351
+ }
352
+
353
+ const isDragColumn = colIndex === dragColumnIndex;
354
+
355
+ let isOutsideCol =
356
+ dir === -1
357
+ ? colIndex < currentDropIndex || colIndex > dragColumnIndex
358
+ : colIndex < dragColumnIndex || colIndex >= currentDropIndex;
359
+
360
+ let newPosition: string = '';
361
+ if (dir === -1) {
362
+ newPosition = isDragColumn
363
+ ? // this is the column we're dragging to the left
364
+ // so we place it exactly at the offset of the currentDropIndex
365
+ `var(${columnOffsetAtIndexCSSVar}-${currentDropIndex})`
366
+ : isOutsideCol
367
+ ? // this col should have the initial pos, so we're good
368
+ `var(${columnOffsetAtIndexCSSVar}-${colIndex})`
369
+ : // place it at the default offset + the width of the drag column
370
+ // as these are columns situated between the dragindex and the dropindex
371
+ `calc( var(${columnOffsetAtIndexCSSVar}-${colIndex}) + var(${columnWidthAtIndexCSSVar}-${dragColumnIndex}) )`;
372
+
373
+ // newColumnIndexes.push(colCurrentIndex);
374
+ } else {
375
+ newPosition = isOutsideCol
376
+ ? // this is the default value for a column
377
+ `var(${columnOffsetAtIndexCSSVar}-${colIndex})`
378
+ : isDragColumn
379
+ ? // this is the column we're dragging to the right
380
+ `calc( var(${columnOffsetAtIndexCSSVar}-${
381
+ currentDropIndex - 1
382
+ }) + var(${columnWidthAtIndexCSSVar}-${
383
+ currentDropIndex - 1
384
+ }) - var(${columnWidthAtIndexCSSVar}-${dragColumnIndex}) )`
385
+ : `calc( var(${columnOffsetAtIndexCSSVar}-${colIndex}) - var(${columnWidthAtIndexCSSVar}-${dragColumnIndex}) )`;
386
+ }
387
+
388
+ setInfiniteColumnOffsetWhileReordering(
389
+ colIndex,
390
+ newPosition,
391
+ infiniteDOMNode,
392
+ );
393
+ });
394
+ }
395
+
396
+ const pinnedStartColsRight = tableRect.left + getCurrentPinnedWidth('start');
397
+ const pinnedEndColsLeft = tableRect.right - getCurrentPinnedWidth('end');
398
+
399
+ const speedScroller = progressiveSpeedScroller({
400
+ scrollOffsetStart: pinnedStartColsRight,
401
+ scrollOffsetEnd: pinnedEndColsLeft,
402
+ });
403
+ updatePositionAndDiff(initialMousePosition);
404
+
405
+ return {
406
+ speedScroller,
407
+ stop() {
408
+ speedScroller.stop();
409
+ },
410
+ onMove(mousePosition: MousePosition): ReorderDragResult {
411
+ updatePositionAndDiff(mousePosition);
412
+
413
+ speedScroller.scroll({
414
+ mousePosition: currentMousePosition,
415
+ get scrollLeft() {
416
+ return brain.getScrollPosition().scrollLeft;
417
+ },
418
+ set scrollLeft(value) {
419
+ imperativeApi.scrollLeft = value;
420
+ },
421
+ });
422
+
423
+ const breakpoints = getBreakPoints(computedVisibleColumns);
424
+
425
+ let currentPos =
426
+ dir === -1
427
+ ? dragColumn.computedOffset + diffX
428
+ : dragColumn.computedOffset + dragColumn.computedWidth + diffX;
429
+
430
+ let idx = binarySearch<{ breakpoint: number }, number>(
431
+ breakpoints,
432
+ currentPos,
433
+ ({ breakpoint }, value) => {
434
+ return breakpoint < value ? -1 : breakpoint > value ? 1 : 0;
435
+ },
436
+ );
437
+ if (idx < 0) {
438
+ idx = ~idx;
439
+ }
440
+
441
+ idx = breakpoints[idx]
442
+ ? breakpoints[idx].index
443
+ : breakpoints[breakpoints.length - 1].index + 1;
444
+
445
+ if (idx != null && idx !== currentDropIndex) {
446
+ if (dir === 1 && currentDropIndex === dragColumnIndex + 1) {
447
+ idx = dragColumnIndex;
448
+ }
449
+
450
+ updateDropIndex(idx);
451
+ }
452
+
453
+ const columnPinning: InfiniteTablePropColumnPinning = {};
454
+
455
+ // will need to adjust pinning end to take into account the count of pinned end cols after the drag
456
+ // but for now, we don't support column reordering when we have pinned end cols
457
+ computedPinnedEndColumns.forEach((col) => {
458
+ columnPinning[col.id] = 'end';
459
+ });
460
+
461
+ for (let i = 0; i < currentPinnedStartCount; i++) {
462
+ const colIndex = currentIndexes[i];
463
+ const col = computedVisibleColumns[colIndex];
464
+ columnPinning[col.id] = 'start';
465
+ }
466
+
467
+ const columnOrder = currentIndexes.map((colIndex) => {
468
+ return computedVisibleColumns[colIndex].id;
469
+ });
470
+ return {
471
+ columnPinning,
472
+ columnOrder,
473
+ };
474
+ },
475
+ };
476
+ }
@@ -0,0 +1,206 @@
1
+ import {
2
+ MutableRefObject,
3
+ RefObject,
4
+ useEffect,
5
+ useRef,
6
+ useState,
7
+ } from 'react';
8
+
9
+ import { getGlobal } from '../../../utils/getGlobal';
10
+ import { useComponentState } from '../../hooks/useComponentState';
11
+ import { useLatest } from '../../hooks/useLatest';
12
+ import { InfiniteTableHeaderCellClassName } from '../components/InfiniteTableHeader/InfiniteTableHeaderCell';
13
+ import {
14
+ InfiniteTableCellClassName,
15
+ InfiniteTableCellContentClassName,
16
+ } from '../components/InfiniteTableRow/InfiniteTableCell';
17
+ import { InfiniteTablePropColumnSizing, InfiniteTableState } from '../types';
18
+ import { cssEllipsisClassName } from '../utilities.css';
19
+
20
+ const OFFSET = 10;
21
+
22
+ function getColumnContentMaxWidths(
23
+ domRef: RefObject<HTMLElement>,
24
+ options: {
25
+ includeHeader: boolean;
26
+ columnsToSkip?: Set<string>;
27
+ columnsToResize?: Set<string>;
28
+ },
29
+ ) {
30
+ const { includeHeader, columnsToResize, columnsToSkip } = options;
31
+ const query = `.${InfiniteTableCellClassName} > .${InfiniteTableCellContentClassName}`;
32
+
33
+ const match = domRef.current?.querySelectorAll(query);
34
+
35
+ const measuredMaxWidths: Record<string, number> = {};
36
+
37
+ const computedPaddingsForColumns: Record<string, number> = {};
38
+
39
+ if (match && match.length) {
40
+ match.forEach((content) => {
41
+ const cell = content.parentElement!;
42
+ const isHeader = cell.matches(`.${InfiniteTableHeaderCellClassName}`);
43
+ if (includeHeader === false && isHeader) {
44
+ return;
45
+ }
46
+
47
+ const colId = cell.getAttribute('data-column-id') as string;
48
+
49
+ const contentClone = content.cloneNode(true) as HTMLElement;
50
+ contentClone.style.visibility = 'hidden';
51
+ contentClone.style.pointerEvents = 'none';
52
+
53
+ contentClone.classList.remove(...cssEllipsisClassName.split(' '));
54
+ contentClone.style.position = 'absolute';
55
+ contentClone.style.width = 'auto';
56
+
57
+ cell.appendChild(contentClone);
58
+ let measuredWidth = contentClone.offsetWidth;
59
+ cell.removeChild(contentClone);
60
+
61
+ if (!computedPaddingsForColumns[colId]) {
62
+ const cellComputedStyle = getGlobal().getComputedStyle(cell);
63
+ computedPaddingsForColumns[colId] =
64
+ parseInt(cellComputedStyle.paddingLeft, 10) +
65
+ parseInt(cellComputedStyle.paddingRight, 10) +
66
+ parseInt(cellComputedStyle.borderLeftWidth, 10) +
67
+ parseInt(cellComputedStyle.borderRightWidth, 10) +
68
+ OFFSET;
69
+ }
70
+
71
+ measuredWidth += computedPaddingsForColumns[colId]!;
72
+
73
+ if (isHeader) {
74
+ let otherElementsLength = 0;
75
+ cell.childNodes.forEach((child) => {
76
+ if (child !== content) {
77
+ const el = child as HTMLElement;
78
+ let elWidth = Math.max(
79
+ el.offsetWidth,
80
+ parseInt(el.style.width, 10),
81
+ );
82
+ if (isNaN(elWidth)) {
83
+ elWidth = 0;
84
+ }
85
+
86
+ otherElementsLength += elWidth;
87
+
88
+ if (elWidth > 0) {
89
+ const style = getGlobal().getComputedStyle(el);
90
+ otherElementsLength +=
91
+ parseInt(style.marginLeft, 10) +
92
+ parseInt(style.marginRight, 10);
93
+ }
94
+ }
95
+ });
96
+ measuredWidth += otherElementsLength;
97
+ }
98
+
99
+ if (columnsToSkip && columnsToSkip.has(colId)) {
100
+ return;
101
+ }
102
+ if (columnsToResize && !columnsToResize.has(colId)) {
103
+ return;
104
+ }
105
+
106
+ measuredMaxWidths[colId] = Math.max(
107
+ measuredWidth,
108
+ measuredMaxWidths[colId] || 0,
109
+ );
110
+ });
111
+ }
112
+ return measuredMaxWidths;
113
+ }
114
+
115
+ export function useAutoSizeColumns<T>() {
116
+ const {
117
+ getComponentState,
118
+ componentActions,
119
+ componentState: { domRef, ready, autoSizeColumnsKey, brain },
120
+ } = useComponentState<InfiniteTableState<T>>();
121
+
122
+ const [refreshId, setRefreshId] = useState(0);
123
+
124
+ const theKey =
125
+ typeof autoSizeColumnsKey === 'object'
126
+ ? autoSizeColumnsKey.key
127
+ : autoSizeColumnsKey;
128
+
129
+ const getTheKey = useLatest<typeof theKey>(theKey);
130
+
131
+ const lastExecutedIdentifierRef: MutableRefObject<string | number | null> =
132
+ useRef(null);
133
+
134
+ useEffect(() => {
135
+ const key = getTheKey();
136
+ if (key == null) {
137
+ return;
138
+ }
139
+
140
+ const { current } = lastExecutedIdentifierRef;
141
+
142
+ const onChange = () => {
143
+ if (autoSizeColumnsKey !== current) {
144
+ setRefreshId(refreshId + 1);
145
+ }
146
+ };
147
+
148
+ return brain.onRenderRangeChange(onChange);
149
+ }, [brain]);
150
+
151
+ useEffect(() => {
152
+ if (theKey == null) {
153
+ return;
154
+ }
155
+
156
+ const { autoSizeColumnsKey } = getComponentState();
157
+
158
+ let columnsToResize: Set<string> | undefined;
159
+ let columnsToSkip: Set<string> | undefined;
160
+
161
+ let includeHeader = true;
162
+
163
+ if (typeof autoSizeColumnsKey === 'object') {
164
+ if (autoSizeColumnsKey.columnsToResize) {
165
+ columnsToResize = new Set(autoSizeColumnsKey.columnsToResize);
166
+ }
167
+ if (autoSizeColumnsKey.columnsToSkip) {
168
+ columnsToSkip = new Set(autoSizeColumnsKey.columnsToSkip);
169
+ }
170
+ includeHeader = autoSizeColumnsKey.includeHeader ?? includeHeader;
171
+ }
172
+
173
+ lastExecutedIdentifierRef.current = theKey;
174
+
175
+ const measuredMaxWidths = getColumnContentMaxWidths(domRef, {
176
+ includeHeader,
177
+ columnsToResize,
178
+ columnsToSkip,
179
+ });
180
+
181
+ const colIds = Object.keys(measuredMaxWidths);
182
+
183
+ if (!colIds.length) {
184
+ return;
185
+ }
186
+
187
+ const columnSizing = getComponentState().columnSizing;
188
+ const newColumnSizing: InfiniteTablePropColumnSizing = {
189
+ ...columnSizing,
190
+ };
191
+
192
+ let changed = false;
193
+
194
+ colIds.forEach((colId) => {
195
+ newColumnSizing[colId] = {
196
+ width: measuredMaxWidths[colId],
197
+ };
198
+ changed =
199
+ changed || newColumnSizing[colId].width !== columnSizing[colId]?.width;
200
+ });
201
+
202
+ if (changed) {
203
+ componentActions.columnSizing = newColumnSizing;
204
+ }
205
+ }, [theKey, ready, refreshId]);
206
+ }