@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,562 @@
1
+ import { InfiniteTableComputedColumn } from '../InfiniteTable';
2
+ import { InfiniteTablePropColumnSizing } from '../InfiniteTable/types/InfiniteTableProps';
3
+ import { RequireAtLeastOne } from '../InfiniteTable/types/Utility';
4
+
5
+ type FlexItem = {
6
+ size?: number | null;
7
+ flex?: number | null;
8
+ maxSize?: number | null;
9
+ minSize?: number | null;
10
+ };
11
+
12
+ type FlexItemWithSizeOrFlex = RequireAtLeastOne<FlexItem, 'size' | 'flex'>;
13
+
14
+ type FlexComputeParams = {
15
+ availableSize: number;
16
+ minSize?: number;
17
+ maxSize?: number;
18
+ items: FlexItemWithSizeOrFlex[];
19
+ computeSpecialSpaceDistribution?: boolean;
20
+ };
21
+
22
+ type SizedFlexItem = FlexItem & {
23
+ flexSize?: number;
24
+ computedSize?: number;
25
+ };
26
+
27
+ type FlexComputeResult = {
28
+ items: SizedFlexItem[];
29
+ flexSizes: number[];
30
+ computedSizes: number[];
31
+ minSizes: (number | undefined)[];
32
+ maxSizes: (number | undefined)[];
33
+ remainingSize: number;
34
+ };
35
+
36
+ export const computeFlex = (params: FlexComputeParams): FlexComputeResult => {
37
+ const {
38
+ availableSize,
39
+ items,
40
+ minSize: defaultMinSize,
41
+ maxSize: defaultMaxSize,
42
+ } = params;
43
+
44
+ if (availableSize < 0) {
45
+ throw 'The provided availableSize cannot be negative!';
46
+ }
47
+
48
+ let totalFixedSize = 0;
49
+ let totalFlex = 0;
50
+ let totalFlexCount = 0;
51
+
52
+ const minSizes: (number | undefined)[] = [];
53
+ const maxSizes: (number | undefined)[] = [];
54
+
55
+ items.forEach((item, i) => {
56
+ let maxSize = item.maxSize ?? defaultMaxSize ?? undefined;
57
+ let minSize = item.minSize ?? defaultMinSize ?? undefined;
58
+
59
+ minSizes.push(minSize);
60
+ maxSizes.push(maxSize);
61
+
62
+ if (item.size != null) {
63
+ if (maxSize != null && item.size > maxSize) {
64
+ item.size = maxSize;
65
+ }
66
+ if (minSize != null && item.size < minSize) {
67
+ item.size = minSize;
68
+ }
69
+ }
70
+
71
+ const itemFlex = item.flex == 0 ? null : item.flex;
72
+
73
+ if (item.size == null && itemFlex == null) {
74
+ throw `Items must specify either a size or a flex property. Item at index ${i} doesn't have either of those.`;
75
+ }
76
+
77
+ if (itemFlex != null) {
78
+ totalFlexCount += 1;
79
+ }
80
+
81
+ totalFlex += itemFlex ?? 0;
82
+ totalFixedSize += item.size ?? 0;
83
+ });
84
+
85
+ let availableSizeForFlex = params.computeSpecialSpaceDistribution
86
+ ? Math.max(availableSize, 0)
87
+ : Math.max(availableSize - totalFixedSize, 0);
88
+ let sizePerFlex = availableSizeForFlex / totalFlex;
89
+
90
+ // now we need another iteration in order to adjust constrained items
91
+ let maxxedFlexItems: { [key: number]: boolean } = {};
92
+ let minnedFlexItems: { [key: number]: boolean } = {};
93
+ let constrainedCount = 0;
94
+
95
+ items.forEach((item, index) => {
96
+ if (item.flex != null) {
97
+ const approxFlexSize = sizePerFlex * item.flex;
98
+ let maxSize = item.maxSize ?? defaultMaxSize ?? undefined;
99
+ let minSize = item.minSize ?? defaultMinSize ?? undefined;
100
+
101
+ let constrained: boolean = false;
102
+ let substractSize = 0;
103
+
104
+ if (maxSize != null && approxFlexSize > maxSize) {
105
+ maxxedFlexItems[index] = true;
106
+ constrained = true;
107
+ substractSize = maxSize;
108
+ }
109
+
110
+ if (minSize != null && approxFlexSize < minSize) {
111
+ minnedFlexItems[index] = true;
112
+ constrained = true;
113
+ substractSize = minSize;
114
+ }
115
+
116
+ if (constrained) {
117
+ constrainedCount += 1;
118
+ // no longer will be considered a flex item
119
+ // so substract it from the count
120
+ totalFlexCount -= 1;
121
+ totalFlex -= item.flex;
122
+ availableSizeForFlex -= substractSize;
123
+ }
124
+ }
125
+ });
126
+
127
+ // adjust those calculations we did previously
128
+ if (constrainedCount) {
129
+ sizePerFlex = availableSizeForFlex / totalFlex;
130
+ }
131
+
132
+ let flexSizes: number[] = [];
133
+ let currentFlexCount = 0;
134
+ let remainingSizeForFlex = availableSizeForFlex;
135
+ let remainingFlex = totalFlex;
136
+
137
+ let totalTakenSize = 0;
138
+
139
+ let flexSizeSum = 0;
140
+
141
+ const computedSizes: number[] = [];
142
+
143
+ const resultItems: SizedFlexItem[] = items.map((item, index) => {
144
+ const sizedItem: SizedFlexItem = { ...item };
145
+
146
+ let maxSize = item.maxSize ?? defaultMaxSize ?? undefined;
147
+ let minSize = item.minSize ?? defaultMinSize ?? undefined;
148
+
149
+ let flexSize = 0;
150
+ const maxxed = maxxedFlexItems[index];
151
+ const minned = minnedFlexItems[index];
152
+ const constrained = maxxed || minned;
153
+
154
+ let computedSize = item.size ?? 0;
155
+
156
+ if (item.flex != null) {
157
+ if (constrained) {
158
+ if (minned) {
159
+ flexSize = minSize!;
160
+ }
161
+ if (maxxed) {
162
+ flexSize = maxSize!;
163
+ }
164
+ } else {
165
+ currentFlexCount += 1;
166
+
167
+ const constrain = (size: number) => {
168
+ if (maxSize != null && size > maxSize) {
169
+ size = maxSize;
170
+ }
171
+ if (minSize != null && size < minSize) {
172
+ size = minSize;
173
+ }
174
+
175
+ return size;
176
+ };
177
+
178
+ if (currentFlexCount === totalFlexCount) {
179
+ flexSize = constrain(remainingSizeForFlex);
180
+ } else {
181
+ flexSize = constrain(Math.round(item.flex * sizePerFlex));
182
+
183
+ flexSizeSum += flexSize;
184
+ remainingSizeForFlex = availableSizeForFlex - flexSizeSum;
185
+ remainingFlex -= item.flex;
186
+
187
+ sizePerFlex = remainingSizeForFlex / remainingFlex;
188
+ }
189
+ }
190
+
191
+ computedSize = flexSize;
192
+ sizedItem.flexSize = flexSize;
193
+ }
194
+
195
+ flexSizes.push(flexSize);
196
+
197
+ computedSizes.push(computedSize);
198
+
199
+ sizedItem.computedSize = computedSize;
200
+
201
+ totalTakenSize += computedSize;
202
+
203
+ return sizedItem;
204
+ });
205
+
206
+ return {
207
+ items: resultItems,
208
+ flexSizes,
209
+ minSizes,
210
+ maxSizes,
211
+ computedSizes,
212
+ remainingSize: Math.round(availableSize - totalTakenSize),
213
+ };
214
+ };
215
+
216
+ type FlexComputeResizeItem = {
217
+ id: InfiniteTableComputedColumn<any>['id'];
218
+ computedWidth: InfiniteTableComputedColumn<any>['computedWidth'];
219
+ computedFlex: InfiniteTableComputedColumn<any>['computedFlex'];
220
+ computedMinWidth: InfiniteTableComputedColumn<any>['computedMinWidth'];
221
+ computedMaxWidth: InfiniteTableComputedColumn<any>['computedMaxWidth'];
222
+ };
223
+ type FlexComputeResizeParams = {
224
+ items: FlexComputeResizeItem[];
225
+ columnSizing: InfiniteTablePropColumnSizing;
226
+ availableSize: number;
227
+ reservedWidth: number;
228
+ dragHandlePositionAfter: number;
229
+ dragHandleOffset: number;
230
+ shareSpaceOnResize: boolean;
231
+ };
232
+
233
+ type FlexComputeGroupResizeParams = Omit<
234
+ FlexComputeResizeParams,
235
+ 'shareSpaceOnResize' | 'items'
236
+ > & {
237
+ columnGroupSize: number;
238
+ items: (FlexComputeResizeItem & { resizable: boolean })[];
239
+ };
240
+
241
+ export type FlexComputeResizeResult = {
242
+ reservedWidth: number;
243
+ adjustedDiff: number;
244
+ maxReached: boolean;
245
+ minReached: boolean;
246
+ constrained: boolean;
247
+ columnSizing: InfiniteTablePropColumnSizing;
248
+ };
249
+
250
+ export type FlexComputeGroupResizeResult = {
251
+ reservedWidth: number;
252
+ adjustedDiffs: number[];
253
+ adjustedDiff: number;
254
+ maxReached: boolean;
255
+ minReached: boolean;
256
+ constrained: boolean;
257
+ columnSizing: InfiniteTablePropColumnSizing;
258
+ };
259
+
260
+ function resizeClamp(
261
+ value: number,
262
+ min: number | null,
263
+ max: number | null,
264
+ direction: 1 | -1,
265
+ ): { value: number; clamped: 'min' | 'max' | false; diff: number } {
266
+ if (min != null && value <= min) {
267
+ return { value: min, clamped: 'min', diff: (value - min) * direction };
268
+ }
269
+ if (max != null && value >= max) {
270
+ return { value: max, clamped: 'max', diff: (max - value) * direction };
271
+ }
272
+ return { value, clamped: false, diff: 0 };
273
+ }
274
+
275
+ export const computeResize = (
276
+ params: FlexComputeResizeParams,
277
+ ): FlexComputeResizeResult => {
278
+ const { availableSize, reservedWidth = 0 } = params;
279
+
280
+ const columnSizing: InfiniteTablePropColumnSizing = Object.keys(
281
+ params.columnSizing,
282
+ ).reduce((acc, key) => {
283
+ acc[key] = { ...params.columnSizing[key] };
284
+ return acc;
285
+ }, {} as InfiniteTablePropColumnSizing);
286
+
287
+ if (availableSize < 0) {
288
+ throw 'The provided availableSize cannot be negative!';
289
+ }
290
+
291
+ let dragHandleOffset = params.dragHandleOffset;
292
+
293
+ const firstIndex = params.dragHandlePositionAfter;
294
+ const secondIndex = params.dragHandlePositionAfter + 1;
295
+
296
+ const firstItem = params.items[firstIndex];
297
+ const secondItem: FlexComputeResizeItem | undefined =
298
+ params.items[secondIndex];
299
+
300
+ const firstId = firstItem.id;
301
+ const secondId = secondItem?.id;
302
+
303
+ // the computed width holds the actual size
304
+ const firstSize = firstItem.computedWidth;
305
+ const firstMinSize = firstItem.computedMinWidth;
306
+ const firstMaxSize = firstItem.computedMaxWidth;
307
+ // even though if flex is present, we use it to determine which property to put in the result
308
+ const firstPropertyToAdjust = firstItem.computedFlex ? 'flex' : 'width';
309
+
310
+ const secondSize = secondItem?.computedWidth;
311
+ const secondMinSize = secondItem?.computedMinWidth;
312
+ const secondMaxSize = secondItem?.computedMaxWidth;
313
+ const secondPropertyToAdjust = secondItem?.computedFlex ? 'flex' : 'width';
314
+
315
+ let maxReached = false;
316
+ let minReached = false;
317
+
318
+ const direction = dragHandleOffset > 0 ? 1 : -1;
319
+
320
+ let {
321
+ value: firstAdjustedSize,
322
+ clamped: firstClamped,
323
+ diff: firstDiff,
324
+ } = resizeClamp(
325
+ firstSize + dragHandleOffset,
326
+ firstMinSize,
327
+ firstMaxSize,
328
+ direction,
329
+ );
330
+
331
+ if (params.shareSpaceOnResize) {
332
+ // there's no item on the right side of the handle
333
+ if (secondItem == null) {
334
+ columnSizing[firstId] = {
335
+ ...columnSizing[firstId],
336
+ [firstPropertyToAdjust]: firstAdjustedSize,
337
+ };
338
+
339
+ minReached = firstClamped === 'min';
340
+ maxReached = firstClamped === 'max';
341
+
342
+ const adjustedDiff = firstAdjustedSize - firstSize;
343
+ return {
344
+ adjustedDiff,
345
+ reservedWidth,
346
+ columnSizing,
347
+ minReached,
348
+ maxReached,
349
+ constrained: minReached || maxReached,
350
+ };
351
+ }
352
+ let {
353
+ value: secondAdjustedSize,
354
+ clamped: secondClamped,
355
+ diff: secondDiff,
356
+ } = resizeClamp(
357
+ secondSize - dragHandleOffset,
358
+ secondMinSize,
359
+ secondMaxSize,
360
+ direction,
361
+ );
362
+
363
+ if (firstClamped && secondClamped) {
364
+ // both are clamped, so decide which one to take
365
+ // take the one with the greater diff
366
+ if (Math.abs(firstDiff) > Math.abs(secondDiff)) {
367
+ // first is smaller, so make second not clamped
368
+ secondClamped = false;
369
+ } else {
370
+ // second is smaller, so make first not clamped
371
+ firstClamped = false;
372
+ }
373
+ }
374
+
375
+ if (!firstClamped && !secondClamped) {
376
+ //this is the happy case, so all good
377
+ } else if (firstClamped) {
378
+ const clampResultForSecond = resizeClamp(
379
+ secondSize - dragHandleOffset - firstDiff,
380
+ secondMinSize,
381
+ secondMaxSize,
382
+ direction,
383
+ );
384
+ secondAdjustedSize = clampResultForSecond.value;
385
+ secondClamped = clampResultForSecond.clamped;
386
+ secondDiff = clampResultForSecond.diff;
387
+ } else if (secondClamped) {
388
+ const clampResultForFirst = resizeClamp(
389
+ firstSize + dragHandleOffset + secondDiff,
390
+ firstMinSize,
391
+ firstMaxSize,
392
+ direction,
393
+ );
394
+ firstAdjustedSize = clampResultForFirst.value;
395
+ firstClamped = clampResultForFirst.clamped;
396
+ firstDiff = clampResultForFirst.diff;
397
+ }
398
+
399
+ columnSizing[firstId] = {
400
+ ...columnSizing[firstId],
401
+ [firstPropertyToAdjust]: firstAdjustedSize,
402
+ };
403
+ columnSizing[secondId] = {
404
+ ...columnSizing[secondId],
405
+ [secondPropertyToAdjust]: secondAdjustedSize,
406
+ };
407
+
408
+ minReached = firstClamped === 'min' || secondClamped === 'min';
409
+ maxReached = firstClamped === 'max' || secondClamped === 'max';
410
+ } else {
411
+ columnSizing[firstId] = {
412
+ ...columnSizing[firstId],
413
+ [firstPropertyToAdjust]: firstAdjustedSize,
414
+ };
415
+
416
+ minReached = firstClamped === 'min';
417
+ maxReached = firstClamped === 'max';
418
+ }
419
+
420
+ const adjustedDiff = firstAdjustedSize - firstSize;
421
+ return {
422
+ adjustedDiff,
423
+ reservedWidth: !params.shareSpaceOnResize
424
+ ? reservedWidth - adjustedDiff
425
+ : reservedWidth,
426
+ columnSizing,
427
+ minReached,
428
+ maxReached,
429
+ constrained: minReached || maxReached,
430
+ };
431
+ };
432
+
433
+ function sum(a: number, b: number) {
434
+ return a + b;
435
+ }
436
+
437
+ function cloneColumnSizing(columnSizing: InfiniteTablePropColumnSizing) {
438
+ const newColumnSizing: InfiniteTablePropColumnSizing = Object.keys(
439
+ columnSizing,
440
+ ).reduce((acc, key) => {
441
+ acc[key] = { ...columnSizing[key] };
442
+ return acc;
443
+ }, {} as InfiniteTablePropColumnSizing);
444
+
445
+ return newColumnSizing;
446
+ }
447
+ export const computeGroupResize = (
448
+ params: FlexComputeGroupResizeParams,
449
+ ): FlexComputeGroupResizeResult => {
450
+ const { availableSize, reservedWidth = 0 } = params;
451
+
452
+ const columnSizing: InfiniteTablePropColumnSizing = Object.keys(
453
+ params.columnSizing,
454
+ ).reduce((acc, key) => {
455
+ acc[key] = { ...params.columnSizing[key] };
456
+ return acc;
457
+ }, {} as InfiniteTablePropColumnSizing);
458
+
459
+ if (availableSize < 0) {
460
+ throw 'The provided availableSize cannot be negative!';
461
+ }
462
+
463
+ let dragHandleOffset = params.dragHandleOffset;
464
+
465
+ const beforeIndexes = [...new Array(params.columnGroupSize)]
466
+ .map((_, index) => params.dragHandlePositionAfter - index)
467
+ .reverse();
468
+
469
+ const beforeItems = beforeIndexes.map((i) => params.items[i]);
470
+
471
+ // the computed width holds the actual size
472
+ const beforeSizes = beforeItems.map((item) => item.computedWidth);
473
+
474
+ // even though if flex is present, we use it to determine which property to put in the result
475
+ const beforePropertiesToAdjust = beforeItems.map((item) =>
476
+ item.computedFlex ? 'flex' : 'width',
477
+ );
478
+
479
+ let unresizableWidth = 0;
480
+ const { computedSizes } = computeFlex({
481
+ items: beforeItems.map((item) => {
482
+ if (item.resizable === false) {
483
+ unresizableWidth += item.computedWidth;
484
+ }
485
+ return {
486
+ maxSize: item.computedMaxWidth,
487
+ minSize: item.computedMinWidth,
488
+ flex: item.resizable ? item.computedWidth : null,
489
+ size: 0,
490
+ };
491
+ }),
492
+ computeSpecialSpaceDistribution: true,
493
+ availableSize: Math.max(
494
+ beforeSizes.reduce(sum, 0) + dragHandleOffset - unresizableWidth,
495
+ 0,
496
+ ),
497
+ });
498
+
499
+ const diffsForEachItem = beforeItems.map((item, index) => {
500
+ return computedSizes[index] - item.computedWidth;
501
+ });
502
+
503
+ let groupMinReached = true;
504
+ let groupMaxReached = true;
505
+ let groupConstrained = true;
506
+
507
+ const adjustedDiffs: number[] = [];
508
+
509
+ diffsForEachItem.forEach((diff, i) => {
510
+ const item = beforeItems[i];
511
+
512
+ if (!item.resizable) {
513
+ adjustedDiffs.push(0);
514
+ return;
515
+ }
516
+ const propertyToAdjust = beforePropertiesToAdjust[i];
517
+ const itemSize = beforeSizes[i];
518
+
519
+ const currentColumnSizing = cloneColumnSizing(columnSizing);
520
+ const { maxReached, minReached, constrained, adjustedDiff } = computeResize(
521
+ {
522
+ availableSize: params.availableSize,
523
+ reservedWidth: params.reservedWidth,
524
+ dragHandleOffset: diff,
525
+ // doesn't matter for share space on resize: false
526
+ dragHandlePositionAfter: beforeIndexes[i],
527
+ shareSpaceOnResize: false,
528
+ items: params.items,
529
+ columnSizing: currentColumnSizing,
530
+ },
531
+ );
532
+
533
+ columnSizing[item.id] = {
534
+ ...currentColumnSizing[item.id],
535
+ [propertyToAdjust]: itemSize + adjustedDiff,
536
+ };
537
+
538
+ adjustedDiffs.push(adjustedDiff);
539
+
540
+ if (!maxReached) {
541
+ groupMaxReached = false;
542
+ }
543
+ if (!minReached) {
544
+ groupMinReached = false;
545
+ }
546
+ if (!constrained) {
547
+ groupConstrained = false;
548
+ }
549
+ });
550
+
551
+ const adjustedDiff = adjustedDiffs.reduce(sum, 0);
552
+
553
+ return {
554
+ minReached: groupMinReached,
555
+ maxReached: groupMaxReached,
556
+ constrained: groupConstrained,
557
+ adjustedDiffs,
558
+ adjustedDiff,
559
+ columnSizing,
560
+ reservedWidth: reservedWidth - adjustedDiff,
561
+ };
562
+ };