@opencorestack/opengridx 2.1.0 → 3.0.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.
- package/CHANGELOG.md +399 -0
- package/README.md +95 -72
- package/dist/index.d.ts +590 -131
- package/dist/opengridx.css +1 -1
- package/dist/opengridx.es.js +7891 -5631
- package/dist/opengridx.es.js.map +1 -1
- package/dist/opengridx.umd.js +17 -23
- package/dist/opengridx.umd.js.map +1 -1
- package/docs/API_REFERENCE.md +348 -166
- package/docs/README.md +6 -1
- package/docs/architecture/datagrid-orchestration.md +81 -0
- package/docs/architecture/grid-row-meta.md +102 -0
- package/docs/architecture/use-grid-columns.md +128 -0
- package/docs/architecture/use-grid-controlled-state.md +157 -0
- package/docs/architecture/use-grid-row-pipeline.md +120 -0
- package/docs/architecture/use-grid-scroll-sync.md +111 -0
- package/docs/architecture/use-grid-state-snapshot.md +90 -0
- package/docs/architecture/use-grid-virtualization.md +115 -0
- package/docs/architecture/use-grid-visible-rows.md +85 -0
- package/docs/assets/banner-alt.png +0 -0
- package/docs/assets/banner.png +0 -0
- package/docs/assets/hero.png +0 -0
- package/docs/assets/logo.png +0 -0
- package/docs/components/aggregation-footer.md +15 -10
- package/docs/components/cell.md +16 -6
- package/docs/components/column-group-header.md +55 -28
- package/docs/components/column-resize.md +17 -13
- package/docs/components/column-visibility.md +6 -7
- package/docs/components/datagrid.md +15 -13
- package/docs/components/empty-state.md +2 -1
- package/docs/components/error-overlay.md +12 -7
- package/docs/components/filter-panel.md +28 -8
- package/docs/components/header.md +28 -9
- package/docs/components/pagination.md +14 -8
- package/docs/components/row.md +21 -5
- package/docs/components/toolbar.md +27 -9
- package/docs/components/tooltip.md +16 -7
- package/docs/customization/slots-api.md +90 -38
- package/docs/customization/theming.md +66 -18
- package/docs/features/aggregation-pivot.md +75 -9
- package/docs/features/cell-spanning.md +80 -125
- package/docs/features/clipboard.md +41 -16
- package/docs/features/custom-pagination.md +38 -18
- package/docs/features/data-source.md +36 -13
- package/docs/features/editing-reordering.md +125 -16
- package/docs/features/export-guide.md +126 -39
- package/docs/features/filtering.md +44 -6
- package/docs/features/infinite-scroll.md +54 -46
- package/docs/features/keyboard-navigation.md +83 -0
- package/docs/features/list-view.md +58 -5
- package/docs/features/loading-states.md +18 -20
- package/docs/features/master-detail.md +18 -5
- package/docs/features/pdf-export.md +72 -19
- package/docs/features/pinning.md +24 -5
- package/docs/features/selection.md +50 -10
- package/docs/features/sorting-pagination.md +64 -14
- package/docs/features/state-persistence.md +78 -10
- package/docs/features/toolbar-customization.md +26 -17
- package/docs/features/tree-data-grouping.md +36 -8
- package/docs/features/virtualization.md +37 -14
- package/docs/migration/v1-to-v2.md +115 -0
- package/docs/migration/v2-to-v3.md +1233 -0
- package/docs/performance.md +124 -0
- package/docs/roadmap.md +5 -5
- package/lib/components/Cell/Cell.css +17 -1
- package/lib/components/Cell/Cell.tsx +129 -57
- package/lib/components/Cell/CellErrorBoundary.tsx +12 -6
- package/lib/components/Cell/GridEditInputCell.tsx +114 -41
- package/lib/components/ColumnGroupHeader/ColumnGroupHeader.css +7 -1
- package/lib/components/ColumnResizeHandle/ColumnResizeHandle.css +15 -2
- package/lib/components/ColumnResizeHandle/ColumnResizeHandle.tsx +104 -38
- package/lib/components/ColumnResizeHandle/clampResizeWidth.ts +13 -0
- package/lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.css +6 -0
- package/lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.tsx +21 -13
- package/lib/components/DataGrid/DataGrid.css +85 -12
- package/lib/components/DataGrid/DataGrid.tsx +582 -876
- package/lib/components/DataGrid/GridAggregationFooter.tsx +53 -17
- package/lib/components/DataGrid/GridErrorOverlay.tsx +15 -12
- package/lib/components/DataGrid/GridListView.tsx +165 -24
- package/lib/components/DataGrid/GridLiveRegion.tsx +31 -0
- package/lib/components/DataGrid/GridLoadingOverlay.tsx +27 -0
- package/lib/components/DataGrid/GridPaginationArea.tsx +44 -0
- package/lib/components/DataGrid/GridPinnedRows.tsx +62 -11
- package/lib/components/DataGrid/GridStandaloneColumnPanel.tsx +40 -38
- package/lib/components/DataGrid/GridToolbarSlot.tsx +51 -0
- package/lib/components/DataGrid/GridVirtualRows.tsx +40 -24
- package/lib/components/DetailPanel/DetailPanel.css +0 -6
- package/lib/components/DetailPanel/DetailPanel.tsx +34 -5
- package/lib/components/DetailPanel/DetailPanelContent.tsx +17 -0
- package/lib/components/FilterPanel/FilterPanel.css +13 -2
- package/lib/components/FilterPanel/FilterPanel.tsx +272 -99
- package/lib/components/Header/ColumnMenu.tsx +91 -39
- package/lib/components/Header/Header.css +6 -3
- package/lib/components/Header/Header.tsx +181 -160
- package/lib/components/ListView/ListView.css +25 -0
- package/lib/components/ListView/ListViewRow.tsx +76 -10
- package/lib/components/Pagination/Pagination.tsx +15 -7
- package/lib/components/Row/Row.tsx +177 -77
- package/lib/components/Toolbar/GlobalSearch.css +6 -3
- package/lib/components/Toolbar/GlobalSearch.tsx +26 -27
- package/lib/components/Toolbar/GridToolbar.css +12 -11
- package/lib/components/Toolbar/GridToolbar.tsx +133 -89
- package/lib/components/Toolbar/PivotPanel.tsx +89 -49
- package/lib/components/Tooltip/Tooltip.css +20 -0
- package/lib/components/Tooltip/Tooltip.tsx +68 -35
- package/lib/components/ui/Button.tsx +3 -0
- package/lib/components/ui/Checkbox.tsx +2 -1
- package/lib/components/ui/ExpandIcon.css +0 -9
- package/lib/components/ui/ExpandIcon.tsx +4 -1
- package/lib/hooks/core/gridApiPlaceholder.ts +34 -0
- package/lib/hooks/core/gridToolbarHostContext.ts +14 -0
- package/lib/hooks/core/useDataGrid.ts +115 -173
- package/lib/hooks/core/useGridAggregationApi.ts +72 -0
- package/lib/hooks/core/useGridApiMethods.ts +115 -0
- package/lib/hooks/core/useGridApiRef.ts +19 -4
- package/lib/hooks/core/useGridApiRefBinding.ts +18 -0
- package/lib/hooks/core/useGridAriaRows.ts +38 -0
- package/lib/hooks/core/useGridClipboardApi.ts +38 -0
- package/lib/hooks/core/useGridColumnLookup.ts +30 -0
- package/lib/hooks/core/useGridColumns.tsx +279 -76
- package/lib/hooks/core/useGridColumnsPanel.ts +77 -0
- package/lib/hooks/core/useGridControlledState.ts +99 -6
- package/lib/hooks/core/useGridDetailPanel.ts +51 -0
- package/lib/hooks/core/useGridDevWarnings.ts +104 -5
- package/lib/hooks/core/useGridFocusHandlers.ts +50 -0
- package/lib/hooks/core/useGridGroupingColumn.ts +62 -0
- package/lib/hooks/core/useGridHeaderHandlers.ts +92 -0
- package/lib/hooks/core/useGridHierarchy.ts +81 -0
- package/lib/hooks/core/useGridKeyboardNavigation.ts +447 -243
- package/lib/hooks/core/useGridLiveRowSelection.ts +67 -0
- package/lib/hooks/core/useGridPageCorrection.ts +55 -0
- package/lib/hooks/core/useGridRowIdOf.ts +32 -0
- package/lib/hooks/core/useGridRowInteractions.ts +81 -0
- package/lib/hooks/core/useGridRowPipeline.ts +69 -39
- package/lib/hooks/core/useGridRowSelection.ts +91 -0
- package/lib/hooks/core/useGridScrollSync.ts +80 -32
- package/lib/hooks/core/useGridScrollToIndexesApi.ts +45 -0
- package/lib/hooks/core/useGridStateSnapshot.ts +40 -5
- package/lib/hooks/core/useGridThemeDimensions.ts +49 -0
- package/lib/hooks/core/useGridToolbarProps.ts +97 -0
- package/lib/hooks/core/useGridViewport.ts +38 -0
- package/lib/hooks/core/useGridViewportSize.ts +26 -0
- package/lib/hooks/core/useGridVisibleRows.ts +17 -5
- package/lib/hooks/core/useLayout.ts +215 -195
- package/lib/hooks/core/useRowsScrollEndLatch.ts +41 -0
- package/lib/hooks/core/useStableColumns.ts +34 -0
- package/lib/hooks/features/useAggregation.ts +82 -51
- package/lib/hooks/features/useColumnGroupReorderGuard.ts +34 -0
- package/lib/hooks/features/useDetailPanelHeights.ts +29 -0
- package/lib/hooks/features/useGridClipboard.ts +133 -73
- package/lib/hooks/features/useGridDataSource.ts +354 -128
- package/lib/hooks/features/useGridEditing.ts +211 -51
- package/lib/hooks/features/useGridPivot.ts +92 -0
- package/lib/hooks/features/useGridSpanRenderWindow.ts +104 -0
- package/lib/hooks/features/useGridSpanning.ts +410 -306
- package/lib/hooks/features/usePivot.ts +0 -0
- package/lib/hooks/features/useServerTreeChildren.ts +50 -0
- package/lib/hooks/useColumnReorder.ts +38 -44
- package/lib/hooks/useRowGrouping.ts +298 -160
- package/lib/hooks/useRowReorder.ts +62 -31
- package/lib/hooks/useTreeData.ts +287 -220
- package/lib/index.ts +28 -2
- package/lib/state/index.ts +1 -0
- package/lib/state/types.ts +7 -1
- package/lib/state/useGridStateStorage.ts +88 -29
- package/lib/theme/DataGridThemeProvider.tsx +143 -38
- package/lib/theme/gridThemeContext.ts +5 -0
- package/lib/theme/index.ts +5 -0
- package/lib/theme/presets.ts +5 -4
- package/lib/theme/types.ts +40 -2
- package/lib/types/index.ts +313 -116
- package/lib/utils/aggregation/index.ts +119 -24
- package/lib/utils/aria/index.ts +40 -0
- package/lib/utils/columnGroups.ts +110 -0
- package/lib/utils/columnLookup.ts +33 -0
- package/lib/utils/columnWidth.ts +22 -0
- package/lib/utils/dataSource/index.ts +46 -0
- package/lib/utils/detailPanel.ts +66 -0
- package/lib/utils/dragData.ts +44 -0
- package/lib/utils/editing/index.ts +30 -0
- package/lib/utils/export/exportShared.ts +197 -0
- package/lib/utils/export/exportToExcelAdvanced.ts +278 -139
- package/lib/utils/export/exportToPdf.ts +143 -92
- package/lib/utils/export/groupLabel.ts +14 -0
- package/lib/utils/export/index.ts +278 -272
- package/lib/utils/export/pdfText.ts +50 -0
- package/lib/utils/filtering/index.ts +277 -148
- package/lib/utils/focus/index.ts +115 -0
- package/lib/utils/gridApiRows.ts +35 -0
- package/lib/utils/gridModes.ts +77 -0
- package/lib/utils/grouping/groupedExportRows.ts +91 -0
- package/lib/utils/pagination/index.ts +56 -0
- package/lib/utils/pinning/index.ts +77 -33
- package/lib/utils/pivot/index.ts +368 -0
- package/lib/utils/scroll/index.ts +55 -5
- package/lib/utils/scroll/scrollEnd.ts +18 -0
- package/lib/utils/sorting/index.ts +154 -30
- package/lib/utils/syntheticRows.ts +12 -0
- package/lib/utils/values.ts +206 -0
- package/lib/utils/viewport.ts +14 -0
- package/llms.txt +261 -164
- package/package.json +13 -5
- package/lib/components/ColumnGroupHeader/ColumnGroupHeader.tsx +0 -220
- package/lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.test.tsx +0 -85
- package/lib/components/DataGrid/DataGrid.defects.test.tsx +0 -103
- package/lib/components/DataGrid/DataGrid.regression.test.tsx +0 -132
- package/lib/components/DataGrid/DataGrid.smoke.test.tsx +0 -58
- package/lib/components/DataGrid/DataGrid.v2.test.tsx +0 -127
- package/lib/components/DataGrid/DataGrid.virtualization.browser.test.tsx +0 -183
- package/lib/components/Header/Header.test.tsx +0 -135
- package/lib/components/Pagination/Pagination.test.tsx +0 -64
- package/lib/hooks/core/useDataGrid.regression.test.ts +0 -66
- package/lib/hooks/core/useGridControlledState.test.ts +0 -86
- package/lib/hooks/core/useGridKeyboardNavigation.test.ts +0 -176
- package/lib/hooks/core/useGridRowPipeline.test.ts +0 -117
- package/lib/hooks/features/useAggregation.test.ts +0 -175
- package/lib/hooks/features/usePivot.test.ts +0 -202
- package/lib/hooks/useRowGrouping.test.ts +0 -298
- package/lib/hooks/useTreeData.test.ts +0 -83
- package/lib/utils/aggregation/aggregation.test.ts +0 -16
- package/lib/utils/export/exportToExcelAdvanced.test.ts +0 -109
- package/lib/utils/export/exportToPdf.test.ts +0 -120
- package/lib/utils/export/groupedExport.test.ts +0 -144
- package/lib/utils/filtering/filtering.test.ts +0 -178
- package/lib/utils/sorting/sorting.test.ts +0 -88
|
Binary file
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { useEffect, useLayoutEffect, useRef } from 'react';
|
|
2
|
+
import type { GridRowId, GridTreeNode } from '../../types';
|
|
3
|
+
|
|
4
|
+
export interface UseServerTreeChildrenParams {
|
|
5
|
+
/** Tree data with a dataSource: children of lazy nodes come from getRows. */
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
treeNodes: Map<GridRowId, GridTreeNode>;
|
|
8
|
+
isGroupExpanded: (id: GridRowId) => boolean;
|
|
9
|
+
getNodePath: (id: GridRowId) => string[];
|
|
10
|
+
toggleExpansion: (id: GridRowId) => void;
|
|
11
|
+
/** Deduplicates: a path already loading or loaded for the current rows is not requested again. */
|
|
12
|
+
fetchChildren: (parentId: GridRowId, groupKeys: string[], onError?: (error: unknown) => void) => Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** A node the server says has children, none of which are loaded. */
|
|
16
|
+
function needsChildren(node: GridTreeNode): boolean {
|
|
17
|
+
return (node.serverChildrenCount ?? 0) > 0 && (node.children?.length ?? 0) === 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Server-side tree data: every expanded node whose children are not loaded gets them from the
|
|
22
|
+
* dataSource. That covers the user expanding a node and a refetch (sort, filter, page) replacing
|
|
23
|
+
* the rows while nodes stay expanded. A node whose children fail to load is collapsed again, so
|
|
24
|
+
* expanding it retries.
|
|
25
|
+
*/
|
|
26
|
+
export function useServerTreeChildren({
|
|
27
|
+
enabled,
|
|
28
|
+
treeNodes,
|
|
29
|
+
isGroupExpanded,
|
|
30
|
+
getNodePath,
|
|
31
|
+
toggleExpansion,
|
|
32
|
+
fetchChildren,
|
|
33
|
+
}: UseServerTreeChildrenParams): void {
|
|
34
|
+
// The failure callback runs after the request, so it reads the expansion state of that moment.
|
|
35
|
+
const expansionRef = useRef({ isGroupExpanded, toggleExpansion });
|
|
36
|
+
useLayoutEffect(() => {
|
|
37
|
+
expansionRef.current = { isGroupExpanded, toggleExpansion };
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (!enabled) return;
|
|
42
|
+
treeNodes.forEach((node, id) => {
|
|
43
|
+
if (!needsChildren(node) || !isGroupExpanded(id)) return;
|
|
44
|
+
void fetchChildren(id, getNodePath(id), () => {
|
|
45
|
+
const { isGroupExpanded: isExpanded, toggleExpansion: toggle } = expansionRef.current;
|
|
46
|
+
if (isExpanded(id)) toggle(id);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}, [enabled, treeNodes, isGroupExpanded, getNodePath, fetchChildren]);
|
|
50
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
import { useState, useCallback, useRef } from 'react';
|
|
1
|
+
import { useState, useCallback, useRef, useEffect } from 'react';
|
|
3
2
|
import type { GridColDef, GridRowModel, GridColumnOrderChangeParams } from '../types';
|
|
3
|
+
import { COLUMN_DRAG_MIME, hasDragToken, onNativeDragEnd, setDragToken } from '../utils/dragData';
|
|
4
4
|
|
|
5
5
|
export interface UseColumnReorderProps<R extends GridRowModel = GridRowModel> {
|
|
6
|
+
/** Every current column, in the grid's column order. Reported indices are positions in it. */
|
|
6
7
|
columns: GridColDef<R>[];
|
|
7
8
|
onColumnOrderChange?: (params: GridColumnOrderChangeParams) => void;
|
|
8
9
|
disableColumnReorder?: boolean;
|
|
@@ -24,85 +25,78 @@ export function useColumnReorder<R extends GridRowModel = GridRowModel>(
|
|
|
24
25
|
|
|
25
26
|
const [draggedColumn, setDraggedColumn] = useState<string | null>(null);
|
|
26
27
|
const [dragOverColumn, setDragOverColumn] = useState<string | null>(null);
|
|
27
|
-
const
|
|
28
|
+
const detachDragEndRef = useRef<() => void>(() => {});
|
|
29
|
+
|
|
30
|
+
const handleDragEnd = useCallback(() => {
|
|
31
|
+
detachDragEndRef.current();
|
|
32
|
+
detachDragEndRef.current = () => {};
|
|
33
|
+
setDraggedColumn(null);
|
|
34
|
+
setDragOverColumn(null);
|
|
35
|
+
}, []);
|
|
36
|
+
|
|
37
|
+
useEffect(() => () => detachDragEndRef.current(), []);
|
|
28
38
|
|
|
29
39
|
const handleDragStart = useCallback(
|
|
30
40
|
(field: string) => (event: React.DragEvent) => {
|
|
31
41
|
if (disableColumnReorder) return;
|
|
32
|
-
|
|
33
|
-
const columnIndex = columns.findIndex(col => col.field === field);
|
|
34
|
-
const column = columns[columnIndex];
|
|
35
|
-
|
|
36
|
-
if (column?.pinnable === false) {
|
|
42
|
+
if (!columns.some(col => col.field === field)) {
|
|
37
43
|
event.preventDefault();
|
|
38
44
|
return;
|
|
39
45
|
}
|
|
40
46
|
|
|
47
|
+
detachDragEndRef.current();
|
|
48
|
+
// Ends the drag even if the header unmounts (column virtualization) before dragend.
|
|
49
|
+
detachDragEndRef.current = onNativeDragEnd(event.currentTarget, handleDragEnd);
|
|
41
50
|
setDraggedColumn(field);
|
|
42
|
-
draggedIndexRef.current = columnIndex;
|
|
43
51
|
|
|
44
52
|
if (event.dataTransfer) {
|
|
45
53
|
event.dataTransfer.effectAllowed = 'move';
|
|
46
|
-
event
|
|
54
|
+
setDragToken(event, COLUMN_DRAG_MIME, field);
|
|
47
55
|
}
|
|
48
56
|
},
|
|
49
|
-
[columns, disableColumnReorder]
|
|
57
|
+
[columns, disableColumnReorder, handleDragEnd]
|
|
50
58
|
);
|
|
51
59
|
|
|
52
60
|
const handleDragOver = useCallback(
|
|
53
61
|
(field: string) => (event: React.DragEvent) => {
|
|
54
|
-
if (disableColumnReorder ||
|
|
62
|
+
if (disableColumnReorder || draggedColumn === null) return;
|
|
63
|
+
if (!hasDragToken(event, COLUMN_DRAG_MIME)) {
|
|
64
|
+
// Some other drag (a file, text, a row): any column drag we remember is over.
|
|
65
|
+
handleDragEnd();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
55
68
|
|
|
56
|
-
event.preventDefault();
|
|
57
|
-
event.dataTransfer.dropEffect = 'move';
|
|
69
|
+
event.preventDefault();
|
|
70
|
+
if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';
|
|
58
71
|
|
|
59
72
|
setDragOverColumn(field);
|
|
60
73
|
},
|
|
61
|
-
[draggedColumn, disableColumnReorder]
|
|
74
|
+
[draggedColumn, disableColumnReorder, handleDragEnd]
|
|
62
75
|
);
|
|
63
76
|
|
|
64
77
|
const handleDrop = useCallback(
|
|
65
78
|
(targetField: string) => (event: React.DragEvent) => {
|
|
66
79
|
event.preventDefault();
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
setDraggedColumn(null);
|
|
70
|
-
setDragOverColumn(null);
|
|
80
|
+
if (disableColumnReorder || draggedColumn === null || !hasDragToken(event, COLUMN_DRAG_MIME)) {
|
|
81
|
+
handleDragEnd();
|
|
71
82
|
return;
|
|
72
83
|
}
|
|
73
84
|
|
|
74
85
|
const oldIndex = columns.findIndex(col => col.field === draggedColumn);
|
|
75
86
|
const targetIndex = columns.findIndex(col => col.field === targetField);
|
|
87
|
+
handleDragEnd();
|
|
76
88
|
|
|
77
|
-
if (oldIndex === -1 || targetIndex === -1)
|
|
78
|
-
setDraggedColumn(null);
|
|
79
|
-
setDragOverColumn(null);
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const column = columns[oldIndex];
|
|
84
|
-
|
|
85
|
-
if (onColumnOrderChange) {
|
|
86
|
-
onColumnOrderChange({
|
|
87
|
-
column: column as unknown as GridColDef,
|
|
88
|
-
oldIndex,
|
|
89
|
-
targetIndex,
|
|
90
|
-
});
|
|
91
|
-
}
|
|
89
|
+
if (oldIndex === -1 || targetIndex === -1 || oldIndex === targetIndex) return;
|
|
92
90
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
91
|
+
onColumnOrderChange?.({
|
|
92
|
+
column: columns[oldIndex] as unknown as GridColDef,
|
|
93
|
+
oldIndex,
|
|
94
|
+
targetIndex,
|
|
95
|
+
});
|
|
96
96
|
},
|
|
97
|
-
[columns, draggedColumn, disableColumnReorder, onColumnOrderChange]
|
|
97
|
+
[columns, draggedColumn, disableColumnReorder, onColumnOrderChange, handleDragEnd]
|
|
98
98
|
);
|
|
99
99
|
|
|
100
|
-
const handleDragEnd = useCallback(() => {
|
|
101
|
-
setDraggedColumn(null);
|
|
102
|
-
setDragOverColumn(null);
|
|
103
|
-
draggedIndexRef.current = -1;
|
|
104
|
-
}, []);
|
|
105
|
-
|
|
106
100
|
return {
|
|
107
101
|
draggedColumn,
|
|
108
102
|
dragOverColumn,
|