@affino/datagrid-orchestration 0.1.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 (239) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +6 -0
  3. package/dist/src/createDataGridRuntime.d.ts +19 -0
  4. package/dist/src/createDataGridRuntime.d.ts.map +1 -0
  5. package/dist/src/createDataGridRuntime.js +33 -0
  6. package/dist/src/dataGridContextMenuContracts.d.ts +20 -0
  7. package/dist/src/dataGridContextMenuContracts.d.ts.map +1 -0
  8. package/dist/src/dataGridContextMenuContracts.js +1 -0
  9. package/dist/src/dataGridPointerContracts.d.ts +5 -0
  10. package/dist/src/dataGridPointerContracts.d.ts.map +1 -0
  11. package/dist/src/dataGridPointerContracts.js +1 -0
  12. package/dist/src/dataGridRangeMutationKernel.d.ts +27 -0
  13. package/dist/src/dataGridRangeMutationKernel.d.ts.map +1 -0
  14. package/dist/src/dataGridRangeMutationKernel.js +46 -0
  15. package/dist/src/dataGridWritableRef.d.ts +4 -0
  16. package/dist/src/dataGridWritableRef.d.ts.map +1 -0
  17. package/dist/src/dataGridWritableRef.js +1 -0
  18. package/dist/src/index.d.ts +77 -0
  19. package/dist/src/index.d.ts.map +1 -0
  20. package/dist/src/index.js +76 -0
  21. package/dist/src/selectionOverlayTransform.d.ts +16 -0
  22. package/dist/src/selectionOverlayTransform.d.ts.map +1 -0
  23. package/dist/src/selectionOverlayTransform.js +21 -0
  24. package/dist/src/useDataGridA11yCellIds.d.ts +16 -0
  25. package/dist/src/useDataGridA11yCellIds.d.ts.map +1 -0
  26. package/dist/src/useDataGridA11yCellIds.js +26 -0
  27. package/dist/src/useDataGridAxisAutoScrollDelta.d.ts +10 -0
  28. package/dist/src/useDataGridAxisAutoScrollDelta.d.ts.map +1 -0
  29. package/dist/src/useDataGridAxisAutoScrollDelta.js +20 -0
  30. package/dist/src/useDataGridCellCoordNormalizer.d.ts +26 -0
  31. package/dist/src/useDataGridCellCoordNormalizer.d.ts.map +1 -0
  32. package/dist/src/useDataGridCellCoordNormalizer.js +29 -0
  33. package/dist/src/useDataGridCellDatasetResolver.d.ts +16 -0
  34. package/dist/src/useDataGridCellDatasetResolver.d.ts.map +1 -0
  35. package/dist/src/useDataGridCellDatasetResolver.js +23 -0
  36. package/dist/src/useDataGridCellNavigation.d.ts +23 -0
  37. package/dist/src/useDataGridCellNavigation.d.ts.map +1 -0
  38. package/dist/src/useDataGridCellNavigation.js +111 -0
  39. package/dist/src/useDataGridCellPointerDownRouter.d.ts +42 -0
  40. package/dist/src/useDataGridCellPointerDownRouter.d.ts.map +1 -0
  41. package/dist/src/useDataGridCellPointerDownRouter.js +48 -0
  42. package/dist/src/useDataGridCellPointerHoverRouter.d.ts +24 -0
  43. package/dist/src/useDataGridCellPointerHoverRouter.d.ts.map +1 -0
  44. package/dist/src/useDataGridCellPointerHoverRouter.js +25 -0
  45. package/dist/src/useDataGridCellRangeHelpers.d.ts +30 -0
  46. package/dist/src/useDataGridCellRangeHelpers.d.ts.map +1 -0
  47. package/dist/src/useDataGridCellRangeHelpers.js +89 -0
  48. package/dist/src/useDataGridCellVisibilityScroller.d.ts +41 -0
  49. package/dist/src/useDataGridCellVisibilityScroller.d.ts.map +1 -0
  50. package/dist/src/useDataGridCellVisibilityScroller.js +43 -0
  51. package/dist/src/useDataGridCellVisualStatePredicates.d.ts +40 -0
  52. package/dist/src/useDataGridCellVisualStatePredicates.d.ts.map +1 -0
  53. package/dist/src/useDataGridCellVisualStatePredicates.js +126 -0
  54. package/dist/src/useDataGridClearSelectionLifecycle.d.ts +27 -0
  55. package/dist/src/useDataGridClearSelectionLifecycle.d.ts.map +1 -0
  56. package/dist/src/useDataGridClearSelectionLifecycle.js +21 -0
  57. package/dist/src/useDataGridClipboardBridge.d.ts +31 -0
  58. package/dist/src/useDataGridClipboardBridge.d.ts.map +1 -0
  59. package/dist/src/useDataGridClipboardBridge.js +138 -0
  60. package/dist/src/useDataGridClipboardMutations.d.ts +47 -0
  61. package/dist/src/useDataGridClipboardMutations.d.ts.map +1 -0
  62. package/dist/src/useDataGridClipboardMutations.js +216 -0
  63. package/dist/src/useDataGridClipboardValuePolicy.d.ts +5 -0
  64. package/dist/src/useDataGridClipboardValuePolicy.d.ts.map +1 -0
  65. package/dist/src/useDataGridClipboardValuePolicy.js +14 -0
  66. package/dist/src/useDataGridColumnFilterOrchestration.d.ts +64 -0
  67. package/dist/src/useDataGridColumnFilterOrchestration.d.ts.map +1 -0
  68. package/dist/src/useDataGridColumnFilterOrchestration.js +359 -0
  69. package/dist/src/useDataGridColumnLayoutOrchestration.d.ts +59 -0
  70. package/dist/src/useDataGridColumnLayoutOrchestration.d.ts.map +1 -0
  71. package/dist/src/useDataGridColumnLayoutOrchestration.js +151 -0
  72. package/dist/src/useDataGridColumnUiPolicy.d.ts +25 -0
  73. package/dist/src/useDataGridColumnUiPolicy.d.ts.map +1 -0
  74. package/dist/src/useDataGridColumnUiPolicy.js +55 -0
  75. package/dist/src/useDataGridContextMenu.d.ts +30 -0
  76. package/dist/src/useDataGridContextMenu.d.ts.map +1 -0
  77. package/dist/src/useDataGridContextMenu.js +147 -0
  78. package/dist/src/useDataGridContextMenuActionRouter.d.ts +19 -0
  79. package/dist/src/useDataGridContextMenuActionRouter.d.ts.map +1 -0
  80. package/dist/src/useDataGridContextMenuActionRouter.js +29 -0
  81. package/dist/src/useDataGridContextMenuAnchor.d.ts +33 -0
  82. package/dist/src/useDataGridContextMenuAnchor.d.ts.map +1 -0
  83. package/dist/src/useDataGridContextMenuAnchor.js +60 -0
  84. package/dist/src/useDataGridCopyRangeHelpers.d.ts +20 -0
  85. package/dist/src/useDataGridCopyRangeHelpers.d.ts.map +1 -0
  86. package/dist/src/useDataGridCopyRangeHelpers.js +28 -0
  87. package/dist/src/useDataGridDragPointerSelection.d.ts +22 -0
  88. package/dist/src/useDataGridDragPointerSelection.d.ts.map +1 -0
  89. package/dist/src/useDataGridDragPointerSelection.js +23 -0
  90. package/dist/src/useDataGridDragSelectionLifecycle.d.ts +18 -0
  91. package/dist/src/useDataGridDragSelectionLifecycle.d.ts.map +1 -0
  92. package/dist/src/useDataGridDragSelectionLifecycle.js +11 -0
  93. package/dist/src/useDataGridEditableValuePolicy.d.ts +32 -0
  94. package/dist/src/useDataGridEditableValuePolicy.d.ts.map +1 -0
  95. package/dist/src/useDataGridEditableValuePolicy.js +95 -0
  96. package/dist/src/useDataGridEnumTrigger.d.ts +17 -0
  97. package/dist/src/useDataGridEnumTrigger.d.ts.map +1 -0
  98. package/dist/src/useDataGridEnumTrigger.js +28 -0
  99. package/dist/src/useDataGridFillHandleStart.d.ts +30 -0
  100. package/dist/src/useDataGridFillHandleStart.d.ts.map +1 -0
  101. package/dist/src/useDataGridFillHandleStart.js +27 -0
  102. package/dist/src/useDataGridFillSelectionLifecycle.d.ts +24 -0
  103. package/dist/src/useDataGridFillSelectionLifecycle.d.ts.map +1 -0
  104. package/dist/src/useDataGridFillSelectionLifecycle.js +15 -0
  105. package/dist/src/useDataGridGlobalMouseDownContextMenuCloser.d.ts +10 -0
  106. package/dist/src/useDataGridGlobalMouseDownContextMenuCloser.d.ts.map +1 -0
  107. package/dist/src/useDataGridGlobalMouseDownContextMenuCloser.js +17 -0
  108. package/dist/src/useDataGridGlobalPointerLifecycle.d.ts +40 -0
  109. package/dist/src/useDataGridGlobalPointerLifecycle.d.ts.map +1 -0
  110. package/dist/src/useDataGridGlobalPointerLifecycle.js +153 -0
  111. package/dist/src/useDataGridGroupBadge.d.ts +13 -0
  112. package/dist/src/useDataGridGroupBadge.d.ts.map +1 -0
  113. package/dist/src/useDataGridGroupBadge.js +19 -0
  114. package/dist/src/useDataGridGroupMetaOrchestration.d.ts +18 -0
  115. package/dist/src/useDataGridGroupMetaOrchestration.d.ts.map +1 -0
  116. package/dist/src/useDataGridGroupMetaOrchestration.js +43 -0
  117. package/dist/src/useDataGridGroupValueLabelResolver.d.ts +10 -0
  118. package/dist/src/useDataGridGroupValueLabelResolver.d.ts.map +1 -0
  119. package/dist/src/useDataGridGroupValueLabelResolver.js +15 -0
  120. package/dist/src/useDataGridGroupingSortOrchestration.d.ts +13 -0
  121. package/dist/src/useDataGridGroupingSortOrchestration.d.ts.map +1 -0
  122. package/dist/src/useDataGridGroupingSortOrchestration.js +22 -0
  123. package/dist/src/useDataGridHeaderContextActions.d.ts +15 -0
  124. package/dist/src/useDataGridHeaderContextActions.d.ts.map +1 -0
  125. package/dist/src/useDataGridHeaderContextActions.js +41 -0
  126. package/dist/src/useDataGridHeaderInteractionRouter.d.ts +12 -0
  127. package/dist/src/useDataGridHeaderInteractionRouter.d.ts.map +1 -0
  128. package/dist/src/useDataGridHeaderInteractionRouter.js +35 -0
  129. package/dist/src/useDataGridHeaderLayerOrchestration.d.ts +13 -0
  130. package/dist/src/useDataGridHeaderLayerOrchestration.d.ts.map +1 -0
  131. package/dist/src/useDataGridHeaderLayerOrchestration.js +18 -0
  132. package/dist/src/useDataGridHeaderResizeOrchestration.d.ts +43 -0
  133. package/dist/src/useDataGridHeaderResizeOrchestration.d.ts.map +1 -0
  134. package/dist/src/useDataGridHeaderResizeOrchestration.js +180 -0
  135. package/dist/src/useDataGridHeaderSortOrchestration.d.ts +20 -0
  136. package/dist/src/useDataGridHeaderSortOrchestration.d.ts.map +1 -0
  137. package/dist/src/useDataGridHeaderSortOrchestration.js +86 -0
  138. package/dist/src/useDataGridHistoryActionRunner.d.ts +15 -0
  139. package/dist/src/useDataGridHistoryActionRunner.d.ts.map +1 -0
  140. package/dist/src/useDataGridHistoryActionRunner.js +35 -0
  141. package/dist/src/useDataGridInlineEditOrchestration.d.ts +46 -0
  142. package/dist/src/useDataGridInlineEditOrchestration.d.ts.map +1 -0
  143. package/dist/src/useDataGridInlineEditOrchestration.js +116 -0
  144. package/dist/src/useDataGridInlineEditorFocus.d.ts +9 -0
  145. package/dist/src/useDataGridInlineEditorFocus.d.ts.map +1 -0
  146. package/dist/src/useDataGridInlineEditorFocus.js +37 -0
  147. package/dist/src/useDataGridInlineEditorKeyRouter.d.ts +12 -0
  148. package/dist/src/useDataGridInlineEditorKeyRouter.d.ts.map +1 -0
  149. package/dist/src/useDataGridInlineEditorKeyRouter.js +31 -0
  150. package/dist/src/useDataGridInlineEditorSchema.d.ts +11 -0
  151. package/dist/src/useDataGridInlineEditorSchema.d.ts.map +1 -0
  152. package/dist/src/useDataGridInlineEditorSchema.js +26 -0
  153. package/dist/src/useDataGridInlineEditorTargetNavigation.d.ts +30 -0
  154. package/dist/src/useDataGridInlineEditorTargetNavigation.d.ts.map +1 -0
  155. package/dist/src/useDataGridInlineEditorTargetNavigation.js +66 -0
  156. package/dist/src/useDataGridIntentHistory.d.ts +25 -0
  157. package/dist/src/useDataGridIntentHistory.d.ts.map +1 -0
  158. package/dist/src/useDataGridIntentHistory.js +109 -0
  159. package/dist/src/useDataGridKeyboardCommandRouter.d.ts +18 -0
  160. package/dist/src/useDataGridKeyboardCommandRouter.d.ts.map +1 -0
  161. package/dist/src/useDataGridKeyboardCommandRouter.js +81 -0
  162. package/dist/src/useDataGridMoveMutationPolicy.d.ts +12 -0
  163. package/dist/src/useDataGridMoveMutationPolicy.d.ts.map +1 -0
  164. package/dist/src/useDataGridMoveMutationPolicy.js +81 -0
  165. package/dist/src/useDataGridMutationSnapshot.d.ts +46 -0
  166. package/dist/src/useDataGridMutationSnapshot.d.ts.map +1 -0
  167. package/dist/src/useDataGridMutationSnapshot.js +57 -0
  168. package/dist/src/useDataGridNavigationPrimitives.d.ts +42 -0
  169. package/dist/src/useDataGridNavigationPrimitives.d.ts.map +1 -0
  170. package/dist/src/useDataGridNavigationPrimitives.js +105 -0
  171. package/dist/src/useDataGridPointerAutoScroll.d.ts +32 -0
  172. package/dist/src/useDataGridPointerAutoScroll.d.ts.map +1 -0
  173. package/dist/src/useDataGridPointerAutoScroll.js +85 -0
  174. package/dist/src/useDataGridPointerCellCoordResolver.d.ts +45 -0
  175. package/dist/src/useDataGridPointerCellCoordResolver.d.ts.map +1 -0
  176. package/dist/src/useDataGridPointerCellCoordResolver.js +107 -0
  177. package/dist/src/useDataGridPointerModifierPolicy.d.ts +5 -0
  178. package/dist/src/useDataGridPointerModifierPolicy.d.ts.map +1 -0
  179. package/dist/src/useDataGridPointerModifierPolicy.js +8 -0
  180. package/dist/src/useDataGridPointerPreviewRouter.d.ts +37 -0
  181. package/dist/src/useDataGridPointerPreviewRouter.d.ts.map +1 -0
  182. package/dist/src/useDataGridPointerPreviewRouter.js +55 -0
  183. package/dist/src/useDataGridQuickFilterActions.d.ts +10 -0
  184. package/dist/src/useDataGridQuickFilterActions.d.ts.map +1 -0
  185. package/dist/src/useDataGridQuickFilterActions.js +12 -0
  186. package/dist/src/useDataGridRangeMoveLifecycle.d.ts +15 -0
  187. package/dist/src/useDataGridRangeMoveLifecycle.d.ts.map +1 -0
  188. package/dist/src/useDataGridRangeMoveLifecycle.js +21 -0
  189. package/dist/src/useDataGridRangeMoveStart.d.ts +34 -0
  190. package/dist/src/useDataGridRangeMoveStart.d.ts.map +1 -0
  191. package/dist/src/useDataGridRangeMoveStart.js +23 -0
  192. package/dist/src/useDataGridRangeMutationEngine.d.ts +44 -0
  193. package/dist/src/useDataGridRangeMutationEngine.d.ts.map +1 -0
  194. package/dist/src/useDataGridRangeMutationEngine.js +210 -0
  195. package/dist/src/useDataGridRowSelectionInputHandlers.d.ts +10 -0
  196. package/dist/src/useDataGridRowSelectionInputHandlers.d.ts.map +1 -0
  197. package/dist/src/useDataGridRowSelectionInputHandlers.js +12 -0
  198. package/dist/src/useDataGridRowSelectionOrchestration.d.ts +7 -0
  199. package/dist/src/useDataGridRowSelectionOrchestration.d.ts.map +1 -0
  200. package/dist/src/useDataGridRowSelectionOrchestration.js +60 -0
  201. package/dist/src/useDataGridRowsProjection.d.ts +21 -0
  202. package/dist/src/useDataGridRowsProjection.d.ts.map +1 -0
  203. package/dist/src/useDataGridRowsProjection.js +69 -0
  204. package/dist/src/useDataGridRuntimeService.d.ts +33 -0
  205. package/dist/src/useDataGridRuntimeService.d.ts.map +1 -0
  206. package/dist/src/useDataGridRuntimeService.js +209 -0
  207. package/dist/src/useDataGridSelectionComparators.d.ts +16 -0
  208. package/dist/src/useDataGridSelectionComparators.d.ts.map +1 -0
  209. package/dist/src/useDataGridSelectionComparators.js +21 -0
  210. package/dist/src/useDataGridSelectionMoveHandle.d.ts +38 -0
  211. package/dist/src/useDataGridSelectionMoveHandle.d.ts.map +1 -0
  212. package/dist/src/useDataGridSelectionMoveHandle.js +49 -0
  213. package/dist/src/useDataGridSelectionOverlayOrchestration.d.ts +60 -0
  214. package/dist/src/useDataGridSelectionOverlayOrchestration.d.ts.map +1 -0
  215. package/dist/src/useDataGridSelectionOverlayOrchestration.js +137 -0
  216. package/dist/src/useDataGridTabTargetResolver.d.ts +17 -0
  217. package/dist/src/useDataGridTabTargetResolver.d.ts.map +1 -0
  218. package/dist/src/useDataGridTabTargetResolver.js +30 -0
  219. package/dist/src/useDataGridViewportBlurHandler.d.ts +16 -0
  220. package/dist/src/useDataGridViewportBlurHandler.d.ts.map +1 -0
  221. package/dist/src/useDataGridViewportBlurHandler.js +62 -0
  222. package/dist/src/useDataGridViewportContextMenuRouter.d.ts +31 -0
  223. package/dist/src/useDataGridViewportContextMenuRouter.d.ts.map +1 -0
  224. package/dist/src/useDataGridViewportContextMenuRouter.js +78 -0
  225. package/dist/src/useDataGridViewportMeasureScheduler.d.ts +22 -0
  226. package/dist/src/useDataGridViewportMeasureScheduler.d.ts.map +1 -0
  227. package/dist/src/useDataGridViewportMeasureScheduler.js +65 -0
  228. package/dist/src/useDataGridViewportScrollLifecycle.d.ts +16 -0
  229. package/dist/src/useDataGridViewportScrollLifecycle.d.ts.map +1 -0
  230. package/dist/src/useDataGridViewportScrollLifecycle.js +28 -0
  231. package/dist/src/useDataGridVirtualRangeMetrics.d.ts +32 -0
  232. package/dist/src/useDataGridVirtualRangeMetrics.d.ts.map +1 -0
  233. package/dist/src/useDataGridVirtualRangeMetrics.js +26 -0
  234. package/dist/src/useDataGridVisibleRowsSyncScheduler.d.ts +21 -0
  235. package/dist/src/useDataGridVisibleRowsSyncScheduler.d.ts.map +1 -0
  236. package/dist/src/useDataGridVisibleRowsSyncScheduler.js +70 -0
  237. package/dist/tsconfig.public.tsbuildinfo +1 -0
  238. package/dist/tsconfig.tsbuildinfo +1 -0
  239. package/package.json +50 -0
@@ -0,0 +1,69 @@
1
+ export function normalizeDataGridQuickFilter(query) {
2
+ return query.trim().toLowerCase();
3
+ }
4
+ function compareSortableValues(left, right) {
5
+ if (left == null && right == null) {
6
+ return 0;
7
+ }
8
+ if (left == null) {
9
+ return 1;
10
+ }
11
+ if (right == null) {
12
+ return -1;
13
+ }
14
+ if (typeof left === "number" && typeof right === "number") {
15
+ if (left === right)
16
+ return 0;
17
+ return left < right ? -1 : 1;
18
+ }
19
+ const leftValue = String(left).toLowerCase();
20
+ const rightValue = String(right).toLowerCase();
21
+ return leftValue.localeCompare(rightValue);
22
+ }
23
+ export function sortDataGridRows(rows, model, resolveCellValue) {
24
+ if (!model.length) {
25
+ return rows;
26
+ }
27
+ return rows
28
+ .map((row, index) => ({ row, index }))
29
+ .sort((left, right) => {
30
+ for (const sortEntry of model) {
31
+ const next = compareSortableValues(resolveCellValue(left.row, sortEntry.key), resolveCellValue(right.row, sortEntry.key));
32
+ if (next === 0) {
33
+ continue;
34
+ }
35
+ return sortEntry.direction === "asc" ? next : -next;
36
+ }
37
+ return left.index - right.index;
38
+ })
39
+ .map(entry => entry.row);
40
+ }
41
+ export function rowMatchesDataGridQuickFilter(row, normalizedQuery, columnKeys, fallbackQueryColumnKeys, resolveCellValue) {
42
+ if (!normalizedQuery) {
43
+ return true;
44
+ }
45
+ const keys = columnKeys.length ? columnKeys : fallbackQueryColumnKeys;
46
+ for (const key of keys) {
47
+ const value = resolveCellValue(row, key);
48
+ if (typeof value === "undefined" || value === null) {
49
+ continue;
50
+ }
51
+ if (String(value).toLowerCase().includes(normalizedQuery)) {
52
+ return true;
53
+ }
54
+ }
55
+ return false;
56
+ }
57
+ export function useDataGridRowsProjection(options) {
58
+ const normalizedQuickFilter = normalizeDataGridQuickFilter(options.query);
59
+ const quickFilteredRows = normalizedQuickFilter
60
+ ? options.rows.filter(row => rowMatchesDataGridQuickFilter(row, normalizedQuickFilter, options.searchableColumnKeys, options.fallbackQueryColumnKeys ?? [], options.resolveCellValue))
61
+ : options.rows;
62
+ const columnFilteredRows = options.hasColumnFilters
63
+ ? quickFilteredRows.filter(row => options.rowMatchesColumnFilters(row, options.appliedColumnFilters))
64
+ : quickFilteredRows;
65
+ return {
66
+ normalizedQuickFilter,
67
+ filteredAndSortedRows: sortDataGridRows(columnFilteredRows, options.sortModel, options.resolveCellValue),
68
+ };
69
+ }
@@ -0,0 +1,33 @@
1
+ import type { DataGridColumnDef, DataGridColumnModelSnapshot, DataGridRowNode, DataGridViewportRange } from "@affino/datagrid-core";
2
+ import { type CreateDataGridRuntimeOptions, type DataGridRuntime } from "./createDataGridRuntime";
3
+ export interface UseDataGridRuntimeServiceOptions<TRow = unknown> extends CreateDataGridRuntimeOptions<TRow> {
4
+ }
5
+ export interface DataGridRuntimeVirtualWindowSnapshot {
6
+ rowStart: number;
7
+ rowEnd: number;
8
+ rowTotal: number;
9
+ colStart: number;
10
+ colEnd: number;
11
+ colTotal: number;
12
+ overscan: {
13
+ top: number;
14
+ bottom: number;
15
+ left: number;
16
+ right: number;
17
+ };
18
+ }
19
+ export interface UseDataGridRuntimeServiceResult<TRow = unknown> extends DataGridRuntime<TRow> {
20
+ getColumnSnapshot: () => DataGridColumnModelSnapshot;
21
+ subscribeColumnSnapshot: (listener: (snapshot: DataGridColumnModelSnapshot) => void) => () => void;
22
+ getVirtualWindowSnapshot: () => DataGridRuntimeVirtualWindowSnapshot | null;
23
+ subscribeVirtualWindow: (listener: (snapshot: DataGridRuntimeVirtualWindowSnapshot | null) => void) => () => void;
24
+ setRows: (rows: readonly TRow[]) => void;
25
+ setColumns: (columns: readonly DataGridColumnDef[]) => void;
26
+ start: () => Promise<void>;
27
+ stop: () => void;
28
+ syncRowsInRange: (range: DataGridViewportRange) => readonly DataGridRowNode<TRow>[];
29
+ isStarted: () => boolean;
30
+ isDisposed: () => boolean;
31
+ }
32
+ export declare function useDataGridRuntimeService<TRow = unknown>(options: UseDataGridRuntimeServiceOptions<TRow>): UseDataGridRuntimeServiceResult<TRow>;
33
+ //# sourceMappingURL=useDataGridRuntimeService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDataGridRuntimeService.d.ts","sourceRoot":"","sources":["../../src/useDataGridRuntimeService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,2BAA2B,EAC3B,eAAe,EAEf,qBAAqB,EACtB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAyB,KAAK,4BAA4B,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAUxH,MAAM,WAAW,gCAAgC,CAAC,IAAI,GAAG,OAAO,CAAE,SAAQ,4BAA4B,CAAC,IAAI,CAAC;CAAG;AAE/G,MAAM,WAAW,oCAAoC;IACnD,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE;QACR,GAAG,EAAE,MAAM,CAAA;QACX,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAED,MAAM,WAAW,+BAA+B,CAAC,IAAI,GAAG,OAAO,CAAE,SAAQ,eAAe,CAAC,IAAI,CAAC;IAC5F,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;IACpD,uBAAuB,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,2BAA2B,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;IAClG,wBAAwB,EAAE,MAAM,oCAAoC,GAAG,IAAI,CAAA;IAC3E,sBAAsB,EAAE,CACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,oCAAoC,GAAG,IAAI,KAAK,IAAI,KACtE,MAAM,IAAI,CAAA;IACf,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,KAAK,IAAI,CAAA;IACxC,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,KAAK,IAAI,CAAA;IAC3D,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,eAAe,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,SAAS,eAAe,CAAC,IAAI,CAAC,EAAE,CAAA;IACnF,SAAS,EAAE,MAAM,OAAO,CAAA;IACxB,UAAU,EAAE,MAAM,OAAO,CAAA;CAC1B;AAmED,wBAAgB,yBAAyB,CAAC,IAAI,GAAG,OAAO,EACtD,OAAO,EAAE,gCAAgC,CAAC,IAAI,CAAC,GAC9C,+BAA+B,CAAC,IAAI,CAAC,CA8KvC"}
@@ -0,0 +1,209 @@
1
+ import { createDataGridRuntime } from "./createDataGridRuntime";
2
+ function isMutableRowsModel(model) {
3
+ return typeof model.setRows === "function";
4
+ }
5
+ function normalizeCount(value) {
6
+ if (!Number.isFinite(value)) {
7
+ return 0;
8
+ }
9
+ return Math.max(0, Math.trunc(value));
10
+ }
11
+ function normalizeRange(start, end, total) {
12
+ if (total <= 0) {
13
+ return { start: 0, end: 0 };
14
+ }
15
+ const safeStart = Math.max(0, Math.min(total - 1, normalizeCount(start)));
16
+ const safeEnd = Math.max(safeStart, Math.min(total - 1, normalizeCount(end)));
17
+ return {
18
+ start: safeStart,
19
+ end: safeEnd,
20
+ };
21
+ }
22
+ function cloneVirtualWindow(snapshot) {
23
+ if (!snapshot) {
24
+ return null;
25
+ }
26
+ return {
27
+ rowStart: snapshot.rowStart,
28
+ rowEnd: snapshot.rowEnd,
29
+ rowTotal: snapshot.rowTotal,
30
+ colStart: snapshot.colStart,
31
+ colEnd: snapshot.colEnd,
32
+ colTotal: snapshot.colTotal,
33
+ overscan: {
34
+ top: snapshot.overscan.top,
35
+ bottom: snapshot.overscan.bottom,
36
+ left: snapshot.overscan.left,
37
+ right: snapshot.overscan.right,
38
+ },
39
+ };
40
+ }
41
+ function isSameVirtualWindow(left, right) {
42
+ if (left === right) {
43
+ return true;
44
+ }
45
+ if (!left || !right) {
46
+ return false;
47
+ }
48
+ return (left.rowStart === right.rowStart &&
49
+ left.rowEnd === right.rowEnd &&
50
+ left.rowTotal === right.rowTotal &&
51
+ left.colStart === right.colStart &&
52
+ left.colEnd === right.colEnd &&
53
+ left.colTotal === right.colTotal &&
54
+ left.overscan.top === right.overscan.top &&
55
+ left.overscan.bottom === right.overscan.bottom &&
56
+ left.overscan.left === right.overscan.left &&
57
+ left.overscan.right === right.overscan.right);
58
+ }
59
+ export function useDataGridRuntimeService(options) {
60
+ const runtime = createDataGridRuntime(options);
61
+ const { rowModel, columnModel, core, api } = runtime;
62
+ let started = false;
63
+ let disposed = false;
64
+ const virtualWindowListeners = new Set();
65
+ const resolveVirtualWindowFromViewportService = () => {
66
+ const viewportService = core.getService("viewport");
67
+ const rawWindow = viewportService.getVirtualWindow?.();
68
+ if (!rawWindow || typeof rawWindow !== "object") {
69
+ return null;
70
+ }
71
+ const value = rawWindow;
72
+ const rowTotal = normalizeCount(value.rowTotal);
73
+ const colTotal = normalizeCount(value.colTotal);
74
+ const rowRange = normalizeRange(value.rowStart, value.rowEnd, rowTotal);
75
+ const colRange = normalizeRange(value.colStart, value.colEnd, colTotal);
76
+ const overscanSource = value.overscan;
77
+ return {
78
+ rowStart: rowRange.start,
79
+ rowEnd: rowRange.end,
80
+ rowTotal,
81
+ colStart: colRange.start,
82
+ colEnd: colRange.end,
83
+ colTotal,
84
+ overscan: {
85
+ top: normalizeCount(overscanSource?.top),
86
+ bottom: normalizeCount(overscanSource?.bottom),
87
+ left: normalizeCount(overscanSource?.left),
88
+ right: normalizeCount(overscanSource?.right),
89
+ },
90
+ };
91
+ };
92
+ const buildFallbackVirtualWindow = () => {
93
+ const rowSnapshot = rowModel.getSnapshot();
94
+ const rowTotal = normalizeCount(rowSnapshot.rowCount);
95
+ const rowRange = normalizeRange(rowSnapshot.viewportRange.start, rowSnapshot.viewportRange.end, rowTotal);
96
+ const colTotal = normalizeCount(columnModel.getSnapshot().visibleColumns.length);
97
+ const colRange = normalizeRange(0, Math.max(0, colTotal - 1), colTotal);
98
+ return {
99
+ rowStart: rowRange.start,
100
+ rowEnd: rowRange.end,
101
+ rowTotal,
102
+ colStart: colRange.start,
103
+ colEnd: colRange.end,
104
+ colTotal,
105
+ overscan: {
106
+ top: 0,
107
+ bottom: 0,
108
+ left: 0,
109
+ right: 0,
110
+ },
111
+ };
112
+ };
113
+ const resolveVirtualWindowSnapshot = () => (resolveVirtualWindowFromViewportService() ?? buildFallbackVirtualWindow());
114
+ let virtualWindowSnapshot = resolveVirtualWindowSnapshot();
115
+ const emitVirtualWindow = () => {
116
+ for (const listener of virtualWindowListeners) {
117
+ listener(cloneVirtualWindow(virtualWindowSnapshot));
118
+ }
119
+ };
120
+ const recomputeVirtualWindow = () => {
121
+ const nextSnapshot = resolveVirtualWindowSnapshot();
122
+ if (isSameVirtualWindow(virtualWindowSnapshot, nextSnapshot)) {
123
+ return;
124
+ }
125
+ virtualWindowSnapshot = nextSnapshot;
126
+ emitVirtualWindow();
127
+ };
128
+ const unsubscribeRowModel = rowModel.subscribe(() => {
129
+ recomputeVirtualWindow();
130
+ });
131
+ const unsubscribeColumnModelForWindow = columnModel.subscribe(() => {
132
+ recomputeVirtualWindow();
133
+ });
134
+ function getColumnSnapshot() {
135
+ return api.getColumnModelSnapshot();
136
+ }
137
+ function subscribeColumnSnapshot(listener) {
138
+ listener(getColumnSnapshot());
139
+ const unsubscribe = columnModel.subscribe(next => {
140
+ listener(next);
141
+ });
142
+ return () => {
143
+ unsubscribe();
144
+ };
145
+ }
146
+ function setRows(rows) {
147
+ if (!isMutableRowsModel(rowModel)) {
148
+ return;
149
+ }
150
+ rowModel.setRows(rows);
151
+ recomputeVirtualWindow();
152
+ }
153
+ function setColumns(columns) {
154
+ columnModel.setColumns(columns);
155
+ recomputeVirtualWindow();
156
+ }
157
+ async function start() {
158
+ if (disposed || started) {
159
+ return;
160
+ }
161
+ await api.start();
162
+ started = true;
163
+ recomputeVirtualWindow();
164
+ }
165
+ function stop() {
166
+ if (disposed) {
167
+ return;
168
+ }
169
+ unsubscribeRowModel();
170
+ unsubscribeColumnModelForWindow();
171
+ virtualWindowListeners.clear();
172
+ void core.dispose();
173
+ started = false;
174
+ disposed = true;
175
+ }
176
+ function syncRowsInRange(range) {
177
+ api.setViewportRange(range);
178
+ const rows = api.getRowsInRange(range);
179
+ recomputeVirtualWindow();
180
+ return rows;
181
+ }
182
+ function getVirtualWindowSnapshot() {
183
+ return cloneVirtualWindow(virtualWindowSnapshot);
184
+ }
185
+ function subscribeVirtualWindow(listener) {
186
+ listener(getVirtualWindowSnapshot());
187
+ virtualWindowListeners.add(listener);
188
+ return () => {
189
+ virtualWindowListeners.delete(listener);
190
+ };
191
+ }
192
+ return {
193
+ rowModel,
194
+ columnModel,
195
+ core,
196
+ api,
197
+ getColumnSnapshot,
198
+ subscribeColumnSnapshot,
199
+ getVirtualWindowSnapshot,
200
+ subscribeVirtualWindow,
201
+ setRows,
202
+ setColumns,
203
+ start,
204
+ stop,
205
+ syncRowsInRange,
206
+ isStarted: () => started,
207
+ isDisposed: () => disposed,
208
+ };
209
+ }
@@ -0,0 +1,16 @@
1
+ export interface DataGridSelectionComparatorCoord {
2
+ rowIndex: number;
3
+ columnIndex: number;
4
+ }
5
+ export interface DataGridSelectionComparatorRange {
6
+ startRow: number;
7
+ endRow: number;
8
+ startColumn: number;
9
+ endColumn: number;
10
+ }
11
+ export interface UseDataGridSelectionComparatorsResult<TCoord extends DataGridSelectionComparatorCoord = DataGridSelectionComparatorCoord, TRange extends DataGridSelectionComparatorRange = DataGridSelectionComparatorRange> {
12
+ cellCoordsEqual: (a: TCoord | null, b: TCoord | null) => boolean;
13
+ rangesEqual: (a: TRange | null, b: TRange | null) => boolean;
14
+ }
15
+ export declare function useDataGridSelectionComparators<TCoord extends DataGridSelectionComparatorCoord = DataGridSelectionComparatorCoord, TRange extends DataGridSelectionComparatorRange = DataGridSelectionComparatorRange>(): UseDataGridSelectionComparatorsResult<TCoord, TRange>;
16
+ //# sourceMappingURL=useDataGridSelectionComparators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDataGridSelectionComparators.d.ts","sourceRoot":"","sources":["../../src/useDataGridSelectionComparators.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,qCAAqC,CACpD,MAAM,SAAS,gCAAgC,GAAG,gCAAgC,EAClF,MAAM,SAAS,gCAAgC,GAAG,gCAAgC;IAElF,eAAe,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAA;IAChE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAA;CAC7D;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,SAAS,gCAAgC,GAAG,gCAAgC,EAClF,MAAM,SAAS,gCAAgC,GAAG,gCAAgC,KAC/E,qCAAqC,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBzD"}
@@ -0,0 +1,21 @@
1
+ export function useDataGridSelectionComparators() {
2
+ function cellCoordsEqual(a, b) {
3
+ if (!a || !b) {
4
+ return false;
5
+ }
6
+ return a.rowIndex === b.rowIndex && a.columnIndex === b.columnIndex;
7
+ }
8
+ function rangesEqual(a, b) {
9
+ if (!a || !b) {
10
+ return false;
11
+ }
12
+ return (a.startRow === b.startRow &&
13
+ a.endRow === b.endRow &&
14
+ a.startColumn === b.startColumn &&
15
+ a.endColumn === b.endColumn);
16
+ }
17
+ return {
18
+ cellCoordsEqual,
19
+ rangesEqual,
20
+ };
21
+ }
@@ -0,0 +1,38 @@
1
+ export interface DataGridSelectionMoveHandleCoord {
2
+ rowIndex: number;
3
+ columnIndex: number;
4
+ }
5
+ export interface DataGridSelectionMoveHandleRange {
6
+ startRow: number;
7
+ endRow: number;
8
+ startColumn: number;
9
+ endColumn: number;
10
+ }
11
+ export interface DataGridSelectionMoveHandleSides {
12
+ top: boolean;
13
+ right: boolean;
14
+ bottom: boolean;
15
+ left: boolean;
16
+ }
17
+ export interface UseDataGridSelectionMoveHandleOptions<TRow, TCoord extends DataGridSelectionMoveHandleCoord = DataGridSelectionMoveHandleCoord, TRange extends DataGridSelectionMoveHandleRange = DataGridSelectionMoveHandleRange> {
18
+ resolveSelectionRange: () => TRange | null;
19
+ resolveRowIndex: (row: TRow) => number;
20
+ resolveColumnIndex: (columnKey: string) => number;
21
+ isCellWithinRange: (rowIndex: number, columnIndex: number, range: TRange) => boolean;
22
+ resolveCellCoord: (row: TRow, columnKey: string) => TCoord | null;
23
+ startRangeMove: (coord: TCoord, pointer: {
24
+ clientX: number;
25
+ clientY: number;
26
+ }) => boolean;
27
+ isRangeMoving: () => boolean;
28
+ isFillDragging: () => boolean;
29
+ isInlineEditorOpen: () => boolean;
30
+ selectColumnKey?: string;
31
+ }
32
+ export interface UseDataGridSelectionMoveHandleResult<TRow> {
33
+ getSelectionEdgeSides: (row: TRow, columnKey: string) => DataGridSelectionMoveHandleSides;
34
+ shouldShowSelectionMoveHandle: (row: TRow, columnKey: string, side: keyof DataGridSelectionMoveHandleSides) => boolean;
35
+ onSelectionMoveHandleMouseDown: (row: TRow, columnKey: string, event: MouseEvent) => boolean;
36
+ }
37
+ export declare function useDataGridSelectionMoveHandle<TRow, TCoord extends DataGridSelectionMoveHandleCoord = DataGridSelectionMoveHandleCoord, TRange extends DataGridSelectionMoveHandleRange = DataGridSelectionMoveHandleRange>(options: UseDataGridSelectionMoveHandleOptions<TRow, TCoord, TRange>): UseDataGridSelectionMoveHandleResult<TRow>;
38
+ //# sourceMappingURL=useDataGridSelectionMoveHandle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDataGridSelectionMoveHandle.d.ts","sourceRoot":"","sources":["../../src/useDataGridSelectionMoveHandle.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,gCAAgC;IAC/C,GAAG,EAAE,OAAO,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,qCAAqC,CACpD,IAAI,EACJ,MAAM,SAAS,gCAAgC,GAAG,gCAAgC,EAClF,MAAM,SAAS,gCAAgC,GAAG,gCAAgC;IAElF,qBAAqB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;IAC1C,eAAe,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,CAAA;IACtC,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;IACjD,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;IACpF,gBAAgB,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;IACjE,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAA;IACzF,aAAa,EAAE,MAAM,OAAO,CAAA;IAC5B,cAAc,EAAE,MAAM,OAAO,CAAA;IAC7B,kBAAkB,EAAE,MAAM,OAAO,CAAA;IACjC,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,oCAAoC,CAAC,IAAI;IACxD,qBAAqB,EAAE,CACrB,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,KACd,gCAAgC,CAAA;IACrC,6BAA6B,EAAE,CAC7B,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,gCAAgC,KACzC,OAAO,CAAA;IACZ,8BAA8B,EAAE,CAC9B,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,UAAU,KACd,OAAO,CAAA;CACb;AASD,wBAAgB,8BAA8B,CAC5C,IAAI,EACJ,MAAM,SAAS,gCAAgC,GAAG,gCAAgC,EAClF,MAAM,SAAS,gCAAgC,GAAG,gCAAgC,EAElF,OAAO,EAAE,qCAAqC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GACnE,oCAAoC,CAAC,IAAI,CAAC,CAyD5C"}
@@ -0,0 +1,49 @@
1
+ const EMPTY_SIDES = {
2
+ top: false,
3
+ right: false,
4
+ bottom: false,
5
+ left: false,
6
+ };
7
+ export function useDataGridSelectionMoveHandle(options) {
8
+ const selectColumnKey = options.selectColumnKey ?? "select";
9
+ function getSelectionEdgeSides(row, columnKey) {
10
+ const range = options.resolveSelectionRange();
11
+ if (!range || columnKey === selectColumnKey) {
12
+ return EMPTY_SIDES;
13
+ }
14
+ const rowIndex = options.resolveRowIndex(row);
15
+ const columnIndex = options.resolveColumnIndex(columnKey);
16
+ if (columnIndex < 0 || !options.isCellWithinRange(rowIndex, columnIndex, range)) {
17
+ return EMPTY_SIDES;
18
+ }
19
+ return {
20
+ top: rowIndex === range.startRow,
21
+ right: columnIndex === range.endColumn,
22
+ bottom: rowIndex === range.endRow,
23
+ left: columnIndex === range.startColumn,
24
+ };
25
+ }
26
+ function shouldShowSelectionMoveHandle(row, columnKey, side) {
27
+ if (options.isRangeMoving() || options.isFillDragging() || options.isInlineEditorOpen()) {
28
+ return false;
29
+ }
30
+ return getSelectionEdgeSides(row, columnKey)[side];
31
+ }
32
+ function onSelectionMoveHandleMouseDown(row, columnKey, event) {
33
+ if (event.button !== 0) {
34
+ return false;
35
+ }
36
+ const coord = options.resolveCellCoord(row, columnKey);
37
+ if (!coord) {
38
+ return false;
39
+ }
40
+ event.preventDefault();
41
+ event.stopPropagation();
42
+ return options.startRangeMove(coord, event);
43
+ }
44
+ return {
45
+ getSelectionEdgeSides,
46
+ shouldShowSelectionMoveHandle,
47
+ onSelectionMoveHandleMouseDown,
48
+ };
49
+ }
@@ -0,0 +1,60 @@
1
+ export interface DataGridOverlayRange {
2
+ startRow: number;
3
+ endRow: number;
4
+ startColumn: number;
5
+ endColumn: number;
6
+ }
7
+ export interface DataGridOverlayColumnLike {
8
+ pin?: string | null;
9
+ }
10
+ export interface DataGridOverlayColumnMetricLike {
11
+ start: number;
12
+ end: number;
13
+ }
14
+ export interface DataGridSelectionOverlaySegment {
15
+ key: string;
16
+ mode: "scroll";
17
+ style: {
18
+ top: string;
19
+ left: string;
20
+ width: string;
21
+ height: string;
22
+ };
23
+ }
24
+ export interface DataGridSelectionOverlayVirtualWindow {
25
+ rowStart?: number;
26
+ rowEnd?: number;
27
+ rowTotal: number;
28
+ colStart?: number;
29
+ colEnd?: number;
30
+ colTotal: number;
31
+ overscan?: {
32
+ top?: number;
33
+ bottom?: number;
34
+ left?: number;
35
+ right?: number;
36
+ };
37
+ }
38
+ export interface UseDataGridSelectionOverlayOrchestrationOptions {
39
+ headerHeight: number;
40
+ rowHeight: number;
41
+ resolveRowHeight?: (rowIndex: number) => number;
42
+ resolveRowOffset?: (rowIndex: number) => number;
43
+ orderedColumns: readonly DataGridOverlayColumnLike[];
44
+ orderedColumnMetrics: readonly DataGridOverlayColumnMetricLike[];
45
+ cellSelectionRange: DataGridOverlayRange | null;
46
+ fillPreviewRange: DataGridOverlayRange | null;
47
+ fillBaseRange: DataGridOverlayRange | null;
48
+ rangeMovePreviewRange: DataGridOverlayRange | null;
49
+ rangeMoveBaseRange: DataGridOverlayRange | null;
50
+ isRangeMoving: boolean;
51
+ virtualWindow: DataGridSelectionOverlayVirtualWindow;
52
+ resolveDevicePixelRatio?: () => number;
53
+ }
54
+ export interface DataGridSelectionOverlaySnapshot {
55
+ cellSelectionOverlaySegments: readonly DataGridSelectionOverlaySegment[];
56
+ fillPreviewOverlaySegments: readonly DataGridSelectionOverlaySegment[];
57
+ rangeMoveOverlaySegments: readonly DataGridSelectionOverlaySegment[];
58
+ }
59
+ export declare function useDataGridSelectionOverlayOrchestration(options: UseDataGridSelectionOverlayOrchestrationOptions): DataGridSelectionOverlaySnapshot;
60
+ //# sourceMappingURL=useDataGridSelectionOverlayOrchestration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDataGridSelectionOverlayOrchestration.d.ts","sourceRoot":"","sources":["../../src/useDataGridSelectionOverlayOrchestration.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAED,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,+BAA+B;IAC9C,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,QAAQ,CAAA;IACd,KAAK,EAAE;QACL,GAAG,EAAE,MAAM,CAAA;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAED,MAAM,WAAW,qCAAqC;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAED,MAAM,WAAW,+CAA+C;IAC9D,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/C,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;IAC/C,cAAc,EAAE,SAAS,yBAAyB,EAAE,CAAA;IACpD,oBAAoB,EAAE,SAAS,+BAA+B,EAAE,CAAA;IAChE,kBAAkB,EAAE,oBAAoB,GAAG,IAAI,CAAA;IAC/C,gBAAgB,EAAE,oBAAoB,GAAG,IAAI,CAAA;IAC7C,aAAa,EAAE,oBAAoB,GAAG,IAAI,CAAA;IAC1C,qBAAqB,EAAE,oBAAoB,GAAG,IAAI,CAAA;IAClD,kBAAkB,EAAE,oBAAoB,GAAG,IAAI,CAAA;IAC/C,aAAa,EAAE,OAAO,CAAA;IACtB,aAAa,EAAE,qCAAqC,CAAA;IACpD,uBAAuB,CAAC,EAAE,MAAM,MAAM,CAAA;CACvC;AAED,MAAM,WAAW,gCAAgC;IAC/C,4BAA4B,EAAE,SAAS,+BAA+B,EAAE,CAAA;IACxE,0BAA0B,EAAE,SAAS,+BAA+B,EAAE,CAAA;IACtE,wBAAwB,EAAE,SAAS,+BAA+B,EAAE,CAAA;CACrE;AA8ID,wBAAgB,wCAAwC,CACtD,OAAO,EAAE,+CAA+C,GACvD,gCAAgC,CAkElC"}
@@ -0,0 +1,137 @@
1
+ function rangesEqual(a, b) {
2
+ if (!a || !b) {
3
+ return false;
4
+ }
5
+ return (a.startRow === b.startRow &&
6
+ a.endRow === b.endRow &&
7
+ a.startColumn === b.startColumn &&
8
+ a.endColumn === b.endColumn);
9
+ }
10
+ function snapOverlayValue(value, resolveDevicePixelRatio) {
11
+ const rawDpr = resolveDevicePixelRatio?.() ?? 1;
12
+ const dpr = Number.isFinite(rawDpr) && rawDpr > 0 ? rawDpr : 1;
13
+ return Math.round(value * dpr) / dpr;
14
+ }
15
+ function clampOverlayRange(range, options) {
16
+ if (!range) {
17
+ return null;
18
+ }
19
+ const maxRow = options.rowTotal - 1;
20
+ const maxColumn = options.colTotal - 1;
21
+ if (maxRow < 0 || maxColumn < 0) {
22
+ return null;
23
+ }
24
+ const startRow = Math.max(0, Math.min(maxRow, Math.trunc(range.startRow)));
25
+ const endRow = Math.max(startRow, Math.min(maxRow, Math.trunc(range.endRow)));
26
+ const startColumn = Math.max(0, Math.min(maxColumn, Math.trunc(range.startColumn)));
27
+ const endColumn = Math.max(startColumn, Math.min(maxColumn, Math.trunc(range.endColumn)));
28
+ return {
29
+ startRow,
30
+ endRow,
31
+ startColumn,
32
+ endColumn,
33
+ };
34
+ }
35
+ function buildScrollOverlaySegments(range, keyPrefix, headerHeight, rowHeight, resolveRowHeight, resolveRowOffset, orderedColumns, orderedColumnMetrics, resolveDevicePixelRatio) {
36
+ if (!range) {
37
+ return [];
38
+ }
39
+ const resolveOffset = (rowIndex) => {
40
+ if (resolveRowOffset) {
41
+ return resolveRowOffset(rowIndex);
42
+ }
43
+ if (resolveRowHeight) {
44
+ let offset = 0;
45
+ for (let index = 0; index < rowIndex; index += 1) {
46
+ offset += resolveRowHeight(index);
47
+ }
48
+ return offset;
49
+ }
50
+ return rowIndex * rowHeight;
51
+ };
52
+ const resolveSpanHeight = (start, end) => {
53
+ if (!resolveRowHeight) {
54
+ return (end - start + 1) * rowHeight;
55
+ }
56
+ let height = 0;
57
+ for (let index = start; index <= end; index += 1) {
58
+ height += resolveRowHeight(index);
59
+ }
60
+ return height;
61
+ };
62
+ const top = headerHeight + resolveOffset(range.startRow);
63
+ const height = resolveSpanHeight(range.startRow, range.endRow);
64
+ const segments = [];
65
+ let currentMode = null;
66
+ let currentStart = range.startColumn;
67
+ for (let index = range.startColumn; index <= range.endColumn; index += 1) {
68
+ const column = orderedColumns[index];
69
+ const mode = column?.pin === "left" ? "pinned-left" : "scroll";
70
+ if (!currentMode) {
71
+ currentMode = mode;
72
+ currentStart = index;
73
+ continue;
74
+ }
75
+ if (mode === currentMode) {
76
+ continue;
77
+ }
78
+ segments.push({ start: currentStart, end: index - 1, mode: currentMode });
79
+ currentMode = mode;
80
+ currentStart = index;
81
+ }
82
+ if (currentMode) {
83
+ segments.push({ start: currentStart, end: range.endColumn, mode: currentMode });
84
+ }
85
+ return segments
86
+ .map(segment => {
87
+ if (segment.mode !== "scroll") {
88
+ return null;
89
+ }
90
+ const startMetric = orderedColumnMetrics[segment.start];
91
+ const endMetric = orderedColumnMetrics[segment.end];
92
+ if (!startMetric || !endMetric) {
93
+ return null;
94
+ }
95
+ const left = snapOverlayValue(startMetric.start, resolveDevicePixelRatio);
96
+ const width = snapOverlayValue(endMetric.end - startMetric.start, resolveDevicePixelRatio);
97
+ const snappedTop = snapOverlayValue(top, resolveDevicePixelRatio);
98
+ const snappedHeight = snapOverlayValue(height, resolveDevicePixelRatio);
99
+ return {
100
+ key: `${keyPrefix}-${segment.mode}-${segment.start}-${segment.end}`,
101
+ mode: "scroll",
102
+ style: {
103
+ top: `${Math.max(0, snappedTop)}px`,
104
+ left: `${Math.max(0, left)}px`,
105
+ width: `${Math.max(1, width)}px`,
106
+ height: `${Math.max(1, snappedHeight)}px`,
107
+ },
108
+ };
109
+ })
110
+ .filter((segment) => segment !== null);
111
+ }
112
+ export function useDataGridSelectionOverlayOrchestration(options) {
113
+ const rowTotal = Math.max(0, Math.trunc(options.virtualWindow.rowTotal));
114
+ const colTotal = Math.max(0, Math.min(options.orderedColumns.length, Math.trunc(options.virtualWindow.colTotal)));
115
+ const cellSelectionRange = clampOverlayRange(options.cellSelectionRange, { rowTotal, colTotal });
116
+ const fillPreviewRange = clampOverlayRange(options.fillPreviewRange, { rowTotal, colTotal });
117
+ const fillBaseRange = clampOverlayRange(options.fillBaseRange, { rowTotal, colTotal });
118
+ const rangeMovePreviewRange = clampOverlayRange(options.rangeMovePreviewRange, { rowTotal, colTotal });
119
+ const rangeMoveBaseRange = clampOverlayRange(options.rangeMoveBaseRange, { rowTotal, colTotal });
120
+ const cellSelectionOverlaySegments = buildScrollOverlaySegments(cellSelectionRange, "selection", options.headerHeight, options.rowHeight, options.resolveRowHeight, options.resolveRowOffset, options.orderedColumns, options.orderedColumnMetrics, options.resolveDevicePixelRatio);
121
+ const fillPreviewOverlaySegments = !fillPreviewRange ||
122
+ !fillBaseRange ||
123
+ rangesEqual(fillPreviewRange, fillBaseRange)
124
+ ? []
125
+ : buildScrollOverlaySegments(fillPreviewRange, "fill-preview", options.headerHeight, options.rowHeight, options.resolveRowHeight, options.resolveRowOffset, options.orderedColumns, options.orderedColumnMetrics, options.resolveDevicePixelRatio);
126
+ const rangeMoveOverlaySegments = !options.isRangeMoving ||
127
+ !rangeMovePreviewRange ||
128
+ !rangeMoveBaseRange ||
129
+ rangesEqual(rangeMovePreviewRange, rangeMoveBaseRange)
130
+ ? []
131
+ : buildScrollOverlaySegments(rangeMovePreviewRange, "move-preview", options.headerHeight, options.rowHeight, options.resolveRowHeight, options.resolveRowOffset, options.orderedColumns, options.orderedColumnMetrics, options.resolveDevicePixelRatio);
132
+ return {
133
+ cellSelectionOverlaySegments,
134
+ fillPreviewOverlaySegments,
135
+ rangeMoveOverlaySegments,
136
+ };
137
+ }
@@ -0,0 +1,17 @@
1
+ export interface DataGridTabTargetCoord {
2
+ rowIndex: number;
3
+ columnIndex: number;
4
+ }
5
+ export interface DataGridTabTargetNextCoord {
6
+ rowIndex: number;
7
+ columnIndex: number;
8
+ }
9
+ export interface UseDataGridTabTargetResolverOptions<TCoord extends DataGridTabTargetCoord> {
10
+ resolveNavigableColumnIndexes: () => readonly number[];
11
+ normalizeCellCoord: (next: DataGridTabTargetNextCoord) => TCoord | null;
12
+ }
13
+ export interface UseDataGridTabTargetResolverResult<TCoord extends DataGridTabTargetCoord> {
14
+ resolveTabTarget: (current: TCoord, backwards: boolean) => TCoord | null;
15
+ }
16
+ export declare function useDataGridTabTargetResolver<TCoord extends DataGridTabTargetCoord>(options: UseDataGridTabTargetResolverOptions<TCoord>): UseDataGridTabTargetResolverResult<TCoord>;
17
+ //# sourceMappingURL=useDataGridTabTargetResolver.d.ts.map