@deephaven/grid 0.43.0 → 0.44.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 (115) hide show
  1. package/dist/CellInputField.css +23 -0
  2. package/dist/CellInputField.css.map +1 -0
  3. package/dist/CellInputField.js +174 -0
  4. package/dist/CellInputField.js.map +1 -0
  5. package/dist/CellRenderer.js +64 -0
  6. package/dist/CellRenderer.js.map +1 -0
  7. package/dist/ColumnHeaderGroup.js +2 -0
  8. package/dist/ColumnHeaderGroup.js.map +1 -0
  9. package/dist/DataBarCellRenderer.js +404 -0
  10. package/dist/DataBarCellRenderer.js.map +1 -0
  11. package/dist/DataBarGridModel.js +27 -0
  12. package/dist/DataBarGridModel.js.map +1 -0
  13. package/dist/EditableGridModel.js +14 -0
  14. package/dist/EditableGridModel.js.map +1 -0
  15. package/dist/EventHandlerResult.js +2 -0
  16. package/dist/EventHandlerResult.js.map +1 -0
  17. package/dist/ExpandableGridModel.js +8 -0
  18. package/dist/ExpandableGridModel.js.map +1 -0
  19. package/dist/Grid.css +45 -0
  20. package/dist/Grid.css.map +1 -0
  21. package/dist/Grid.js +1947 -0
  22. package/dist/Grid.js.map +1 -0
  23. package/dist/GridAxisRange.js +17 -0
  24. package/dist/GridAxisRange.js.map +1 -0
  25. package/dist/GridColorUtils.js +146 -0
  26. package/dist/GridColorUtils.js.map +1 -0
  27. package/dist/GridMetricCalculator.js +1500 -0
  28. package/dist/GridMetricCalculator.js.map +1 -0
  29. package/dist/GridMetrics.js +2 -0
  30. package/dist/GridMetrics.js.map +1 -0
  31. package/dist/GridModel.js +193 -0
  32. package/dist/GridModel.js.map +1 -0
  33. package/dist/GridMouseHandler.js +57 -0
  34. package/dist/GridMouseHandler.js.map +1 -0
  35. package/dist/GridRange.js +684 -0
  36. package/dist/GridRange.js.map +1 -0
  37. package/dist/GridRenderer.js +2038 -0
  38. package/dist/GridRenderer.js.map +1 -0
  39. package/dist/GridRendererTypes.js +3 -0
  40. package/dist/GridRendererTypes.js.map +1 -0
  41. package/dist/GridTestUtils.js +16 -0
  42. package/dist/GridTestUtils.js.map +1 -0
  43. package/dist/GridTheme.js +100 -0
  44. package/dist/GridTheme.js.map +1 -0
  45. package/dist/GridUtils.js +1198 -0
  46. package/dist/GridUtils.js.map +1 -0
  47. package/dist/KeyHandler.js +36 -0
  48. package/dist/KeyHandler.js.map +1 -0
  49. package/dist/MockDataBarGridModel.js +119 -0
  50. package/dist/MockDataBarGridModel.js.map +1 -0
  51. package/dist/MockGridData.js +5 -0
  52. package/dist/MockGridData.js.map +1 -0
  53. package/dist/MockGridModel.js +122 -0
  54. package/dist/MockGridModel.js.map +1 -0
  55. package/dist/MockTreeGridModel.js +193 -0
  56. package/dist/MockTreeGridModel.js.map +1 -0
  57. package/dist/StaticDataGridModel.js +40 -0
  58. package/dist/StaticDataGridModel.js.map +1 -0
  59. package/dist/TextCellRenderer.js +210 -0
  60. package/dist/TextCellRenderer.js.map +1 -0
  61. package/dist/ThemeContext.js +4 -0
  62. package/dist/ThemeContext.js.map +1 -0
  63. package/dist/TokenBoxCellRenderer.js +4 -0
  64. package/dist/TokenBoxCellRenderer.js.map +1 -0
  65. package/dist/ViewportDataGridModel.js +43 -0
  66. package/dist/ViewportDataGridModel.js.map +1 -0
  67. package/dist/errors/AssertionError.js +11 -0
  68. package/dist/errors/AssertionError.js.map +1 -0
  69. package/dist/errors/PasteError.js +11 -0
  70. package/dist/errors/PasteError.js.map +1 -0
  71. package/dist/errors/assertIsDefined.js +8 -0
  72. package/dist/errors/assertIsDefined.js.map +1 -0
  73. package/dist/errors/index.js +4 -0
  74. package/dist/errors/index.js.map +1 -0
  75. package/dist/index.js +32 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/key-handlers/EditKeyHandler.js +46 -0
  78. package/dist/key-handlers/EditKeyHandler.js.map +1 -0
  79. package/dist/key-handlers/PasteKeyHandler.js +124 -0
  80. package/dist/key-handlers/PasteKeyHandler.js.map +1 -0
  81. package/dist/key-handlers/SelectionKeyHandler.js +272 -0
  82. package/dist/key-handlers/SelectionKeyHandler.js.map +1 -0
  83. package/dist/key-handlers/TreeKeyHandler.js +45 -0
  84. package/dist/key-handlers/TreeKeyHandler.js.map +1 -0
  85. package/dist/key-handlers/index.js +5 -0
  86. package/dist/key-handlers/index.js.map +1 -0
  87. package/dist/memoizeClear.js +33 -0
  88. package/dist/memoizeClear.js.map +1 -0
  89. package/dist/mouse-handlers/EditMouseHandler.js +25 -0
  90. package/dist/mouse-handlers/EditMouseHandler.js.map +1 -0
  91. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js +504 -0
  92. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js.map +1 -0
  93. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js +67 -0
  94. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js.map +1 -0
  95. package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js +164 -0
  96. package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js.map +1 -0
  97. package/dist/mouse-handlers/GridRowMoveMouseHandler.js +139 -0
  98. package/dist/mouse-handlers/GridRowMoveMouseHandler.js.map +1 -0
  99. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js +54 -0
  100. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js.map +1 -0
  101. package/dist/mouse-handlers/GridRowTreeMouseHandler.js +58 -0
  102. package/dist/mouse-handlers/GridRowTreeMouseHandler.js.map +1 -0
  103. package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js +39 -0
  104. package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js.map +1 -0
  105. package/dist/mouse-handlers/GridSelectionMouseHandler.js +223 -0
  106. package/dist/mouse-handlers/GridSelectionMouseHandler.js.map +1 -0
  107. package/dist/mouse-handlers/GridSeparatorMouseHandler.js +213 -0
  108. package/dist/mouse-handlers/GridSeparatorMouseHandler.js.map +1 -0
  109. package/dist/mouse-handlers/GridTokenMouseHandler.js +161 -0
  110. package/dist/mouse-handlers/GridTokenMouseHandler.js.map +1 -0
  111. package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js +165 -0
  112. package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js.map +1 -0
  113. package/dist/mouse-handlers/index.js +13 -0
  114. package/dist/mouse-handlers/index.js.map +1 -0
  115. package/package.json +3 -3
@@ -0,0 +1,33 @@
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
+ 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; }
3
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
5
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
6
+ /**
7
+ * Extension of memoizee that clears the entire cache when it's full.
8
+ * This avoids the situation where LRU cache starts thrashing when it fills up.
9
+ * Could look at writing our own memoize with a smarter cache to avoid overhead of
10
+ * LRU queue, but this should be sufficient for now.
11
+ */
12
+ import memoizee from 'memoizee';
13
+
14
+ /**
15
+ * @param fn The function to memoize
16
+ * @param options The options to set for memoization
17
+ */
18
+ export var memoizeClear = (fn, options) => {
19
+ var isClearingCache = false;
20
+ var memoizedFn = memoizee(fn, _objectSpread(_objectSpread({}, options), {}, {
21
+ dispose: () => {
22
+ // Need to track when we're clearing because dispose gets called for all items removed
23
+ if (!isClearingCache) {
24
+ isClearingCache = true;
25
+ memoizedFn.clear();
26
+ isClearingCache = false;
27
+ }
28
+ }
29
+ }));
30
+ return memoizedFn;
31
+ };
32
+ export default memoizeClear;
33
+ //# sourceMappingURL=memoizeClear.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoizeClear.js","names":["memoizee","memoizeClear","fn","options","isClearingCache","memoizedFn","dispose","clear"],"sources":["../src/memoizeClear.ts"],"sourcesContent":["/**\n * Extension of memoizee that clears the entire cache when it's full.\n * This avoids the situation where LRU cache starts thrashing when it fills up.\n * Could look at writing our own memoize with a smarter cache to avoid overhead of\n * LRU queue, but this should be sufficient for now.\n */\nimport memoizee from 'memoizee';\n\n/**\n * @param fn The function to memoize\n * @param options The options to set for memoization\n */\nexport const memoizeClear: typeof memoizee = (fn, options) => {\n let isClearingCache = false;\n const memoizedFn = memoizee(fn, {\n ...options,\n dispose: () => {\n // Need to track when we're clearing because dispose gets called for all items removed\n if (!isClearingCache) {\n isClearingCache = true;\n memoizedFn.clear();\n isClearingCache = false;\n }\n },\n });\n\n return memoizedFn;\n};\n\nexport default memoizeClear;\n"],"mappings":";;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA,OAAOA,QAAQ,MAAM,UAAU;;AAE/B;AACA;AACA;AACA;AACA,OAAO,IAAMC,YAA6B,GAAG,CAACC,EAAE,EAAEC,OAAO,KAAK;EAC5D,IAAIC,eAAe,GAAG,KAAK;EAC3B,IAAMC,UAAU,GAAGL,QAAQ,CAACE,EAAE,kCACzBC,OAAO;IACVG,OAAO,EAAE,MAAM;MACb;MACA,IAAI,CAACF,eAAe,EAAE;QACpBA,eAAe,GAAG,IAAI;QACtBC,UAAU,CAACE,KAAK,EAAE;QAClBH,eAAe,GAAG,KAAK;MACzB;IACF;EAAC,GACD;EAEF,OAAOC,UAAU;AACnB,CAAC;AAED,eAAeJ,YAAY"}
@@ -0,0 +1,25 @@
1
+ /* eslint class-methods-use-this: "off" */
2
+ import { isEditableGridModel } from "../EditableGridModel.js";
3
+ import GridMouseHandler from "../GridMouseHandler.js";
4
+ import GridRange from "../GridRange.js";
5
+ /**
6
+ * Handles clicking on a cell to edit it in an editable grid
7
+ */
8
+ class EditMouseHandler extends GridMouseHandler {
9
+ onDoubleClick(_ref, grid) {
10
+ var {
11
+ column,
12
+ row
13
+ } = _ref;
14
+ var {
15
+ model
16
+ } = grid.props;
17
+ if (isEditableGridModel(model) && column != null && row != null && model.isEditableRange(GridRange.makeCell(column, row))) {
18
+ grid.startEditing(column, row);
19
+ return true;
20
+ }
21
+ return false;
22
+ }
23
+ }
24
+ export default EditMouseHandler;
25
+ //# sourceMappingURL=EditMouseHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditMouseHandler.js","names":["isEditableGridModel","GridMouseHandler","GridRange","EditMouseHandler","onDoubleClick","grid","column","row","model","props","isEditableRange","makeCell","startEditing"],"sources":["../../src/mouse-handlers/EditMouseHandler.ts"],"sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport { isEditableGridModel } from '../EditableGridModel';\nimport { EventHandlerResult } from '../EventHandlerResult';\nimport Grid from '../Grid';\nimport GridMouseHandler from '../GridMouseHandler';\nimport GridRange from '../GridRange';\nimport { GridPoint } from '../GridUtils';\n\n/**\n * Handles clicking on a cell to edit it in an editable grid\n */\nclass EditMouseHandler extends GridMouseHandler {\n onDoubleClick({ column, row }: GridPoint, grid: Grid): EventHandlerResult {\n const { model } = grid.props;\n if (\n isEditableGridModel(model) &&\n column != null &&\n row != null &&\n model.isEditableRange(GridRange.makeCell(column, row))\n ) {\n grid.startEditing(column, row);\n return true;\n }\n return false;\n }\n}\n\nexport default EditMouseHandler;\n"],"mappings":"AAAA;AAAA,SACSA,mBAAmB;AAAA,OAGrBC,gBAAgB;AAAA,OAChBC,SAAS;AAGhB;AACA;AACA;AACA,MAAMC,gBAAgB,SAASF,gBAAgB,CAAC;EAC9CG,aAAa,OAA6BC,IAAU,EAAsB;IAAA,IAA5D;MAAEC,MAAM;MAAEC;IAAe,CAAC;IACtC,IAAM;MAAEC;IAAM,CAAC,GAAGH,IAAI,CAACI,KAAK;IAC5B,IACET,mBAAmB,CAACQ,KAAK,CAAC,IAC1BF,MAAM,IAAI,IAAI,IACdC,GAAG,IAAI,IAAI,IACXC,KAAK,CAACE,eAAe,CAACR,SAAS,CAACS,QAAQ,CAACL,MAAM,EAAEC,GAAG,CAAC,CAAC,EACtD;MACAF,IAAI,CAACO,YAAY,CAACN,MAAM,EAAEC,GAAG,CAAC;MAC9B,OAAO,IAAI;IACb;IACA,OAAO,KAAK;EACd;AACF;AAEA,eAAeJ,gBAAgB"}
@@ -0,0 +1,504 @@
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
+ 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; }
3
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
5
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
6
+ import clamp from 'lodash.clamp';
7
+ import GridUtils from "../GridUtils.js";
8
+ import GridMouseHandler from "../GridMouseHandler.js";
9
+ var SLOPPY_CLICK_DISTANCE = 5;
10
+ var SCROLL_INTERVAL = 1000 / 60;
11
+ var SCROLL_DELTA = 10;
12
+ /**
13
+ * Gets info about a visible column
14
+ * @param visibleIndex The visible index to get info for
15
+ * @param depth The header depth to get info for
16
+ * @param metrics Grid metrics
17
+ * @param model Grid model
18
+ * @returns The column info at the depth.
19
+ * If the column is not in a group at that depth, returns the info for the base column.
20
+ * Returns null if the column is not visible.
21
+ */
22
+ function getColumnInfo(visibleIndex, depth, metrics, model) {
23
+ var _modelColumns$get;
24
+ var {
25
+ modelColumns,
26
+ movedColumns,
27
+ allColumnXs,
28
+ columnCount,
29
+ allColumnWidths,
30
+ userColumnWidths,
31
+ calculatedColumnWidths,
32
+ floatingLeftWidth,
33
+ maxX
34
+ } = metrics;
35
+ if (depth == null || visibleIndex == null || visibleIndex > columnCount || visibleIndex < 0) {
36
+ return null;
37
+ }
38
+ var modelIndex = (_modelColumns$get = modelColumns.get(visibleIndex)) !== null && _modelColumns$get !== void 0 ? _modelColumns$get : GridUtils.getModelIndex(visibleIndex, movedColumns);
39
+ var group = model.getColumnHeaderGroup(modelIndex, depth);
40
+ var isColumnGroup = group != null;
41
+ var left;
42
+ var right;
43
+ var range;
44
+ if (group != null) {
45
+ var _allColumnXs$get, _allColumnXs$get2, _allColumnWidths$get;
46
+ var [startVisibleIndex, endVisibleIndex] = group.getVisibleRange(movedColumns);
47
+ left = (_allColumnXs$get = allColumnXs.get(startVisibleIndex)) !== null && _allColumnXs$get !== void 0 ? _allColumnXs$get : floatingLeftWidth;
48
+ right = ((_allColumnXs$get2 = allColumnXs.get(endVisibleIndex)) !== null && _allColumnXs$get2 !== void 0 ? _allColumnXs$get2 : maxX) + ((_allColumnWidths$get = allColumnWidths.get(endVisibleIndex)) !== null && _allColumnWidths$get !== void 0 ? _allColumnWidths$get : 0);
49
+ range = [startVisibleIndex, endVisibleIndex];
50
+ } else {
51
+ var _ref, _ref2, _allColumnWidths$get2;
52
+ var possibleLeft = allColumnXs.get(visibleIndex);
53
+ if (possibleLeft == null) {
54
+ return null;
55
+ }
56
+ left = possibleLeft;
57
+ right = left + ((_ref = (_ref2 = (_allColumnWidths$get2 = allColumnWidths.get(visibleIndex)) !== null && _allColumnWidths$get2 !== void 0 ? _allColumnWidths$get2 : userColumnWidths.get(modelIndex)) !== null && _ref2 !== void 0 ? _ref2 : calculatedColumnWidths.get(modelIndex)) !== null && _ref !== void 0 ? _ref : 0);
58
+ range = [visibleIndex, visibleIndex];
59
+ }
60
+ return {
61
+ visibleIndex,
62
+ modelIndex,
63
+ left,
64
+ right,
65
+ width: right - left,
66
+ isColumnGroup,
67
+ range,
68
+ depth
69
+ };
70
+ }
71
+ class GridColumnMoveMouseHandler extends GridMouseHandler {
72
+ constructor() {
73
+ super(...arguments);
74
+ _defineProperty(this, "cursor", null);
75
+ _defineProperty(this, "draggingOffset", void 0);
76
+ _defineProperty(this, "initialOffset", void 0);
77
+ _defineProperty(this, "initialGridPoint", void 0);
78
+ _defineProperty(this, "scrollingInterval", void 0);
79
+ _defineProperty(this, "scrollingDirection", void 0);
80
+ _defineProperty(this, "draggingColumn", null);
81
+ }
82
+ setScrollInterval(grid, direction) {
83
+ if (this.scrollingInterval != null && direction === this.scrollingDirection) {
84
+ return;
85
+ }
86
+ this.scrollingDirection = direction;
87
+ this.scrollingInterval = window.setInterval(() => {
88
+ var {
89
+ metrics
90
+ } = grid;
91
+ if (!metrics) {
92
+ return;
93
+ }
94
+ var {
95
+ left,
96
+ lastLeft,
97
+ leftOffset,
98
+ userColumnWidths,
99
+ calculatedColumnWidths,
100
+ movedColumns,
101
+ allColumnWidths
102
+ } = metrics;
103
+ var nextLeft = left;
104
+ var nextOffset = leftOffset;
105
+ if (direction === 'left') {
106
+ nextOffset -= SCROLL_DELTA;
107
+ while (nextOffset < 0) {
108
+ var _userColumnWidths$get;
109
+ nextLeft -= 1;
110
+ var modelIndex = GridUtils.getModelIndex(left - 1, movedColumns);
111
+ var prevColumnWidth = (_userColumnWidths$get = userColumnWidths.get(modelIndex)) !== null && _userColumnWidths$get !== void 0 ? _userColumnWidths$get : calculatedColumnWidths.get(modelIndex);
112
+ if (prevColumnWidth === undefined) {
113
+ nextOffset = 0;
114
+ } else {
115
+ nextOffset += prevColumnWidth;
116
+ }
117
+ if (nextLeft < 0) {
118
+ nextOffset = 0;
119
+ nextLeft = 0;
120
+ }
121
+ }
122
+ } else {
123
+ nextOffset += SCROLL_DELTA;
124
+ var leftColumnWidth = allColumnWidths.get(left);
125
+ while (leftColumnWidth !== undefined && nextOffset > leftColumnWidth) {
126
+ var _userColumnWidths$get2;
127
+ nextLeft += 1;
128
+ nextOffset -= leftColumnWidth;
129
+ var _modelIndex = GridUtils.getModelIndex(left + 1, movedColumns);
130
+ leftColumnWidth = (_userColumnWidths$get2 = userColumnWidths.get(_modelIndex)) !== null && _userColumnWidths$get2 !== void 0 ? _userColumnWidths$get2 : calculatedColumnWidths.get(_modelIndex);
131
+ if (nextLeft > lastLeft) {
132
+ nextOffset = 0;
133
+ nextLeft = lastLeft;
134
+ }
135
+ }
136
+ }
137
+ var {
138
+ mouseX,
139
+ mouseY
140
+ } = grid.state;
141
+ if (metrics == null || mouseX == null || mouseY == null) {
142
+ return;
143
+ }
144
+ this.moveDraggingColumn(mouseX, grid, direction === 'left' ? -SCROLL_DELTA : SCROLL_DELTA);
145
+ grid.setState({
146
+ left: nextLeft,
147
+ leftOffset: nextOffset
148
+ });
149
+ if (direction === 'left' && nextLeft === 0 && leftOffset === 0 || direction === 'right' && nextLeft === lastLeft) {
150
+ this.clearScrollInterval();
151
+ }
152
+ }, SCROLL_INTERVAL);
153
+ }
154
+ clearScrollInterval() {
155
+ this.scrollingDirection = undefined;
156
+ window.clearInterval(this.scrollingInterval);
157
+ this.scrollingInterval = undefined;
158
+ }
159
+ onLeave() {
160
+ this.clearScrollInterval();
161
+ return false;
162
+ }
163
+ onDown(gridPoint, grid) {
164
+ var {
165
+ model
166
+ } = grid.props;
167
+ var {
168
+ x,
169
+ column,
170
+ columnHeaderDepth
171
+ } = gridPoint;
172
+ var {
173
+ metrics
174
+ } = grid;
175
+ if (!metrics) throw new Error('Metrics not set');
176
+ var columnInfo = getColumnInfo(column, columnHeaderDepth, metrics, model);
177
+ if (column == null || columnInfo == null || columnHeaderDepth == null) {
178
+ return false;
179
+ }
180
+
181
+ // Can't drag a base column from the empty group area
182
+ if (columnHeaderDepth > 0 && !columnInfo.isColumnGroup) {
183
+ return false;
184
+ }
185
+ var {
186
+ rowHeaderWidth
187
+ } = metrics;
188
+ this.initialGridPoint = gridPoint;
189
+ this.draggingColumn = null;
190
+ this.cursor = null;
191
+ if (columnInfo.modelIndex != null && columnHeaderDepth != null && model.isColumnMovable(columnInfo.modelIndex, columnHeaderDepth)) {
192
+ this.draggingOffset = x - columnInfo.left - rowHeaderWidth;
193
+ this.initialOffset = this.draggingOffset;
194
+ }
195
+ return false;
196
+ }
197
+ onDrag(gridPoint, grid, event) {
198
+ if (this.draggingOffset === undefined || this.initialGridPoint === undefined || this.initialOffset === undefined) {
199
+ return false;
200
+ }
201
+ var {
202
+ x: mouseX,
203
+ y: mouseY
204
+ } = gridPoint;
205
+ var {
206
+ columnHeaderDepth
207
+ } = this.initialGridPoint;
208
+ var {
209
+ model
210
+ } = grid.props;
211
+ var {
212
+ draggingColumn
213
+ } = this;
214
+ var {
215
+ metrics
216
+ } = grid;
217
+ if (!metrics) throw new Error('Metrics not set');
218
+
219
+ // before considering it a drag, the mouse must have moved a minimum distance
220
+ // this prevents click actions from triggering a drag state
221
+ if (!draggingColumn && Math.abs(this.initialGridPoint.x - mouseX) < SLOPPY_CLICK_DISTANCE && Math.abs(this.initialGridPoint.y - mouseY) < SLOPPY_CLICK_DISTANCE) {
222
+ return false;
223
+ }
224
+
225
+ // Get the initial dragging column info
226
+ if (draggingColumn == null) {
227
+ var initialColumnInfo = getColumnInfo(this.initialGridPoint.column, columnHeaderDepth, metrics, model);
228
+ if (!initialColumnInfo || columnHeaderDepth == null) {
229
+ return false;
230
+ }
231
+ if (!model.isColumnMovable(initialColumnInfo.modelIndex)) {
232
+ return false;
233
+ }
234
+
235
+ // Disallow dragging from the blank space in column header groups
236
+ if (columnHeaderDepth > 0 && !initialColumnInfo.isColumnGroup) {
237
+ return false;
238
+ }
239
+ if (initialColumnInfo.range[0] == null) {
240
+ return false;
241
+ }
242
+ draggingColumn = {
243
+ range: initialColumnInfo.range,
244
+ depth: columnHeaderDepth,
245
+ left: initialColumnInfo.left,
246
+ width: initialColumnInfo.width
247
+ };
248
+ var startColumn = getColumnInfo(draggingColumn.range[0], 0, metrics, model);
249
+ var endColumn = getColumnInfo(draggingColumn.range[1], 0, metrics, model);
250
+
251
+ // Group goes off the table. Drag and drop could be wonky here
252
+ // Column draws only use columns that are partially visible too
253
+ // So this could cause rendering errors if we tried dragging it
254
+ if (!startColumn || !endColumn) {
255
+ return false;
256
+ }
257
+ this.draggingColumn = draggingColumn;
258
+ grid.setState({
259
+ draggingColumn,
260
+ isDragging: true
261
+ });
262
+ }
263
+
264
+ /**
265
+ * At this point, we have determined we are actually dragging a column
266
+ */
267
+ this.cursor = 'move';
268
+ this.moveDraggingColumn(gridPoint.x, grid, event.movementX);
269
+ return true;
270
+ }
271
+
272
+ /**
273
+ * Moves a dragging column, if possible, the specified distance
274
+ * @param mouseX The point the move was initiated from
275
+ * @param grid The Grid component
276
+ * @param deltaX The distance of the move
277
+ */
278
+ moveDraggingColumn(mouseX, grid, deltaX) {
279
+ var _draggingParentGroup$;
280
+ if (this.draggingOffset === undefined || this.initialGridPoint === undefined || this.initialOffset === undefined || this.draggingColumn == null || deltaX === 0) {
281
+ return;
282
+ }
283
+
284
+ // Cursor has moved past the column drag bounds, don't move the column until we hit the initial offset point again
285
+ if (this.initialOffset !== this.draggingOffset) {
286
+ // Pre move < Initial < Post move or vice-versa
287
+ // User crossed back past the iniital offset point, so we can start moving again
288
+ if (this.draggingOffset < this.initialOffset && this.initialOffset < this.draggingOffset + deltaX || this.draggingOffset > this.initialOffset && this.initialOffset > this.draggingOffset + deltaX) {
289
+ this.draggingOffset = this.initialOffset;
290
+ } else {
291
+ // Column can't move since we aren't back at the initial offset yet
292
+ this.draggingOffset += deltaX;
293
+ }
294
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
295
+ left: mouseX - this.draggingOffset
296
+ });
297
+ grid.setState({
298
+ draggingColumn: this.draggingColumn
299
+ });
300
+ return;
301
+ }
302
+ var {
303
+ depth: draggingColumnDepth
304
+ } = this.draggingColumn;
305
+ var {
306
+ model
307
+ } = grid.props;
308
+ var {
309
+ movedColumns
310
+ } = grid.state;
311
+ var {
312
+ metrics
313
+ } = grid;
314
+ if (!metrics) throw new Error('Metrics not set');
315
+ var {
316
+ floatingLeftWidth,
317
+ width,
318
+ columnHeaderMaxDepth,
319
+ allColumnXs
320
+ } = metrics;
321
+ var isDraggingLeft = deltaX < 0;
322
+ var draggingColumn = getColumnInfo(this.draggingColumn.range[0], draggingColumnDepth, metrics, model);
323
+ if (!draggingColumn) {
324
+ return;
325
+ }
326
+
327
+ // The returned left/right are the original position, not dragged position
328
+ // This is where the dragging column's floating position accounting for dragged distance
329
+ var floatingDraggingLeft = mouseX - this.draggingOffset;
330
+ var floatingDraggingRight = floatingDraggingLeft + draggingColumn.width;
331
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
332
+ left: floatingDraggingLeft
333
+ });
334
+ grid.setState({
335
+ draggingColumn: this.draggingColumn
336
+ });
337
+ var swapColumn = getColumnInfo(GridUtils.getColumnAtX(clamp(isDraggingLeft ? floatingDraggingLeft : floatingDraggingRight, floatingLeftWidth, width), metrics, true), draggingColumnDepth, metrics, model);
338
+ var parentGroup = model.getColumnHeaderParentGroup(draggingColumn.modelIndex, draggingColumn.depth);
339
+ if (!swapColumn) {
340
+ return;
341
+ }
342
+
343
+ // Check if we should pin to the edge of the parent
344
+ if (parentGroup !== undefined) {
345
+ var parentVisibleRange = parentGroup.getVisibleRange(movedColumns);
346
+ // Cannot move to this left position, pin to left of parent
347
+ if (swapColumn.visibleIndex < parentVisibleRange[0]) {
348
+ var _allColumnXs$get3;
349
+ var _newMovedColumns = this.moveColumn(draggingColumn, parentVisibleRange[0], movedColumns);
350
+ this.draggingOffset = mouseX - ((_allColumnXs$get3 = allColumnXs.get(parentVisibleRange[0])) !== null && _allColumnXs$get3 !== void 0 ? _allColumnXs$get3 : 0);
351
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
352
+ left: mouseX - this.draggingOffset
353
+ });
354
+ this.clearScrollInterval();
355
+ grid.setState({
356
+ draggingColumn: this.draggingColumn,
357
+ movedColumns: _newMovedColumns
358
+ });
359
+ return;
360
+ }
361
+
362
+ // Pin to the right of parent
363
+ if (swapColumn.visibleIndex > parentVisibleRange[1]) {
364
+ var _getColumnInfo;
365
+ var _newMovedColumns2 = this.moveColumn(draggingColumn, parentVisibleRange[1] - (draggingColumn.range[1] - draggingColumn.range[0]), movedColumns);
366
+ var {
367
+ right: parentRight = 0
368
+ } = (_getColumnInfo = getColumnInfo(parentVisibleRange[1], 0, metrics, model)) !== null && _getColumnInfo !== void 0 ? _getColumnInfo : {};
369
+ this.draggingOffset = mouseX - (parentRight - draggingColumn.width);
370
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
371
+ left: mouseX - this.draggingOffset
372
+ });
373
+ this.clearScrollInterval();
374
+ grid.setState({
375
+ draggingColumn: this.draggingColumn,
376
+ movedColumns: _newMovedColumns2
377
+ });
378
+ return;
379
+ }
380
+ }
381
+
382
+ // Hit an unmovable column, move to the first available position next to it
383
+ if (!model.isColumnMovable(swapColumn.modelIndex)) {
384
+ var toVisibleIndex = swapColumn.visibleIndex;
385
+ if (isDraggingLeft) {
386
+ toVisibleIndex += 1;
387
+ while (toVisibleIndex < draggingColumn.visibleIndex && !model.isColumnMovable(GridUtils.getModelIndex(toVisibleIndex, movedColumns))) {
388
+ toVisibleIndex += 1;
389
+ }
390
+ } else {
391
+ toVisibleIndex -= 1;
392
+ while (toVisibleIndex > draggingColumn.visibleIndex && !model.isColumnMovable(GridUtils.getModelIndex(toVisibleIndex, movedColumns))) {
393
+ toVisibleIndex -= 1;
394
+ }
395
+ }
396
+ if (toVisibleIndex !== draggingColumn.visibleIndex) {
397
+ if (!isDraggingLeft) {
398
+ // Offset for range if dragging right
399
+ toVisibleIndex -= draggingColumn.range[1] - draggingColumn.range[0];
400
+ }
401
+ var _newMovedColumns3 = this.moveColumn(draggingColumn, toVisibleIndex, movedColumns);
402
+ grid.setState({
403
+ movedColumns: _newMovedColumns3,
404
+ draggingColumn: this.draggingColumn
405
+ });
406
+ }
407
+ var toColumnInfo = getColumnInfo(toVisibleIndex, 0, metrics, model);
408
+ if (isDraggingLeft) {
409
+ var _toColumnInfo$left;
410
+ this.draggingOffset = mouseX - ((_toColumnInfo$left = toColumnInfo === null || toColumnInfo === void 0 ? void 0 : toColumnInfo.left) !== null && _toColumnInfo$left !== void 0 ? _toColumnInfo$left : 0);
411
+ } else {
412
+ var _toColumnInfo$right;
413
+ this.draggingOffset = mouseX - (((_toColumnInfo$right = toColumnInfo === null || toColumnInfo === void 0 ? void 0 : toColumnInfo.right) !== null && _toColumnInfo$right !== void 0 ? _toColumnInfo$right : 0) - draggingColumn.width);
414
+ }
415
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
416
+ left: mouseX - this.draggingOffset
417
+ });
418
+ grid.setState({
419
+ draggingColumn: this.draggingColumn
420
+ });
421
+ return;
422
+ }
423
+ if (floatingDraggingLeft <= floatingLeftWidth) {
424
+ this.setScrollInterval(grid, 'left');
425
+ } else if (floatingDraggingRight > width) {
426
+ this.setScrollInterval(grid, 'right');
427
+ } else {
428
+ this.clearScrollInterval();
429
+ }
430
+
431
+ // Can't swap a column with itself
432
+ if (swapColumn.visibleIndex === draggingColumn.visibleIndex) {
433
+ return;
434
+ }
435
+
436
+ // Can't swap a column to the left when dragging right or vice versa
437
+ if (isDraggingLeft && draggingColumn.visibleIndex < swapColumn.visibleIndex || !isDraggingLeft && draggingColumn.visibleIndex > swapColumn.visibleIndex) {
438
+ return;
439
+ }
440
+ var switchPoint = swapColumn.left + swapColumn.width * 0.5;
441
+ var draggingParentGroup = model.getColumnHeaderParentGroup(draggingColumn.modelIndex, draggingColumn.depth);
442
+
443
+ // Get the highest level group that is not the common base group
444
+ // This group is what we need to drag past
445
+ var maxDepthSwapGroup;
446
+ var maxSwapDepth = ((_draggingParentGroup$ = draggingParentGroup === null || draggingParentGroup === void 0 ? void 0 : draggingParentGroup.depth) !== null && _draggingParentGroup$ !== void 0 ? _draggingParentGroup$ : columnHeaderMaxDepth) - 1;
447
+ while (maxSwapDepth >= 0 && maxDepthSwapGroup === undefined) {
448
+ maxDepthSwapGroup = model.getColumnHeaderGroup(swapColumn.modelIndex, maxSwapDepth);
449
+ maxSwapDepth -= 1;
450
+ }
451
+ var newMovedColumns;
452
+ if (isDraggingLeft && floatingDraggingLeft < switchPoint && (!maxDepthSwapGroup || swapColumn.visibleIndex === maxDepthSwapGroup.getVisibleRange(movedColumns)[0])) {
453
+ newMovedColumns = this.moveColumn(draggingColumn, swapColumn.range[0], movedColumns);
454
+ }
455
+ if (!isDraggingLeft && floatingDraggingRight > switchPoint && (!maxDepthSwapGroup || swapColumn.visibleIndex === maxDepthSwapGroup.getVisibleRange(movedColumns)[1])) {
456
+ newMovedColumns = this.moveColumn(draggingColumn, swapColumn.range[1] - (draggingColumn.range[1] - draggingColumn.range[0]), movedColumns);
457
+ }
458
+ if (!newMovedColumns) {
459
+ return;
460
+ }
461
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
462
+ left: floatingDraggingLeft
463
+ });
464
+ grid.setState({
465
+ movedColumns: newMovedColumns,
466
+ draggingColumn: this.draggingColumn
467
+ });
468
+ }
469
+
470
+ /**
471
+ * Applies the column move and updates draggingColumn in the mouse handler
472
+ * Does not check if the move is valid
473
+ * @param draggingColumn The dragging column info
474
+ * @param to The index to move the column or range to
475
+ * @param movedColumns The array of column moves
476
+ * @returns A new array of column moves
477
+ */
478
+ moveColumn(draggingColumn, to, movedColumns) {
479
+ var newMovedColumns = draggingColumn.isColumnGroup ? GridUtils.moveRange(draggingColumn.range, to, movedColumns) : GridUtils.moveItem(draggingColumn.visibleIndex, to, movedColumns);
480
+ var moveDistance = to - draggingColumn.range[0];
481
+ var newDraggingRange = [draggingColumn.range[0] + moveDistance, draggingColumn.range[1] + moveDistance];
482
+ if (this.draggingColumn) {
483
+ this.draggingColumn = _objectSpread(_objectSpread({}, this.draggingColumn), {}, {
484
+ range: newDraggingRange
485
+ });
486
+ }
487
+ return newMovedColumns;
488
+ }
489
+ onUp(gridPoint, grid) {
490
+ this.cursor = null;
491
+ this.clearScrollInterval();
492
+ if (this.draggingOffset != null) {
493
+ this.draggingOffset = undefined;
494
+ grid.setState({
495
+ draggingColumn: null,
496
+ isDragging: false
497
+ });
498
+ return true;
499
+ }
500
+ return false;
501
+ }
502
+ }
503
+ export default GridColumnMoveMouseHandler;
504
+ //# sourceMappingURL=GridColumnMoveMouseHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridColumnMoveMouseHandler.js","names":["clamp","GridUtils","GridMouseHandler","SLOPPY_CLICK_DISTANCE","SCROLL_INTERVAL","SCROLL_DELTA","getColumnInfo","visibleIndex","depth","metrics","model","modelColumns","movedColumns","allColumnXs","columnCount","allColumnWidths","userColumnWidths","calculatedColumnWidths","floatingLeftWidth","maxX","modelIndex","get","getModelIndex","group","getColumnHeaderGroup","isColumnGroup","left","right","range","startVisibleIndex","endVisibleIndex","getVisibleRange","possibleLeft","width","GridColumnMoveMouseHandler","setScrollInterval","grid","direction","scrollingInterval","scrollingDirection","window","setInterval","lastLeft","leftOffset","nextLeft","nextOffset","prevColumnWidth","undefined","leftColumnWidth","mouseX","mouseY","state","moveDraggingColumn","setState","clearScrollInterval","clearInterval","onLeave","onDown","gridPoint","props","x","column","columnHeaderDepth","Error","columnInfo","rowHeaderWidth","initialGridPoint","draggingColumn","cursor","isColumnMovable","draggingOffset","initialOffset","onDrag","event","y","Math","abs","initialColumnInfo","startColumn","endColumn","isDragging","movementX","deltaX","draggingColumnDepth","columnHeaderMaxDepth","isDraggingLeft","floatingDraggingLeft","floatingDraggingRight","swapColumn","getColumnAtX","parentGroup","getColumnHeaderParentGroup","parentVisibleRange","newMovedColumns","moveColumn","parentRight","toVisibleIndex","toColumnInfo","switchPoint","draggingParentGroup","maxDepthSwapGroup","maxSwapDepth","to","moveRange","moveItem","moveDistance","newDraggingRange","onUp"],"sources":["../../src/mouse-handlers/GridColumnMoveMouseHandler.ts"],"sourcesContent":["import clamp from 'lodash.clamp';\nimport Grid from '../Grid';\nimport GridUtils, { GridPoint } from '../GridUtils';\nimport GridMouseHandler, { GridMouseEvent } from '../GridMouseHandler';\nimport { EventHandlerResult } from '../EventHandlerResult';\nimport type {\n VisibleIndex,\n ModelIndex,\n GridMetrics,\n MoveOperation,\n Coordinate,\n} from '../GridMetrics';\nimport type { BoundedAxisRange } from '../GridAxisRange';\nimport type GridModel from '../GridModel';\nimport type { IColumnHeaderGroup } from '../ColumnHeaderGroup';\n\nconst SLOPPY_CLICK_DISTANCE = 5;\nconst SCROLL_INTERVAL = 1000 / 60;\nconst SCROLL_DELTA = 10;\n\nexport interface DraggingColumn {\n range: BoundedAxisRange;\n depth: number;\n left: Coordinate;\n width: number;\n}\n\ninterface ColumnInfo {\n visibleIndex: VisibleIndex;\n modelIndex: ModelIndex;\n left: number;\n right: number;\n width: number;\n isColumnGroup: boolean;\n range: BoundedAxisRange;\n depth: number;\n}\n\n/**\n * Gets info about a visible column\n * @param visibleIndex The visible index to get info for\n * @param depth The header depth to get info for\n * @param metrics Grid metrics\n * @param model Grid model\n * @returns The column info at the depth.\n * If the column is not in a group at that depth, returns the info for the base column.\n * Returns null if the column is not visible.\n */\nfunction getColumnInfo(\n visibleIndex: VisibleIndex | null,\n depth: number | undefined,\n metrics: GridMetrics,\n model: GridModel\n): ColumnInfo | null {\n const {\n modelColumns,\n movedColumns,\n allColumnXs,\n columnCount,\n allColumnWidths,\n userColumnWidths,\n calculatedColumnWidths,\n floatingLeftWidth,\n maxX,\n } = metrics;\n\n if (\n depth == null ||\n visibleIndex == null ||\n visibleIndex > columnCount ||\n visibleIndex < 0\n ) {\n return null;\n }\n\n const modelIndex =\n modelColumns.get(visibleIndex) ??\n GridUtils.getModelIndex(visibleIndex, movedColumns);\n\n const group = model.getColumnHeaderGroup(modelIndex, depth);\n const isColumnGroup = group != null;\n\n let left: number;\n let right: number;\n let range: BoundedAxisRange;\n\n if (group != null) {\n const [startVisibleIndex, endVisibleIndex] = group.getVisibleRange(\n movedColumns\n );\n\n left = allColumnXs.get(startVisibleIndex) ?? floatingLeftWidth;\n right =\n (allColumnXs.get(endVisibleIndex) ?? maxX) +\n (allColumnWidths.get(endVisibleIndex) ?? 0);\n range = [startVisibleIndex, endVisibleIndex];\n } else {\n const possibleLeft = allColumnXs.get(visibleIndex);\n if (possibleLeft == null) {\n return null;\n }\n\n left = possibleLeft;\n right =\n left +\n (allColumnWidths.get(visibleIndex) ??\n userColumnWidths.get(modelIndex) ??\n calculatedColumnWidths.get(modelIndex) ??\n 0);\n range = [visibleIndex, visibleIndex];\n }\n\n return {\n visibleIndex,\n modelIndex,\n left,\n right,\n width: right - left,\n isColumnGroup,\n range,\n depth,\n };\n}\n\nclass GridColumnMoveMouseHandler extends GridMouseHandler {\n cursor: string | null = null;\n\n private draggingOffset?: number;\n\n private initialOffset?: number;\n\n private initialGridPoint?: GridPoint;\n\n private scrollingInterval?: number;\n\n private scrollingDirection?: 'left' | 'right';\n\n private draggingColumn: DraggingColumn | null = null;\n\n private setScrollInterval(grid: Grid, direction: 'left' | 'right'): void {\n if (\n this.scrollingInterval != null &&\n direction === this.scrollingDirection\n ) {\n return;\n }\n\n this.scrollingDirection = direction;\n this.scrollingInterval = window.setInterval(() => {\n const { metrics } = grid;\n if (!metrics) {\n return;\n }\n\n const {\n left,\n lastLeft,\n leftOffset,\n userColumnWidths,\n calculatedColumnWidths,\n movedColumns,\n allColumnWidths,\n } = metrics;\n\n let nextLeft = left;\n let nextOffset = leftOffset;\n if (direction === 'left') {\n nextOffset -= SCROLL_DELTA;\n while (nextOffset < 0) {\n nextLeft -= 1;\n const modelIndex = GridUtils.getModelIndex(left - 1, movedColumns);\n const prevColumnWidth =\n userColumnWidths.get(modelIndex) ??\n calculatedColumnWidths.get(modelIndex);\n if (prevColumnWidth === undefined) {\n nextOffset = 0;\n } else {\n nextOffset += prevColumnWidth;\n }\n if (nextLeft < 0) {\n nextOffset = 0;\n nextLeft = 0;\n }\n }\n } else {\n nextOffset += SCROLL_DELTA;\n let leftColumnWidth = allColumnWidths.get(left);\n while (leftColumnWidth !== undefined && nextOffset > leftColumnWidth) {\n nextLeft += 1;\n nextOffset -= leftColumnWidth;\n const modelIndex = GridUtils.getModelIndex(left + 1, movedColumns);\n leftColumnWidth =\n userColumnWidths.get(modelIndex) ??\n calculatedColumnWidths.get(modelIndex);\n\n if (nextLeft > lastLeft) {\n nextOffset = 0;\n nextLeft = lastLeft;\n }\n }\n }\n\n const { mouseX, mouseY } = grid.state;\n\n if (metrics == null || mouseX == null || mouseY == null) {\n return;\n }\n\n this.moveDraggingColumn(\n mouseX,\n grid,\n direction === 'left' ? -SCROLL_DELTA : SCROLL_DELTA\n );\n grid.setState({ left: nextLeft, leftOffset: nextOffset });\n\n if (\n (direction === 'left' && nextLeft === 0 && leftOffset === 0) ||\n (direction === 'right' && nextLeft === lastLeft)\n ) {\n this.clearScrollInterval();\n }\n }, SCROLL_INTERVAL);\n }\n\n private clearScrollInterval(): void {\n this.scrollingDirection = undefined;\n window.clearInterval(this.scrollingInterval);\n this.scrollingInterval = undefined;\n }\n\n onLeave(): EventHandlerResult {\n this.clearScrollInterval();\n return false;\n }\n\n onDown(gridPoint: GridPoint, grid: Grid): EventHandlerResult {\n const { model } = grid.props;\n const { x, column, columnHeaderDepth } = gridPoint;\n const { metrics } = grid;\n if (!metrics) throw new Error('Metrics not set');\n\n const columnInfo = getColumnInfo(column, columnHeaderDepth, metrics, model);\n\n if (column == null || columnInfo == null || columnHeaderDepth == null) {\n return false;\n }\n\n // Can't drag a base column from the empty group area\n if (columnHeaderDepth > 0 && !columnInfo.isColumnGroup) {\n return false;\n }\n\n const { rowHeaderWidth } = metrics;\n\n this.initialGridPoint = gridPoint;\n this.draggingColumn = null;\n this.cursor = null;\n\n if (\n columnInfo.modelIndex != null &&\n columnHeaderDepth != null &&\n model.isColumnMovable(columnInfo.modelIndex, columnHeaderDepth)\n ) {\n this.draggingOffset = x - columnInfo.left - rowHeaderWidth;\n this.initialOffset = this.draggingOffset;\n }\n return false;\n }\n\n onDrag(\n gridPoint: GridPoint,\n grid: Grid,\n event: GridMouseEvent\n ): EventHandlerResult {\n if (\n this.draggingOffset === undefined ||\n this.initialGridPoint === undefined ||\n this.initialOffset === undefined\n ) {\n return false;\n }\n\n const { x: mouseX, y: mouseY } = gridPoint;\n const { columnHeaderDepth } = this.initialGridPoint;\n\n const { model } = grid.props;\n let { draggingColumn } = this;\n const { metrics } = grid;\n\n if (!metrics) throw new Error('Metrics not set');\n\n // before considering it a drag, the mouse must have moved a minimum distance\n // this prevents click actions from triggering a drag state\n if (\n !draggingColumn &&\n Math.abs(this.initialGridPoint.x - mouseX) < SLOPPY_CLICK_DISTANCE &&\n Math.abs(this.initialGridPoint.y - mouseY) < SLOPPY_CLICK_DISTANCE\n ) {\n return false;\n }\n\n // Get the initial dragging column info\n if (draggingColumn == null) {\n const initialColumnInfo = getColumnInfo(\n this.initialGridPoint.column,\n columnHeaderDepth,\n metrics,\n model\n );\n\n if (!initialColumnInfo || columnHeaderDepth == null) {\n return false;\n }\n\n if (!model.isColumnMovable(initialColumnInfo.modelIndex)) {\n return false;\n }\n\n // Disallow dragging from the blank space in column header groups\n if (columnHeaderDepth > 0 && !initialColumnInfo.isColumnGroup) {\n return false;\n }\n\n if (initialColumnInfo.range[0] == null) {\n return false;\n }\n\n draggingColumn = {\n range: initialColumnInfo.range,\n depth: columnHeaderDepth,\n left: initialColumnInfo.left,\n width: initialColumnInfo.width,\n };\n\n const startColumn = getColumnInfo(\n draggingColumn.range[0],\n 0,\n metrics,\n model\n );\n const endColumn = getColumnInfo(\n draggingColumn.range[1],\n 0,\n metrics,\n model\n );\n\n // Group goes off the table. Drag and drop could be wonky here\n // Column draws only use columns that are partially visible too\n // So this could cause rendering errors if we tried dragging it\n if (!startColumn || !endColumn) {\n return false;\n }\n\n this.draggingColumn = draggingColumn;\n grid.setState({ draggingColumn, isDragging: true });\n }\n\n /**\n * At this point, we have determined we are actually dragging a column\n */\n this.cursor = 'move';\n\n this.moveDraggingColumn(gridPoint.x, grid, event.movementX);\n\n return true;\n }\n\n /**\n * Moves a dragging column, if possible, the specified distance\n * @param mouseX The point the move was initiated from\n * @param grid The Grid component\n * @param deltaX The distance of the move\n */\n moveDraggingColumn(mouseX: number, grid: Grid, deltaX: number): void {\n if (\n this.draggingOffset === undefined ||\n this.initialGridPoint === undefined ||\n this.initialOffset === undefined ||\n this.draggingColumn == null ||\n deltaX === 0\n ) {\n return;\n }\n\n // Cursor has moved past the column drag bounds, don't move the column until we hit the initial offset point again\n if (this.initialOffset !== this.draggingOffset) {\n // Pre move < Initial < Post move or vice-versa\n // User crossed back past the iniital offset point, so we can start moving again\n if (\n (this.draggingOffset < this.initialOffset &&\n this.initialOffset < this.draggingOffset + deltaX) ||\n (this.draggingOffset > this.initialOffset &&\n this.initialOffset > this.draggingOffset + deltaX)\n ) {\n this.draggingOffset = this.initialOffset;\n } else {\n // Column can't move since we aren't back at the initial offset yet\n this.draggingOffset += deltaX;\n }\n\n this.draggingColumn = {\n ...this.draggingColumn,\n left: mouseX - this.draggingOffset,\n };\n grid.setState({ draggingColumn: this.draggingColumn });\n return;\n }\n\n const { depth: draggingColumnDepth } = this.draggingColumn;\n\n const { model } = grid.props;\n const { movedColumns } = grid.state;\n const { metrics } = grid;\n if (!metrics) throw new Error('Metrics not set');\n\n const {\n floatingLeftWidth,\n width,\n columnHeaderMaxDepth,\n allColumnXs,\n } = metrics;\n\n const isDraggingLeft = deltaX < 0;\n\n const draggingColumn = getColumnInfo(\n this.draggingColumn.range[0],\n draggingColumnDepth,\n metrics,\n model\n );\n\n if (!draggingColumn) {\n return;\n }\n\n // The returned left/right are the original position, not dragged position\n // This is where the dragging column's floating position accounting for dragged distance\n const floatingDraggingLeft = mouseX - this.draggingOffset;\n const floatingDraggingRight = floatingDraggingLeft + draggingColumn.width;\n\n this.draggingColumn = {\n ...this.draggingColumn,\n left: floatingDraggingLeft,\n };\n grid.setState({\n draggingColumn: this.draggingColumn,\n });\n\n const swapColumn = getColumnInfo(\n GridUtils.getColumnAtX(\n clamp(\n isDraggingLeft ? floatingDraggingLeft : floatingDraggingRight,\n floatingLeftWidth,\n width\n ),\n metrics,\n true\n ),\n draggingColumnDepth,\n metrics,\n model\n );\n\n const parentGroup = model.getColumnHeaderParentGroup(\n draggingColumn.modelIndex,\n draggingColumn.depth\n );\n\n if (!swapColumn) {\n return;\n }\n\n // Check if we should pin to the edge of the parent\n if (parentGroup !== undefined) {\n const parentVisibleRange = parentGroup.getVisibleRange(movedColumns);\n // Cannot move to this left position, pin to left of parent\n if (swapColumn.visibleIndex < parentVisibleRange[0]) {\n const newMovedColumns = this.moveColumn(\n draggingColumn,\n parentVisibleRange[0],\n movedColumns\n );\n\n this.draggingOffset =\n mouseX - (allColumnXs.get(parentVisibleRange[0]) ?? 0);\n this.draggingColumn = {\n ...this.draggingColumn,\n left: mouseX - this.draggingOffset,\n };\n this.clearScrollInterval();\n grid.setState({\n draggingColumn: this.draggingColumn,\n movedColumns: newMovedColumns,\n });\n return;\n }\n\n // Pin to the right of parent\n if (swapColumn.visibleIndex > parentVisibleRange[1]) {\n const newMovedColumns = this.moveColumn(\n draggingColumn,\n parentVisibleRange[1] -\n (draggingColumn.range[1] - draggingColumn.range[0]),\n movedColumns\n );\n\n const { right: parentRight = 0 } =\n getColumnInfo(parentVisibleRange[1], 0, metrics, model) ?? {};\n\n this.draggingOffset = mouseX - (parentRight - draggingColumn.width);\n this.draggingColumn = {\n ...this.draggingColumn,\n left: mouseX - this.draggingOffset,\n };\n this.clearScrollInterval();\n grid.setState({\n draggingColumn: this.draggingColumn,\n movedColumns: newMovedColumns,\n });\n return;\n }\n }\n\n // Hit an unmovable column, move to the first available position next to it\n if (!model.isColumnMovable(swapColumn.modelIndex)) {\n let toVisibleIndex = swapColumn.visibleIndex;\n if (isDraggingLeft) {\n toVisibleIndex += 1;\n while (\n toVisibleIndex < draggingColumn.visibleIndex &&\n !model.isColumnMovable(\n GridUtils.getModelIndex(toVisibleIndex, movedColumns)\n )\n ) {\n toVisibleIndex += 1;\n }\n } else {\n toVisibleIndex -= 1;\n while (\n toVisibleIndex > draggingColumn.visibleIndex &&\n !model.isColumnMovable(\n GridUtils.getModelIndex(toVisibleIndex, movedColumns)\n )\n ) {\n toVisibleIndex -= 1;\n }\n }\n\n if (toVisibleIndex !== draggingColumn.visibleIndex) {\n if (!isDraggingLeft) {\n // Offset for range if dragging right\n toVisibleIndex -= draggingColumn.range[1] - draggingColumn.range[0];\n }\n\n const newMovedColumns = this.moveColumn(\n draggingColumn,\n toVisibleIndex,\n movedColumns\n );\n\n grid.setState({\n movedColumns: newMovedColumns,\n draggingColumn: this.draggingColumn,\n });\n }\n\n const toColumnInfo = getColumnInfo(toVisibleIndex, 0, metrics, model);\n if (isDraggingLeft) {\n this.draggingOffset = mouseX - (toColumnInfo?.left ?? 0);\n } else {\n this.draggingOffset =\n mouseX - ((toColumnInfo?.right ?? 0) - draggingColumn.width);\n }\n\n this.draggingColumn = {\n ...this.draggingColumn,\n left: mouseX - this.draggingOffset,\n };\n\n grid.setState({\n draggingColumn: this.draggingColumn,\n });\n\n return;\n }\n\n if (floatingDraggingLeft <= floatingLeftWidth) {\n this.setScrollInterval(grid, 'left');\n } else if (floatingDraggingRight > width) {\n this.setScrollInterval(grid, 'right');\n } else {\n this.clearScrollInterval();\n }\n\n // Can't swap a column with itself\n if (swapColumn.visibleIndex === draggingColumn.visibleIndex) {\n return;\n }\n\n // Can't swap a column to the left when dragging right or vice versa\n if (\n (isDraggingLeft &&\n draggingColumn.visibleIndex < swapColumn.visibleIndex) ||\n (!isDraggingLeft && draggingColumn.visibleIndex > swapColumn.visibleIndex)\n ) {\n return;\n }\n\n const switchPoint = swapColumn.left + swapColumn.width * 0.5;\n const draggingParentGroup = model.getColumnHeaderParentGroup(\n draggingColumn.modelIndex,\n draggingColumn.depth\n );\n\n // Get the highest level group that is not the common base group\n // This group is what we need to drag past\n let maxDepthSwapGroup: IColumnHeaderGroup | undefined;\n let maxSwapDepth = (draggingParentGroup?.depth ?? columnHeaderMaxDepth) - 1;\n while (maxSwapDepth >= 0 && maxDepthSwapGroup === undefined) {\n maxDepthSwapGroup = model.getColumnHeaderGroup(\n swapColumn.modelIndex,\n maxSwapDepth\n );\n maxSwapDepth -= 1;\n }\n\n let newMovedColumns: readonly MoveOperation[] | undefined;\n\n if (\n isDraggingLeft &&\n floatingDraggingLeft < switchPoint &&\n (!maxDepthSwapGroup ||\n swapColumn.visibleIndex ===\n maxDepthSwapGroup.getVisibleRange(movedColumns)[0])\n ) {\n newMovedColumns = this.moveColumn(\n draggingColumn,\n swapColumn.range[0],\n movedColumns\n );\n }\n\n if (\n !isDraggingLeft &&\n floatingDraggingRight > switchPoint &&\n (!maxDepthSwapGroup ||\n swapColumn.visibleIndex ===\n maxDepthSwapGroup.getVisibleRange(movedColumns)[1])\n ) {\n newMovedColumns = this.moveColumn(\n draggingColumn,\n swapColumn.range[1] -\n (draggingColumn.range[1] - draggingColumn.range[0]),\n movedColumns\n );\n }\n\n if (!newMovedColumns) {\n return;\n }\n\n this.draggingColumn = {\n ...this.draggingColumn,\n left: floatingDraggingLeft,\n };\n\n grid.setState({\n movedColumns: newMovedColumns,\n draggingColumn: this.draggingColumn,\n });\n }\n\n /**\n * Applies the column move and updates draggingColumn in the mouse handler\n * Does not check if the move is valid\n * @param draggingColumn The dragging column info\n * @param to The index to move the column or range to\n * @param movedColumns The array of column moves\n * @returns A new array of column moves\n */\n moveColumn(\n draggingColumn: ColumnInfo,\n to: number,\n movedColumns: readonly MoveOperation[]\n ): MoveOperation[] {\n const newMovedColumns = draggingColumn.isColumnGroup\n ? GridUtils.moveRange(draggingColumn.range, to, movedColumns)\n : GridUtils.moveItem(draggingColumn.visibleIndex, to, movedColumns);\n\n const moveDistance = to - draggingColumn.range[0];\n const newDraggingRange: BoundedAxisRange = [\n draggingColumn.range[0] + moveDistance,\n draggingColumn.range[1] + moveDistance,\n ];\n\n if (this.draggingColumn) {\n this.draggingColumn = {\n ...this.draggingColumn,\n range: newDraggingRange,\n };\n }\n\n return newMovedColumns;\n }\n\n onUp(gridPoint: GridPoint, grid: Grid): EventHandlerResult {\n this.cursor = null;\n\n this.clearScrollInterval();\n\n if (this.draggingOffset != null) {\n this.draggingOffset = undefined;\n grid.setState({\n draggingColumn: null,\n isDragging: false,\n });\n return true;\n }\n\n return false;\n }\n}\n\nexport default GridColumnMoveMouseHandler;\n"],"mappings":"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"}