@infinite-table/infinite-react 0.4.12 → 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 -13689
  282. package/index.js +0 -13560
@@ -0,0 +1,95 @@
1
+ import type { KeyboardEvent, MouseEvent } from 'react';
2
+ import { useCallback, useMemo, useEffect } from 'react';
3
+ import { useDataSourceContextValue } from '../../DataSource/publicHooks/useDataSource';
4
+ import { CellPosition } from '../../types/CellPosition';
5
+ import { cloneRowSelection } from '../api/getSelectionApi';
6
+ import { useInfiniteTable } from '../hooks/useInfiniteTable';
7
+ import { InfiniteTableEventHandlerContext } from './eventHandlerTypes';
8
+ import { onCellClick } from './onCellClick';
9
+ import { onKeyDown } from './onKeyDown';
10
+
11
+ function useEventHandlersContext<T>() {
12
+ const {
13
+ getState,
14
+ componentActions: actions,
15
+ imperativeApi,
16
+ getComputed,
17
+ } = useInfiniteTable<T>();
18
+ const { getState: getDataSourceState, componentActions: dataSourceActions } =
19
+ useDataSourceContextValue<T>();
20
+
21
+ const context = useMemo(() => {
22
+ const context: InfiniteTableEventHandlerContext<T> = {
23
+ getComputed,
24
+ api: imperativeApi,
25
+ getState,
26
+ actions,
27
+ getDataSourceState,
28
+ dataSourceActions,
29
+ cloneRowSelection: (rowSelection) => {
30
+ return cloneRowSelection<T>(rowSelection, getDataSourceState);
31
+ },
32
+ };
33
+ return context;
34
+ }, [getState, actions, getDataSourceState, dataSourceActions]);
35
+
36
+ return context;
37
+ }
38
+
39
+ function handleDOMEvents<T>() {
40
+ const context = useEventHandlersContext<T>();
41
+
42
+ useEffect(() => {
43
+ const removeOnKeyDown = context.getState().keyDown.onChange((event) => {
44
+ onKeyDown(context, event!);
45
+ });
46
+
47
+ function cellClickHandler(
48
+ cellClickParam: (CellPosition & { event: MouseEvent<Element> }) | null,
49
+ ) {
50
+ if (!cellClickParam) {
51
+ return;
52
+ }
53
+ const event = cellClickParam.event;
54
+ const virtualEvent = {
55
+ metaKey: event.metaKey,
56
+ ctrlKey: event.ctrlKey,
57
+ shiftKey: event.shiftKey,
58
+ key: '',
59
+ preventDefault: () => event.preventDefault(),
60
+ };
61
+
62
+ onCellClick(
63
+ {
64
+ ...context,
65
+ rowIndex: cellClickParam.rowIndex,
66
+ colIndex: cellClickParam.colIndex,
67
+ },
68
+ virtualEvent,
69
+ );
70
+ }
71
+ const removeOnCellClick = context
72
+ .getState()
73
+ .cellClick.onChange(cellClickHandler);
74
+
75
+ return () => {
76
+ removeOnKeyDown();
77
+ removeOnCellClick();
78
+ };
79
+ }, []);
80
+ }
81
+
82
+ function subscribeToDOMEvents<T>() {
83
+ const { getState } = useInfiniteTable<T>();
84
+
85
+ const onKeyDown = useCallback((event: KeyboardEvent<Element>) => {
86
+ getState().keyDown(event);
87
+ }, []);
88
+
89
+ return { onKeyDown };
90
+ }
91
+
92
+ export function useDOMEventHandlers<T>() {
93
+ handleDOMEvents<T>();
94
+ return subscribeToDOMEvents<T>();
95
+ }
@@ -0,0 +1,232 @@
1
+ import { clamp } from '../../utils/clamp';
2
+ import { InfiniteTableKeyboardEventHandlerContext } from './eventHandlerTypes';
3
+
4
+ export function handleRowNavigation<T>(
5
+ options: InfiniteTableKeyboardEventHandlerContext<T>,
6
+ event: {
7
+ key: string;
8
+ },
9
+ ) {
10
+ const { getState, getDataSourceState, actions, api } = options;
11
+ const { key } = event;
12
+ const dataArray = getDataSourceState().dataArray;
13
+ const arrLength = dataArray.length;
14
+ const state = getState();
15
+
16
+ const { brain } = state;
17
+ let { activeRowIndex } = state;
18
+
19
+ if (activeRowIndex == null) {
20
+ return false;
21
+ }
22
+
23
+ const {
24
+ start: [startRow],
25
+ end: [endRow],
26
+ } = brain.getRenderRange();
27
+
28
+ const renderRowCount = endRow - startRow - 1;
29
+
30
+ const min = 0;
31
+ const max = arrLength - 1;
32
+ const KeyToFunction = {
33
+ ArrowDown: () => {
34
+ activeRowIndex = clamp(activeRowIndex! + 1, min, max);
35
+ },
36
+ ArrowUp: () => {
37
+ activeRowIndex = clamp(activeRowIndex! - 1, min, max);
38
+ },
39
+ ArrowLeft: () => {
40
+ const rowInfo = dataArray[activeRowIndex!];
41
+ if (rowInfo && rowInfo.isGroupRow) {
42
+ return api.collapseGroupRow(rowInfo.groupKeys);
43
+ }
44
+ return false;
45
+ },
46
+ ArrowRight: () => {
47
+ const rowInfo = dataArray[activeRowIndex!];
48
+ if (rowInfo && rowInfo.isGroupRow) {
49
+ return api.expandGroupRow(rowInfo.groupKeys);
50
+ }
51
+ return false;
52
+ },
53
+ Enter: () => {
54
+ const rowInfo = dataArray[activeRowIndex!];
55
+ if (rowInfo && rowInfo.isGroupRow) {
56
+ return api.toggleGroupRow(rowInfo.groupKeys);
57
+ }
58
+ return false;
59
+ },
60
+ PageDown: () => {
61
+ activeRowIndex = Math.min(
62
+ activeRowIndex! + renderRowCount,
63
+ arrLength - 1,
64
+ );
65
+ },
66
+ PageUp: () => {
67
+ activeRowIndex = Math.max(activeRowIndex! - renderRowCount, min);
68
+ },
69
+ End: () => {
70
+ activeRowIndex = max;
71
+ },
72
+ Home: () => {
73
+ activeRowIndex = min;
74
+ },
75
+ };
76
+
77
+ const Fn = KeyToFunction[key as keyof typeof KeyToFunction];
78
+
79
+ if (!Fn) {
80
+ return false;
81
+ }
82
+
83
+ Fn();
84
+
85
+ actions.activeRowIndex = activeRowIndex;
86
+
87
+ return true;
88
+ }
89
+
90
+ export function handleCellNavigation<T>(
91
+ options: InfiniteTableKeyboardEventHandlerContext<T>,
92
+ event: { key: string; shiftKey: boolean },
93
+ ) {
94
+ const {
95
+ api,
96
+
97
+ getState,
98
+ getComputed,
99
+ getDataSourceState,
100
+ actions,
101
+ } = options;
102
+ const { key, shiftKey } = event;
103
+
104
+ const dataArray = getDataSourceState().dataArray;
105
+ const state = getState();
106
+ const { activeCellIndex, brain } = state;
107
+ if (!activeCellIndex) {
108
+ return false;
109
+ }
110
+
111
+ let [rowIndex, colIndex] = activeCellIndex;
112
+
113
+ const {
114
+ start: [startRow, startCol],
115
+ end: [endRow, endCol],
116
+ } = brain.getRenderRange();
117
+
118
+ const renderRowCount = endRow - startRow - 1;
119
+ const renderColCount = endCol - startCol - 1;
120
+
121
+ const maxRow = getDataSourceState().dataArray.length - 1;
122
+ const maxCol = getComputed().computedVisibleColumns.length - 1;
123
+
124
+ const minRow = 0;
125
+ const minCol = 0;
126
+
127
+ rowIndex = clamp(rowIndex, 0, maxRow);
128
+ colIndex = clamp(colIndex, 0, maxCol);
129
+
130
+ actions.activeCellIndex = [rowIndex, colIndex];
131
+
132
+ const KeyToFunction = {
133
+ ArrowDown: () => {
134
+ rowIndex = clamp(rowIndex + 1, minRow, maxRow);
135
+ },
136
+ ArrowUp: () => {
137
+ rowIndex = clamp(rowIndex - 1, minRow, maxRow);
138
+ },
139
+ ArrowLeft: () => {
140
+ colIndex = clamp(colIndex - 1, minCol, maxCol);
141
+ },
142
+ ArrowRight: () => {
143
+ colIndex = clamp(colIndex + 1, minCol, maxCol);
144
+ },
145
+ Enter: () => {
146
+ const rowInfo = dataArray[rowIndex];
147
+ if (rowInfo && rowInfo.isGroupRow) {
148
+ return api.toggleGroupRow(rowInfo.groupKeys);
149
+ }
150
+ return false;
151
+ },
152
+ PageDown: () => {
153
+ if (!shiftKey) {
154
+ rowIndex = Math.min(rowIndex + renderRowCount, maxRow);
155
+ } else {
156
+ colIndex = Math.min(colIndex + renderColCount, maxCol);
157
+ }
158
+ },
159
+ PageUp: () => {
160
+ if (!shiftKey) {
161
+ rowIndex = Math.max(rowIndex - renderRowCount, minRow);
162
+ } else {
163
+ colIndex = Math.max(colIndex - renderColCount, minCol);
164
+ }
165
+ },
166
+ End: () => {
167
+ if (!shiftKey) {
168
+ rowIndex = maxRow;
169
+ } else {
170
+ colIndex = maxCol;
171
+ }
172
+ },
173
+ Home: () => {
174
+ if (!shiftKey) {
175
+ rowIndex = minRow;
176
+ } else {
177
+ colIndex = minCol;
178
+ }
179
+ },
180
+ };
181
+ const Fn = KeyToFunction[key as keyof typeof KeyToFunction];
182
+
183
+ if (!Fn) {
184
+ return false;
185
+ }
186
+
187
+ Fn();
188
+
189
+ actions.activeCellIndex = [rowIndex, colIndex];
190
+
191
+ return true;
192
+ }
193
+
194
+ const validKeys: Record<string, boolean> = {
195
+ ArrowUp: true,
196
+ ArrowDown: true,
197
+ ArrowLeft: true,
198
+ ArrowRight: true,
199
+ PageUp: true,
200
+ PageDown: true,
201
+ Home: true,
202
+ End: true,
203
+ Enter: true,
204
+ ' ': true,
205
+ };
206
+
207
+ export function handleKeyboardNavigation<T>(
208
+ options: InfiniteTableKeyboardEventHandlerContext<T>,
209
+ event: {
210
+ key: string;
211
+ shiftKey: boolean;
212
+ },
213
+ ) {
214
+ const { key } = event;
215
+ const { getState } = options;
216
+ const state = getState();
217
+
218
+ const { activeRowIndex, activeCellIndex, keyboardNavigation } = state;
219
+
220
+ if (!validKeys[key]) {
221
+ return false;
222
+ }
223
+ if (activeRowIndex != null && keyboardNavigation === 'row') {
224
+ return handleRowNavigation(options, event);
225
+ }
226
+
227
+ if (activeCellIndex != null && keyboardNavigation === 'cell') {
228
+ return handleCellNavigation(options, event);
229
+ }
230
+
231
+ return false;
232
+ }
@@ -0,0 +1,110 @@
1
+ import { RowSelectionState } from '../../DataSource';
2
+ import { InfiniteTableEventHandlerAbstractContext } from './eventHandlerTypes';
3
+ import { updateRowSelectionOnCellClick } from './onCellClick';
4
+
5
+ const validKeys: Record<string, boolean> = {
6
+ Enter: true,
7
+ ' ': true,
8
+ a: true,
9
+ };
10
+
11
+ export function handleKeyboardSelection<T>(
12
+ context: InfiniteTableEventHandlerAbstractContext<T>,
13
+ keyboardEvent: {
14
+ key: string;
15
+ metaKey: boolean;
16
+ ctrlKey: boolean;
17
+ shiftKey: boolean;
18
+ preventDefault: VoidFunction;
19
+ },
20
+ ) {
21
+ const {
22
+ getState,
23
+ getDataSourceState,
24
+ dataSourceActions,
25
+ api: imperativeApi,
26
+ cloneRowSelection,
27
+ } = context;
28
+ const { key, ctrlKey, metaKey } = keyboardEvent;
29
+
30
+ if (!validKeys[key]) {
31
+ return false;
32
+ }
33
+
34
+ const state = getState();
35
+ const dataSourceState = getDataSourceState();
36
+
37
+ const {
38
+ activeRowIndex,
39
+ activeCellIndex,
40
+ keyboardNavigation,
41
+ keyboardSelection,
42
+ } = state;
43
+
44
+ const { selectionMode, groupBy, rowSelection } = dataSourceState;
45
+
46
+ if (keyboardSelection === false) {
47
+ return false;
48
+ }
49
+
50
+ const rowIndex =
51
+ keyboardNavigation === 'row' && activeRowIndex != null
52
+ ? activeRowIndex
53
+ : keyboardNavigation === 'cell' && activeCellIndex != null
54
+ ? activeCellIndex[0]
55
+ : null;
56
+
57
+ const rowInfo = rowIndex != null ? dataSourceState.dataArray[rowIndex] : null;
58
+
59
+ if (!rowInfo || rowIndex == null) {
60
+ return false;
61
+ }
62
+
63
+ if (selectionMode === 'single-row' && key === ' ') {
64
+ imperativeApi.selectionApi.toggleRowSelection(rowInfo.id);
65
+ return true;
66
+ }
67
+
68
+ if (selectionMode !== 'multi-row') {
69
+ return false;
70
+ }
71
+
72
+ if (key === 'a' && (ctrlKey || metaKey)) {
73
+ const rowSelectionState = cloneRowSelection(
74
+ rowSelection as RowSelectionState<T>,
75
+ );
76
+
77
+ rowSelectionState.selectAll();
78
+
79
+ dataSourceActions.rowSelection = rowSelectionState;
80
+ return true;
81
+ }
82
+
83
+ if (key === ' ') {
84
+ if (groupBy.length) {
85
+ if (rowInfo.isGroupRow && rowInfo.groupKeys) {
86
+ imperativeApi.selectionApi.toggleGroupRowSelection(rowInfo.groupKeys);
87
+ } else {
88
+ imperativeApi.selectionApi.toggleRowSelection(rowInfo.id);
89
+ }
90
+ return true;
91
+ } else {
92
+ // no grouping, but space should be treated like a mouse click
93
+
94
+ const event = { ...keyboardEvent };
95
+ const { renderSelectionCheckBox } = context.getComputed();
96
+
97
+ // if we have a selection checkbox column, then we wont allow shift be used with the space key
98
+ if (renderSelectionCheckBox) {
99
+ // event.shiftKey = false;
100
+ event.metaKey = false;
101
+ // but rather make the selection only additive
102
+ event.ctrlKey = true;
103
+ }
104
+
105
+ return updateRowSelectionOnCellClick({ ...context, rowIndex }, event);
106
+ }
107
+ }
108
+
109
+ return false;
110
+ }
@@ -0,0 +1,94 @@
1
+ import { RowSelectionState } from '../../DataSource/RowSelectionState';
2
+
3
+ import {
4
+ InfiniteTableCellClickEventHandlerContext,
5
+ InfiniteTableEventHandlerAbstractContext,
6
+ InfiniteTableKeyboardEventHandlerContext,
7
+ } from './eventHandlerTypes';
8
+
9
+ export function onCellClick<T>(
10
+ context: InfiniteTableCellClickEventHandlerContext<T> &
11
+ InfiniteTableKeyboardEventHandlerContext<T>,
12
+ event: {
13
+ key: string;
14
+ metaKey: boolean;
15
+ ctrlKey: boolean;
16
+ shiftKey: boolean;
17
+ preventDefault: VoidFunction;
18
+ },
19
+ ) {
20
+ updateRowSelectionOnCellClick(context, event);
21
+ }
22
+
23
+ export function updateRowSelectionOnCellClick<T>(
24
+ context: InfiniteTableEventHandlerAbstractContext<T> & {
25
+ rowIndex: number;
26
+ },
27
+
28
+ event: {
29
+ key: string;
30
+ metaKey: boolean;
31
+ ctrlKey: boolean;
32
+ shiftKey: boolean;
33
+ preventDefault: VoidFunction;
34
+ },
35
+ ) {
36
+ const {
37
+ rowIndex,
38
+ getDataSourceState,
39
+ getComputed,
40
+ dataSourceActions,
41
+ api,
42
+ cloneRowSelection,
43
+ } = context;
44
+
45
+ const { multiRowSelector, renderSelectionCheckBox } = getComputed();
46
+ const dataSourceState = getDataSourceState();
47
+
48
+ const { selectionMode, groupBy, dataArray } = dataSourceState;
49
+
50
+ if (groupBy.length) {
51
+ return false;
52
+ }
53
+
54
+ if (selectionMode === 'multi-row') {
55
+ if (renderSelectionCheckBox && !event.key) {
56
+ // we should not click-select when we have a checkbox column
57
+ // but we only do this if there is no key
58
+ // as key could == ' ', and in this case we want
59
+ // to let the selection logic happen, as it's the same function
60
+ // but used by the keyboard selection
61
+ return false;
62
+ }
63
+ let { rowSelection: rowSelectionState } = dataSourceState;
64
+ // clone the row selection
65
+ rowSelectionState = cloneRowSelection(
66
+ rowSelectionState as RowSelectionState<T>,
67
+ );
68
+
69
+ multiRowSelector.rowSelectionState = rowSelectionState;
70
+
71
+ if (rowSelectionState && typeof rowSelectionState === 'object') {
72
+ if (event.shiftKey) {
73
+ multiRowSelector.multiSelectClick(rowIndex);
74
+ } else if (event.metaKey || event.ctrlKey) {
75
+ multiRowSelector.singleAddClick(rowIndex);
76
+ } else {
77
+ multiRowSelector.resetClick(rowIndex);
78
+ }
79
+
80
+ // so we can give actions a new instance of rowSelection
81
+ dataSourceActions.rowSelection = rowSelectionState;
82
+
83
+ return true;
84
+ }
85
+ } else if (selectionMode === 'single-row') {
86
+ const id = dataArray[rowIndex].id;
87
+ if (event.metaKey || event.ctrlKey) {
88
+ api.selectionApi.toggleRowSelection(id);
89
+ } else {
90
+ api.selectionApi.selectRow(id);
91
+ }
92
+ }
93
+ return false;
94
+ }
@@ -0,0 +1,25 @@
1
+ import type { KeyboardEvent } from 'react';
2
+ import { handleKeyboardNavigation } from './keyboardNavigation';
3
+ import { InfiniteTableKeyboardEventHandlerContext } from './eventHandlerTypes';
4
+ import { handleKeyboardSelection } from './keyboardSelection';
5
+ import { cloneRowSelection } from '../api/getSelectionApi';
6
+
7
+ export function onKeyDown<T>(
8
+ context: InfiniteTableKeyboardEventHandlerContext<T>,
9
+ event: KeyboardEvent<Element>,
10
+ ) {
11
+ const keyboardHandlerContext: InfiniteTableKeyboardEventHandlerContext<T> = {
12
+ ...context,
13
+ cloneRowSelection: (rowSelection) => {
14
+ return cloneRowSelection<T>(rowSelection, context.getDataSourceState);
15
+ },
16
+ };
17
+
18
+ if (handleKeyboardSelection(keyboardHandlerContext, event)) {
19
+ event.preventDefault();
20
+ }
21
+
22
+ if (handleKeyboardNavigation(keyboardHandlerContext, event)) {
23
+ event.preventDefault();
24
+ }
25
+ }
@@ -0,0 +1,70 @@
1
+ import { moveXatY } from '../utils/moveXatY';
2
+
3
+ export default function adjustColumnOrderForAllColumns(options: {
4
+ newColumnOrder: string[];
5
+ visibleColumnOrder: string[];
6
+ existingColumnOrder: string[];
7
+ dragColumnId: string;
8
+ }) {
9
+ const {
10
+ newColumnOrder,
11
+ visibleColumnOrder,
12
+ existingColumnOrder,
13
+ dragColumnId: dragColumnId,
14
+ } = options;
15
+
16
+ if (visibleColumnOrder.length !== newColumnOrder.length) {
17
+ console.warn(
18
+ 'new column order cannot contain less columns than the visible column order',
19
+ );
20
+ return newColumnOrder;
21
+ }
22
+ // const newIndexes = newColumnOrder.reduce(getIndexes, {});
23
+ // const allIndexes = allColumnIds.reduce(getIndexes, {});
24
+
25
+ const dragIndex = visibleColumnOrder.indexOf(dragColumnId);
26
+ const dropIndex = newColumnOrder.indexOf(dragColumnId);
27
+
28
+ if (dragIndex === dropIndex) {
29
+ return existingColumnOrder;
30
+ }
31
+ if (dropIndex > dragIndex) {
32
+ // it's moved to the right
33
+
34
+ // in the new column order, get the item that is before the dropped column id
35
+ // and then find the index of that column in the existing column order
36
+ // and move the movedColumnId after that index
37
+ const indexInNewOrder = newColumnOrder.indexOf(dragColumnId);
38
+ const prevColIdInNewOrder = newColumnOrder[indexInNewOrder - 1];
39
+
40
+ const prevColIndexInExiting =
41
+ existingColumnOrder.indexOf(prevColIdInNewOrder);
42
+ const indexInExisting = existingColumnOrder.indexOf(dragColumnId);
43
+
44
+ return moveXatY(
45
+ existingColumnOrder,
46
+ indexInExisting,
47
+ prevColIndexInExiting,
48
+ );
49
+ } else {
50
+ // it's moved to the left
51
+
52
+ // in the new column order, get the item that is after the dropped column id
53
+ // and then find the index of that column in the existing column order
54
+ // and move the movedColumnId before that index
55
+
56
+ const indexInNewOrder = newColumnOrder.indexOf(dragColumnId);
57
+ const nextColIdInNewOrder = newColumnOrder[indexInNewOrder + 1];
58
+
59
+ const nextColIndexInExiting =
60
+ existingColumnOrder.indexOf(nextColIdInNewOrder);
61
+ const indexInExisting = existingColumnOrder.indexOf(dragColumnId);
62
+
63
+ return moveXatY(
64
+ existingColumnOrder,
65
+ indexInExisting,
66
+ nextColIndexInExiting,
67
+ );
68
+ }
69
+ return newColumnOrder;
70
+ }