@deephaven/grid 0.15.1 → 0.15.2

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 (62) hide show
  1. package/dist/ColumnHeaderGroup.d.ts +9 -0
  2. package/dist/ColumnHeaderGroup.d.ts.map +1 -0
  3. package/dist/ColumnHeaderGroup.js +2 -0
  4. package/dist/ColumnHeaderGroup.js.map +1 -0
  5. package/dist/Grid.d.ts +5 -4
  6. package/dist/Grid.d.ts.map +1 -1
  7. package/dist/Grid.js +5 -6
  8. package/dist/Grid.js.map +1 -1
  9. package/dist/GridAxisRange.d.ts +10 -0
  10. package/dist/GridAxisRange.d.ts.map +1 -0
  11. package/dist/GridAxisRange.js +17 -0
  12. package/dist/GridAxisRange.js.map +1 -0
  13. package/dist/GridMetricCalculator.d.ts +10 -8
  14. package/dist/GridMetricCalculator.d.ts.map +1 -1
  15. package/dist/GridMetricCalculator.js +38 -16
  16. package/dist/GridMetricCalculator.js.map +1 -1
  17. package/dist/GridMetrics.d.ts +8 -4
  18. package/dist/GridMetrics.d.ts.map +1 -1
  19. package/dist/GridModel.d.ts +20 -2
  20. package/dist/GridModel.d.ts.map +1 -1
  21. package/dist/GridModel.js +30 -2
  22. package/dist/GridModel.js.map +1 -1
  23. package/dist/GridMouseHandler.d.ts +0 -1
  24. package/dist/GridMouseHandler.d.ts.map +1 -1
  25. package/dist/GridRenderer.d.ts +33 -6
  26. package/dist/GridRenderer.d.ts.map +1 -1
  27. package/dist/GridRenderer.js +428 -179
  28. package/dist/GridRenderer.js.map +1 -1
  29. package/dist/GridUtils.d.ts +34 -24
  30. package/dist/GridUtils.d.ts.map +1 -1
  31. package/dist/GridUtils.js +99 -61
  32. package/dist/GridUtils.js.map +1 -1
  33. package/dist/MockGridModel.d.ts +1 -1
  34. package/dist/MockGridModel.d.ts.map +1 -1
  35. package/dist/MockGridModel.js +1 -0
  36. package/dist/MockGridModel.js.map +1 -1
  37. package/dist/MockTreeGridModel.d.ts +0 -1
  38. package/dist/MockTreeGridModel.d.ts.map +1 -1
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +2 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/mouse-handlers/GridColumnMoveMouseHandler.d.ts +44 -4
  44. package/dist/mouse-handlers/GridColumnMoveMouseHandler.d.ts.map +1 -1
  45. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js +486 -80
  46. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js.map +1 -1
  47. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.d.ts +7 -5
  48. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.d.ts.map +1 -1
  49. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js +26 -14
  50. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js.map +1 -1
  51. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.d.ts +7 -5
  52. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.d.ts.map +1 -1
  53. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js +11 -14
  54. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js.map +1 -1
  55. package/dist/mouse-handlers/GridSeparatorMouseHandler.d.ts +11 -4
  56. package/dist/mouse-handlers/GridSeparatorMouseHandler.d.ts.map +1 -1
  57. package/dist/mouse-handlers/GridSeparatorMouseHandler.js +41 -31
  58. package/dist/mouse-handlers/GridSeparatorMouseHandler.js.map +1 -1
  59. package/dist/mouse-handlers/index.d.ts +1 -0
  60. package/dist/mouse-handlers/index.js +1 -0
  61. package/dist/mouse-handlers/index.js.map +1 -1
  62. package/package.json +3 -3
@@ -1,9 +1,84 @@
1
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
+
3
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
+
1
5
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
6
 
7
+ import clamp from 'lodash.clamp';
3
8
  import GridUtils from "../GridUtils.js";
4
9
  import GridMouseHandler from "../GridMouseHandler.js";
5
- import { getOrThrow } from "../GridMetricCalculator.js";
6
10
  var SLOPPY_CLICK_DISTANCE = 5;
11
+ var SCROLL_INTERVAL = 1000 / 60;
12
+ var SCROLL_DELTA = 10;
13
+
14
+ /**
15
+ * Gets info about a visible column
16
+ * @param visibleIndex The visible index to get info for
17
+ * @param depth The header depth to get info for
18
+ * @param metrics Grid metrics
19
+ * @param model Grid model
20
+ * @returns The column info at the depth.
21
+ * If the column is not in a group at that depth, returns the info for the base column.
22
+ * Returns null if the column is not visible.
23
+ */
24
+ function getColumnInfo(visibleIndex, depth, metrics, model) {
25
+ var _modelColumns$get;
26
+
27
+ var {
28
+ modelColumns,
29
+ movedColumns,
30
+ visibleColumnXs,
31
+ columnCount,
32
+ visibleColumnWidths,
33
+ userColumnWidths,
34
+ calculatedColumnWidths,
35
+ floatingLeftWidth,
36
+ maxX
37
+ } = metrics;
38
+
39
+ if (depth == null || visibleIndex == null || visibleIndex > columnCount || visibleIndex < 0) {
40
+ return null;
41
+ }
42
+
43
+ var modelIndex = (_modelColumns$get = modelColumns.get(visibleIndex)) !== null && _modelColumns$get !== void 0 ? _modelColumns$get : GridUtils.getModelIndex(visibleIndex, movedColumns);
44
+ var group = model.getColumnHeaderGroup(modelIndex, depth);
45
+ var isColumnGroup = group != null;
46
+ var left;
47
+ var right;
48
+ var range;
49
+
50
+ if (group != null) {
51
+ var _visibleColumnXs$get, _visibleColumnXs$get2, _visibleColumnWidths$;
52
+
53
+ var [startVisibleIndex, endVisibleIndex] = group.getVisibleRange(movedColumns);
54
+ left = (_visibleColumnXs$get = visibleColumnXs.get(startVisibleIndex)) !== null && _visibleColumnXs$get !== void 0 ? _visibleColumnXs$get : floatingLeftWidth;
55
+ right = ((_visibleColumnXs$get2 = visibleColumnXs.get(endVisibleIndex)) !== null && _visibleColumnXs$get2 !== void 0 ? _visibleColumnXs$get2 : maxX) + ((_visibleColumnWidths$ = visibleColumnWidths.get(endVisibleIndex)) !== null && _visibleColumnWidths$ !== void 0 ? _visibleColumnWidths$ : 0);
56
+ range = [startVisibleIndex, endVisibleIndex];
57
+ } else {
58
+ var _ref, _ref2, _visibleColumnWidths$2;
59
+
60
+ var possibleLeft = visibleColumnXs.get(visibleIndex);
61
+
62
+ if (possibleLeft == null) {
63
+ return null;
64
+ }
65
+
66
+ left = possibleLeft;
67
+ right = left + ((_ref = (_ref2 = (_visibleColumnWidths$2 = visibleColumnWidths.get(visibleIndex)) !== null && _visibleColumnWidths$2 !== void 0 ? _visibleColumnWidths$2 : userColumnWidths.get(modelIndex)) !== null && _ref2 !== void 0 ? _ref2 : calculatedColumnWidths.get(modelIndex)) !== null && _ref !== void 0 ? _ref : 0);
68
+ range = [visibleIndex, visibleIndex];
69
+ }
70
+
71
+ return {
72
+ visibleIndex,
73
+ modelIndex,
74
+ left,
75
+ right,
76
+ width: right - left,
77
+ isColumnGroup,
78
+ range,
79
+ depth
80
+ };
81
+ }
7
82
 
8
83
  class GridColumnMoveMouseHandler extends GridMouseHandler {
9
84
  constructor() {
@@ -13,9 +88,116 @@ class GridColumnMoveMouseHandler extends GridMouseHandler {
13
88
 
14
89
  _defineProperty(this, "draggingOffset", void 0);
15
90
 
16
- _defineProperty(this, "startingGridPoint", void 0);
91
+ _defineProperty(this, "initialOffset", void 0);
92
+
93
+ _defineProperty(this, "initialGridPoint", void 0);
94
+
95
+ _defineProperty(this, "scrollingInterval", void 0);
96
+
97
+ _defineProperty(this, "scrollingDirection", void 0);
98
+
99
+ _defineProperty(this, "draggingColumn", null);
100
+ }
101
+
102
+ setScrollInterval(grid, direction) {
103
+ if (this.scrollingInterval != null && direction === this.scrollingDirection) {
104
+ return;
105
+ }
106
+
107
+ this.scrollingDirection = direction;
108
+ this.scrollingInterval = window.setInterval(() => {
109
+ var {
110
+ metrics
111
+ } = grid;
112
+
113
+ if (!metrics) {
114
+ return;
115
+ }
116
+
117
+ var {
118
+ left,
119
+ lastLeft,
120
+ leftOffset,
121
+ userColumnWidths,
122
+ calculatedColumnWidths,
123
+ movedColumns,
124
+ visibleColumnWidths
125
+ } = metrics;
126
+ var nextLeft = left;
127
+ var nextOffset = leftOffset;
128
+
129
+ if (direction === 'left') {
130
+ nextOffset -= SCROLL_DELTA;
131
+
132
+ while (nextOffset < 0) {
133
+ var _userColumnWidths$get;
134
+
135
+ nextLeft -= 1;
136
+ var modelIndex = GridUtils.getModelIndex(left - 1, movedColumns);
137
+ var prevColumnWidth = (_userColumnWidths$get = userColumnWidths.get(modelIndex)) !== null && _userColumnWidths$get !== void 0 ? _userColumnWidths$get : calculatedColumnWidths.get(modelIndex);
138
+
139
+ if (prevColumnWidth === undefined) {
140
+ nextOffset = 0;
141
+ } else {
142
+ nextOffset += prevColumnWidth;
143
+ }
144
+
145
+ if (nextLeft < 0) {
146
+ nextOffset = 0;
147
+ nextLeft = 0;
148
+ }
149
+ }
150
+ } else {
151
+ nextOffset += SCROLL_DELTA;
152
+ var leftColumnWidth = visibleColumnWidths.get(left);
153
+
154
+ while (leftColumnWidth !== undefined && nextOffset > leftColumnWidth) {
155
+ var _userColumnWidths$get2;
156
+
157
+ nextLeft += 1;
158
+ nextOffset -= leftColumnWidth;
159
+
160
+ var _modelIndex = GridUtils.getModelIndex(left + 1, movedColumns);
161
+
162
+ leftColumnWidth = (_userColumnWidths$get2 = userColumnWidths.get(_modelIndex)) !== null && _userColumnWidths$get2 !== void 0 ? _userColumnWidths$get2 : calculatedColumnWidths.get(_modelIndex);
163
+
164
+ if (nextLeft > lastLeft) {
165
+ nextOffset = 0;
166
+ nextLeft = lastLeft;
167
+ }
168
+ }
169
+ }
170
+
171
+ var {
172
+ mouseX,
173
+ mouseY
174
+ } = grid.state;
17
175
 
18
- _defineProperty(this, "sloppyClickThreshold", false);
176
+ if (!metrics || mouseX == null || mouseY == null) {
177
+ return;
178
+ }
179
+
180
+ this.moveDraggingColumn(mouseX, grid, direction === 'left' ? -SCROLL_DELTA : SCROLL_DELTA);
181
+ grid.setState({
182
+ left: nextLeft,
183
+ leftOffset: nextOffset
184
+ });
185
+
186
+ if (direction === 'left' && nextLeft === 0 && leftOffset === 0 || direction === 'right' && nextLeft === lastLeft) {
187
+ this.clearScrollInterval();
188
+ }
189
+ }, SCROLL_INTERVAL);
190
+ }
191
+
192
+ clearScrollInterval() {
193
+ this.scrollingDirection = undefined;
194
+ window.clearInterval(this.scrollingInterval);
195
+ this.scrollingInterval = undefined;
196
+ }
197
+
198
+ onLeave() {
199
+ this.clearScrollInterval();
200
+ return false;
19
201
  }
20
202
 
21
203
  onDown(gridPoint, grid) {
@@ -24,151 +206,375 @@ class GridColumnMoveMouseHandler extends GridMouseHandler {
24
206
  } = grid.props;
25
207
  var {
26
208
  x,
27
- y,
28
- column
209
+ column,
210
+ columnHeaderDepth
29
211
  } = gridPoint;
30
212
  var {
31
213
  metrics
32
214
  } = grid;
33
215
  if (!metrics) throw new Error('Metrics not set');
216
+ var columnInfo = getColumnInfo(column, columnHeaderDepth, metrics, model);
217
+
218
+ if (column == null || columnInfo == null || columnHeaderDepth == null) {
219
+ return false;
220
+ } // Can't drag a base column from the empty group area
221
+
222
+
223
+ if (columnHeaderDepth > 0 && !columnInfo.isColumnGroup) {
224
+ return false;
225
+ }
226
+
34
227
  var {
35
- columnHeaderHeight,
36
- rowHeaderWidth,
37
- visibleColumnXs
228
+ rowHeaderWidth
38
229
  } = metrics;
39
- this.startingGridPoint = gridPoint;
40
- this.sloppyClickThreshold = false;
230
+ this.initialGridPoint = gridPoint;
231
+ this.draggingColumn = null;
41
232
  this.cursor = null;
42
233
 
43
- if (column != null && y <= columnHeaderHeight && model.isColumnMovable(grid.getModelColumn(column))) {
44
- var columnX = getOrThrow(visibleColumnXs, column);
45
- this.draggingOffset = x - columnX - rowHeaderWidth;
46
- grid.setState({
47
- draggingColumnOffset: this.draggingOffset
48
- });
234
+ if (columnInfo.modelIndex != null && columnHeaderDepth != null && model.isColumnMovable(columnInfo.modelIndex, columnHeaderDepth)) {
235
+ this.draggingOffset = x - columnInfo.left - rowHeaderWidth;
236
+ this.initialOffset = this.draggingOffset;
49
237
  }
50
238
 
51
239
  return false;
52
240
  }
53
241
 
54
- onDrag(gridPoint, grid) {
55
- if (this.draggingOffset === undefined || this.startingGridPoint === undefined) {
242
+ onDrag(gridPoint, grid, event) {
243
+ if (this.draggingOffset === undefined || this.initialGridPoint === undefined || this.initialOffset === undefined) {
56
244
  return false;
57
245
  }
58
246
 
247
+ var {
248
+ x: mouseX,
249
+ y: mouseY
250
+ } = gridPoint;
251
+ var {
252
+ columnHeaderDepth
253
+ } = this.initialGridPoint;
59
254
  var {
60
255
  model
61
256
  } = grid.props;
62
257
  var {
63
258
  draggingColumn
64
- } = grid.state;
259
+ } = this;
65
260
  var {
66
- mouseX,
67
- mouseY,
68
- isDragging
69
- } = grid.state;
70
-
71
- if (mouseX == null || mouseY == null) {
72
- return false;
73
- } // before considering it a drag, the mouse must have moved a minimum distance
261
+ metrics
262
+ } = grid;
263
+ if (!metrics) throw new Error('Metrics not set'); // before considering it a drag, the mouse must have moved a minimum distance
74
264
  // this prevents click actions from triggering a drag state
75
265
 
76
-
77
- if (!this.sloppyClickThreshold && Math.abs(this.startingGridPoint.x - mouseX) >= SLOPPY_CLICK_DISTANCE || Math.abs(this.startingGridPoint.y - mouseY) >= SLOPPY_CLICK_DISTANCE) {
78
- this.sloppyClickThreshold = true;
79
- } else if (!this.sloppyClickThreshold && !isDragging) {
266
+ if (!draggingColumn && Math.abs(this.initialGridPoint.x - mouseX) < SLOPPY_CLICK_DISTANCE && Math.abs(this.initialGridPoint.y - mouseY) < SLOPPY_CLICK_DISTANCE) {
80
267
  return false;
81
- }
268
+ } // Get the initial dragging column info
269
+
82
270
 
83
271
  if (draggingColumn == null) {
84
- var {
85
- column
86
- } = grid.getGridPointFromXY(mouseX, mouseY);
272
+ var initialColumnInfo = getColumnInfo(this.initialGridPoint.column, columnHeaderDepth, metrics, model);
87
273
 
88
- if (column != null && !model.isColumnMovable(grid.getModelColumn(column))) {
274
+ if (!initialColumnInfo || columnHeaderDepth == null) {
89
275
  return false;
90
276
  }
91
277
 
92
- draggingColumn = column;
278
+ if (!model.isColumnMovable(initialColumnInfo.modelIndex)) {
279
+ return false;
280
+ } // Disallow dragging from the blank space in column header groups
281
+
282
+
283
+ if (columnHeaderDepth > 0 && !initialColumnInfo.isColumnGroup) {
284
+ return false;
285
+ }
286
+
287
+ if (initialColumnInfo.range[0] == null) {
288
+ return false;
289
+ }
290
+
291
+ draggingColumn = {
292
+ range: initialColumnInfo.range,
293
+ depth: columnHeaderDepth,
294
+ left: initialColumnInfo.left,
295
+ width: initialColumnInfo.width
296
+ };
297
+ var startColumn = getColumnInfo(draggingColumn.range[0], 0, metrics, model);
298
+ var endColumn = getColumnInfo(draggingColumn.range[1], 0, metrics, model); // Group goes off the table. Drag and drop could be wonky here
299
+ // Column draws only use columns that are partially visible too
300
+ // So this could cause rendering errors if we tried dragging it
301
+
302
+ if (!startColumn || !endColumn) {
303
+ return false;
304
+ }
305
+
306
+ this.draggingColumn = draggingColumn;
93
307
  grid.setState({
94
308
  draggingColumn,
95
309
  isDragging: true
96
310
  });
311
+ }
312
+ /**
313
+ * At this point, we have determined we are actually dragging a column
314
+ */
97
315
 
98
- if (draggingColumn == null) {
99
- return false;
316
+
317
+ this.cursor = 'move';
318
+ this.moveDraggingColumn(gridPoint.x, grid, event.movementX);
319
+ return true;
320
+ }
321
+ /**
322
+ * Moves a dragging column, if possible, the specified distance
323
+ * @param mouseX The point the move was initiated from
324
+ * @param grid The Grid component
325
+ * @param deltaX The distance of the move
326
+ */
327
+
328
+
329
+ moveDraggingColumn(mouseX, grid, deltaX) {
330
+ var _draggingParentGroup$;
331
+
332
+ if (this.draggingOffset === undefined || this.initialGridPoint === undefined || this.initialOffset === undefined || this.draggingColumn == null || deltaX === 0) {
333
+ return;
334
+ } // Cursor has moved past the column drag bounds, don't move the column until we hit the initial offset point again
335
+
336
+
337
+ if (this.initialOffset !== this.draggingOffset) {
338
+ // Pre move < Initial < Post move or vice-versa
339
+ // User crossed back past the iniital offset point, so we can start moving again
340
+ if (this.draggingOffset < this.initialOffset && this.initialOffset < this.draggingOffset + deltaX || this.draggingOffset > this.initialOffset && this.initialOffset > this.draggingOffset + deltaX) {
341
+ this.draggingOffset = this.initialOffset;
342
+ } else {
343
+ // Column can't move since we aren't back at the initial offset yet
344
+ this.draggingOffset += deltaX;
100
345
  }
346
+
347
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
348
+ left: mouseX - this.draggingOffset
349
+ });
350
+ grid.setState({
351
+ draggingColumn: this.draggingColumn
352
+ });
353
+ return;
101
354
  }
102
355
 
103
- this.cursor = 'move';
356
+ var {
357
+ depth: draggingColumnDepth
358
+ } = this.draggingColumn;
359
+ var {
360
+ model
361
+ } = grid.props;
362
+ var {
363
+ movedColumns
364
+ } = grid.state;
104
365
  var {
105
366
  metrics
106
367
  } = grid;
107
368
  if (!metrics) throw new Error('Metrics not set');
108
369
  var {
109
- left,
110
- lastLeft,
111
- right,
112
- rightVisible,
113
- columnCount,
114
- rowHeaderWidth,
115
- visibleColumnWidths,
116
- visibleColumnXs,
117
- width
370
+ floatingLeftWidth,
371
+ width,
372
+ columnHeaderMaxDepth,
373
+ visibleColumnXs
118
374
  } = metrics;
119
- var minX = rowHeaderWidth;
375
+ var isDraggingLeft = deltaX < 0;
376
+ var draggingColumn = getColumnInfo(this.draggingColumn.range[0], draggingColumnDepth, metrics, model);
377
+
378
+ if (!draggingColumn) {
379
+ return;
380
+ } // The returned left/right are the original position, not dragged position
381
+ // This is where the dragging column's floating position accounting for dragged distance
382
+
383
+
384
+ var floatingDraggingLeft = mouseX - this.draggingOffset;
385
+ var floatingDraggingRight = floatingDraggingLeft + draggingColumn.width;
386
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
387
+ left: floatingDraggingLeft
388
+ });
389
+ grid.setState({
390
+ draggingColumn: this.draggingColumn
391
+ });
392
+ var swapColumn = getColumnInfo(GridUtils.getColumnAtX(clamp(isDraggingLeft ? floatingDraggingLeft : floatingDraggingRight, floatingLeftWidth, width), metrics, true), draggingColumnDepth, metrics, model);
393
+ var parentGroup = model.getColumnHeaderParentGroup(draggingColumn.modelIndex, draggingColumn.depth);
394
+
395
+ if (!swapColumn) {
396
+ return;
397
+ } // Check if we should pin to the edge of the parent
398
+
399
+
400
+ if (parentGroup) {
401
+ var parentVisibleRange = parentGroup.getVisibleRange(movedColumns); // Cannot move to this left position, pin to left of parent
402
+
403
+ if (swapColumn.visibleIndex < parentVisibleRange[0]) {
404
+ var _visibleColumnXs$get3;
405
+
406
+ var _newMovedColumns = this.moveColumn(draggingColumn, parentVisibleRange[0], movedColumns);
407
+
408
+ this.draggingOffset = mouseX - ((_visibleColumnXs$get3 = visibleColumnXs.get(parentVisibleRange[0])) !== null && _visibleColumnXs$get3 !== void 0 ? _visibleColumnXs$get3 : 0);
409
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
410
+ left: mouseX - this.draggingOffset
411
+ });
412
+ this.clearScrollInterval();
413
+ grid.setState({
414
+ draggingColumn: this.draggingColumn,
415
+ movedColumns: _newMovedColumns
416
+ });
417
+ return;
418
+ } // Pin to the right of parent
419
+
420
+
421
+ if (swapColumn.visibleIndex > parentVisibleRange[1]) {
422
+ var _getColumnInfo;
423
+
424
+ var _newMovedColumns2 = this.moveColumn(draggingColumn, parentVisibleRange[1] - (draggingColumn.range[1] - draggingColumn.range[0]), movedColumns);
425
+
426
+ var {
427
+ right: parentRight = 0
428
+ } = (_getColumnInfo = getColumnInfo(parentVisibleRange[1], 0, metrics, model)) !== null && _getColumnInfo !== void 0 ? _getColumnInfo : {};
429
+ this.draggingOffset = mouseX - (parentRight - draggingColumn.width);
430
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
431
+ left: mouseX - this.draggingOffset
432
+ });
433
+ this.clearScrollInterval();
434
+ grid.setState({
435
+ draggingColumn: this.draggingColumn,
436
+ movedColumns: _newMovedColumns2
437
+ });
438
+ return;
439
+ }
440
+ } // Hit an unmovable column, move to the first available position next to it
441
+
442
+
443
+ if (!model.isColumnMovable(swapColumn.modelIndex)) {
444
+ var toVisibleIndex = swapColumn.visibleIndex;
445
+
446
+ if (isDraggingLeft) {
447
+ toVisibleIndex += 1;
448
+
449
+ while (toVisibleIndex < draggingColumn.visibleIndex && !model.isColumnMovable(GridUtils.getModelIndex(toVisibleIndex, movedColumns))) {
450
+ toVisibleIndex += 1;
451
+ }
452
+ } else {
453
+ toVisibleIndex -= 1;
454
+
455
+ while (toVisibleIndex > draggingColumn.visibleIndex && !model.isColumnMovable(GridUtils.getModelIndex(toVisibleIndex, movedColumns))) {
456
+ toVisibleIndex -= 1;
457
+ }
458
+ }
459
+
460
+ if (toVisibleIndex !== draggingColumn.visibleIndex) {
461
+ if (!isDraggingLeft) {
462
+ // Offset for range if dragging right
463
+ toVisibleIndex -= draggingColumn.range[1] - draggingColumn.range[0];
464
+ }
465
+
466
+ var _newMovedColumns3 = this.moveColumn(draggingColumn, toVisibleIndex, movedColumns);
467
+
468
+ grid.setState({
469
+ movedColumns: _newMovedColumns3,
470
+ draggingColumn: this.draggingColumn
471
+ });
472
+ }
473
+
474
+ var toColumnInfo = getColumnInfo(toVisibleIndex, 0, metrics, model);
475
+
476
+ if (isDraggingLeft) {
477
+ var _toColumnInfo$left;
478
+
479
+ this.draggingOffset = mouseX - ((_toColumnInfo$left = toColumnInfo === null || toColumnInfo === void 0 ? void 0 : toColumnInfo.left) !== null && _toColumnInfo$left !== void 0 ? _toColumnInfo$left : 0);
480
+ } else {
481
+ var _toColumnInfo$right;
482
+
483
+ this.draggingOffset = mouseX - (((_toColumnInfo$right = toColumnInfo === null || toColumnInfo === void 0 ? void 0 : toColumnInfo.right) !== null && _toColumnInfo$right !== void 0 ? _toColumnInfo$right : 0) - draggingColumn.width);
484
+ }
120
485
 
121
- if (left < draggingColumn) {
122
- var leftColumn = draggingColumn - 1;
123
- minX = getOrThrow(visibleColumnXs, leftColumn) + getOrThrow(visibleColumnWidths, leftColumn) * 0.5 + this.draggingOffset + rowHeaderWidth;
486
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
487
+ left: mouseX - this.draggingOffset
488
+ });
489
+ grid.setState({
490
+ draggingColumn: this.draggingColumn
491
+ });
492
+ return;
124
493
  }
125
494
 
126
- var maxX = width;
495
+ if (floatingDraggingLeft <= floatingLeftWidth) {
496
+ this.setScrollInterval(grid, 'left');
497
+ } else if (floatingDraggingRight > width) {
498
+ this.setScrollInterval(grid, 'right');
499
+ } else {
500
+ this.clearScrollInterval();
501
+ } // Can't swap a column with itself
502
+
127
503
 
128
- if (draggingColumn < right) {
129
- var rightColumn = draggingColumn + 1;
130
- maxX = getOrThrow(visibleColumnXs, rightColumn) + getOrThrow(visibleColumnWidths, rightColumn) * 0.5 - getOrThrow(visibleColumnWidths, draggingColumn) + this.draggingOffset + rowHeaderWidth;
504
+ if (swapColumn.visibleIndex === draggingColumn.visibleIndex) {
505
+ return;
506
+ } // Can't swap a column to the left when dragging right or vice versa
507
+
508
+
509
+ if (isDraggingLeft && draggingColumn.visibleIndex < swapColumn.visibleIndex || !isDraggingLeft && draggingColumn.visibleIndex > swapColumn.visibleIndex) {
510
+ return;
131
511
  }
132
512
 
133
- var {
134
- movedColumns
135
- } = grid.state;
513
+ var switchPoint = swapColumn.left + swapColumn.width * 0.5;
514
+ var draggingParentGroup = model.getColumnHeaderParentGroup(draggingColumn.modelIndex, draggingColumn.depth); // Get the highest level group that is not the common base group
515
+ // This group is what we need to drag past
516
+
517
+ var maxDepthSwapGroup;
518
+ var maxSwapDepth = ((_draggingParentGroup$ = draggingParentGroup === null || draggingParentGroup === void 0 ? void 0 : draggingParentGroup.depth) !== null && _draggingParentGroup$ !== void 0 ? _draggingParentGroup$ : columnHeaderMaxDepth) - 1;
519
+
520
+ while (maxSwapDepth >= 0 && maxDepthSwapGroup === undefined) {
521
+ maxDepthSwapGroup = model.getColumnHeaderGroup(swapColumn.modelIndex, maxSwapDepth);
522
+ maxSwapDepth -= 1;
523
+ }
524
+
525
+ var newMovedColumns;
526
+
527
+ if (isDraggingLeft && floatingDraggingLeft < switchPoint && (!maxDepthSwapGroup || swapColumn.visibleIndex === maxDepthSwapGroup.getVisibleRange(movedColumns)[0])) {
528
+ newMovedColumns = this.moveColumn(draggingColumn, swapColumn.range[0], movedColumns);
529
+ }
530
+
531
+ if (!isDraggingLeft && floatingDraggingRight > switchPoint && (!maxDepthSwapGroup || swapColumn.visibleIndex === maxDepthSwapGroup.getVisibleRange(movedColumns)[1])) {
532
+ newMovedColumns = this.moveColumn(draggingColumn, swapColumn.range[1] - (draggingColumn.range[1] - draggingColumn.range[0]), movedColumns);
533
+ }
136
534
 
137
- if (mouseX < minX && draggingColumn > 0 && model.isColumnMovable(grid.getModelColumn(draggingColumn - 1))) {
138
- movedColumns = GridUtils.moveItem(draggingColumn, draggingColumn - 1, movedColumns);
139
- draggingColumn -= 1;
140
- } else if (maxX < mouseX && draggingColumn < columnCount - 1 && model.isColumnMovable(grid.getModelColumn(draggingColumn + 1))) {
141
- movedColumns = GridUtils.moveItem(draggingColumn, draggingColumn + 1, movedColumns);
142
- draggingColumn += 1;
535
+ if (!newMovedColumns) {
536
+ return;
143
537
  }
144
538
 
539
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
540
+ left: floatingDraggingLeft
541
+ });
145
542
  grid.setState({
146
- movedColumns,
147
- draggingColumn
543
+ movedColumns: newMovedColumns,
544
+ draggingColumn: this.draggingColumn
148
545
  });
149
- var minMoveX = rowHeaderWidth + getOrThrow(visibleColumnWidths, left) * 0.5;
150
- var maxMoveX = rowHeaderWidth + getOrThrow(visibleColumnXs, rightVisible) + getOrThrow(visibleColumnWidths, rightVisible) * 0.5;
151
-
152
- if (mouseX < minMoveX && left > 0) {
153
- grid.setState({
154
- left: left - 1
155
- });
156
- } else if (mouseX > maxMoveX && left < lastLeft) {
157
- grid.setState({
158
- left: left + 1
546
+ }
547
+ /**
548
+ * Applies the column move and updates draggingColumn in the mouse handler
549
+ * Does not check if the move is valid
550
+ * @param draggingColumn The dragging column info
551
+ * @param to The index to move the column or range to
552
+ * @param movedColumns The array of column moves
553
+ * @returns A new array of column moves
554
+ */
555
+
556
+
557
+ moveColumn(draggingColumn, to, movedColumns) {
558
+ var newMovedColumns = draggingColumn.isColumnGroup ? GridUtils.moveRange(draggingColumn.range, to, movedColumns) : GridUtils.moveItem(draggingColumn.visibleIndex, to, movedColumns);
559
+ var moveDistance = to - draggingColumn.range[0];
560
+ var newDraggingRange = [draggingColumn.range[0] + moveDistance, draggingColumn.range[1] + moveDistance];
561
+
562
+ if (this.draggingColumn) {
563
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
564
+ range: newDraggingRange
159
565
  });
160
566
  }
161
567
 
162
- return true;
568
+ return newMovedColumns;
163
569
  }
164
570
 
165
571
  onUp(gridPoint, grid) {
166
572
  this.cursor = null;
573
+ this.clearScrollInterval();
167
574
 
168
575
  if (this.draggingOffset != null) {
169
576
  this.draggingOffset = undefined;
170
577
  grid.setState({
171
- draggingColumnOffset: null,
172
578
  draggingColumn: null,
173
579
  isDragging: false
174
580
  });