@deephaven/grid 0.5.2-beta.0 → 0.6.1-demo.10

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 (76) hide show
  1. package/dist/CellInputField.js +40 -88
  2. package/dist/CellInputField.js.map +1 -1
  3. package/dist/Grid.js +1449 -1484
  4. package/dist/Grid.js.map +1 -1
  5. package/dist/GridColorUtils.js +18 -51
  6. package/dist/GridColorUtils.js.map +1 -1
  7. package/dist/GridMetricCalculator.d.ts +8 -1
  8. package/dist/GridMetricCalculator.d.ts.map +1 -1
  9. package/dist/GridMetricCalculator.js +1031 -994
  10. package/dist/GridMetricCalculator.js.map +1 -1
  11. package/dist/GridModel.d.ts +4 -1
  12. package/dist/GridModel.d.ts.map +1 -1
  13. package/dist/GridModel.js +175 -286
  14. package/dist/GridModel.js.map +1 -1
  15. package/dist/GridMouseHandler.js +39 -59
  16. package/dist/GridMouseHandler.js.map +1 -1
  17. package/dist/GridRange.js +572 -630
  18. package/dist/GridRange.js.map +1 -1
  19. package/dist/GridRenderer.js +1650 -1564
  20. package/dist/GridRenderer.js.map +1 -1
  21. package/dist/GridTestUtils.js +15 -29
  22. package/dist/GridTestUtils.js.map +1 -1
  23. package/dist/GridUtils.js +679 -717
  24. package/dist/GridUtils.js.map +1 -1
  25. package/dist/KeyHandler.js +6 -18
  26. package/dist/KeyHandler.js.map +1 -1
  27. package/dist/MockGridModel.js +105 -210
  28. package/dist/MockGridModel.js.map +1 -1
  29. package/dist/MockTreeGridModel.js +113 -183
  30. package/dist/MockTreeGridModel.js.map +1 -1
  31. package/dist/errors/PasteError.js +5 -44
  32. package/dist/errors/PasteError.js.map +1 -1
  33. package/dist/errors/index.js +1 -1
  34. package/dist/errors/index.js.map +1 -1
  35. package/dist/index.js +15 -15
  36. package/dist/index.js.map +1 -1
  37. package/dist/key-handlers/EditKeyHandler.js +42 -75
  38. package/dist/key-handlers/EditKeyHandler.js.map +1 -1
  39. package/dist/key-handlers/PasteKeyHandler.js +42 -78
  40. package/dist/key-handlers/PasteKeyHandler.js.map +1 -1
  41. package/dist/key-handlers/SelectionKeyHandler.d.ts.map +1 -1
  42. package/dist/key-handlers/SelectionKeyHandler.js +239 -229
  43. package/dist/key-handlers/SelectionKeyHandler.js.map +1 -1
  44. package/dist/key-handlers/TreeKeyHandler.js +42 -72
  45. package/dist/key-handlers/TreeKeyHandler.js.map +1 -1
  46. package/dist/key-handlers/index.js +4 -4
  47. package/dist/key-handlers/index.js.map +1 -1
  48. package/dist/memoizeClear.js +1 -1
  49. package/dist/memoizeClear.js.map +1 -1
  50. package/dist/mouse-handlers/EditMouseHandler.js +18 -50
  51. package/dist/mouse-handlers/EditMouseHandler.js.map +1 -1
  52. package/dist/mouse-handlers/GridColumnMoveMouseHandler.d.ts.map +1 -1
  53. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js +141 -163
  54. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js.map +1 -1
  55. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js +47 -86
  56. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js.map +1 -1
  57. package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js +145 -171
  58. package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js.map +1 -1
  59. package/dist/mouse-handlers/GridRowMoveMouseHandler.js +125 -147
  60. package/dist/mouse-handlers/GridRowMoveMouseHandler.js.map +1 -1
  61. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js +47 -86
  62. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js.map +1 -1
  63. package/dist/mouse-handlers/GridRowTreeMouseHandler.js +46 -76
  64. package/dist/mouse-handlers/GridRowTreeMouseHandler.js.map +1 -1
  65. package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js +31 -62
  66. package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js.map +1 -1
  67. package/dist/mouse-handlers/GridSelectionMouseHandler.js +200 -222
  68. package/dist/mouse-handlers/GridSelectionMouseHandler.js.map +1 -1
  69. package/dist/mouse-handlers/GridSeparatorMouseHandler.js +206 -253
  70. package/dist/mouse-handlers/GridSeparatorMouseHandler.js.map +1 -1
  71. package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js +146 -172
  72. package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js.map +1 -1
  73. package/dist/mouse-handlers/index.js +10 -10
  74. package/dist/mouse-handlers/index.js.map +1 -1
  75. package/dist/tsconfig.tsbuildinfo +1 -1
  76. package/package.json +6 -10
@@ -1,277 +1,287 @@
1
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
2
-
3
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
4
-
5
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
6
-
7
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
8
-
9
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
10
-
11
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
12
-
13
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
14
-
15
- function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
16
-
17
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
18
-
19
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
20
-
21
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
22
-
23
1
  /* eslint class-methods-use-this: "off" */
24
2
  import clamp from 'lodash.clamp';
25
- import GridRange from '../GridRange';
26
- import GridUtils from '../GridUtils';
27
- import KeyHandler from '../KeyHandler';
28
-
29
- var SelectionKeyHandler = /*#__PURE__*/function (_KeyHandler) {
30
- _inherits(SelectionKeyHandler, _KeyHandler);
31
-
32
- var _super = _createSuper(SelectionKeyHandler);
3
+ import GridRange from "../GridRange.js";
4
+ import GridUtils from "../GridUtils.js";
5
+ import KeyHandler from "../KeyHandler.js";
6
+
7
+ class SelectionKeyHandler extends KeyHandler {
8
+ onDown(e, grid) {
9
+ switch (e.key) {
10
+ case 'a':
11
+ if (GridUtils.isModifierKeyDown(e)) {
12
+ grid.selectAll();
13
+ return true;
14
+ }
33
15
 
34
- function SelectionKeyHandler() {
35
- _classCallCheck(this, SelectionKeyHandler);
16
+ break;
36
17
 
37
- return _super.apply(this, arguments);
38
- }
18
+ case 'ArrowUp':
19
+ return this.handleArrowMove(0, -1, e, grid);
39
20
 
40
- _createClass(SelectionKeyHandler, [{
41
- key: "onDown",
42
- value: function onDown(e, grid) {
43
- switch (e.key) {
44
- case 'a':
45
- if (GridUtils.isModifierKeyDown(e)) {
46
- grid.selectAll();
47
- return true;
48
- }
21
+ case 'ArrowDown':
22
+ return this.handleArrowMove(0, 1, e, grid);
49
23
 
50
- break;
24
+ case 'ArrowRight':
25
+ return this.handleArrowMove(1, 0, e, grid);
51
26
 
52
- case 'ArrowUp':
53
- return this.handleArrowMove(0, -1, e, grid);
27
+ case 'ArrowLeft':
28
+ return this.handleArrowMove(-1, 0, e, grid);
54
29
 
55
- case 'ArrowDown':
56
- return this.handleArrowMove(0, 1, e, grid);
30
+ case 'k': // h/j/k/l keys are grouped together for quick navigation by power users
57
31
 
58
- case 'ArrowRight':
59
- return this.handleArrowMove(1, 0, e, grid);
32
+ case 'PageUp':
33
+ return this.handlePageUp(e, grid);
60
34
 
61
- case 'ArrowLeft':
62
- return this.handleArrowMove(-1, 0, e, grid);
35
+ case 'j':
36
+ case 'PageDown':
37
+ return this.handlePageDown(e, grid);
63
38
 
64
- case 'k': // h/j/k/l keys are grouped together for quick navigation by power users
39
+ case 'h':
40
+ grid.clearSelectedRanges();
41
+ grid.moveCursorToPosition(0, grid.state.cursorRow);
42
+ return true;
43
+
44
+ case 'l':
45
+ {
46
+ var {
47
+ model
48
+ } = grid.props;
49
+ var {
50
+ columnCount
51
+ } = model;
52
+ grid.clearSelectedRanges();
53
+ grid.moveCursorToPosition(columnCount - 1, grid.state.cursorRow);
54
+ return true;
55
+ }
65
56
 
66
- case 'PageUp':
67
- return this.handlePageUp(e, grid);
57
+ case 'Home':
58
+ if (!e.shiftKey) {
59
+ grid.clearSelectedRanges();
60
+ }
68
61
 
69
- case 'j':
70
- case 'PageDown':
71
- return this.handlePageDown(e, grid);
62
+ grid.moveCursorToPosition(GridUtils.isModifierKeyDown(e) ? grid.state.cursorColumn : 0, GridUtils.isModifierKeyDown(e) ? 0 : grid.state.cursorRow, e.shiftKey, true, true);
63
+ return true;
72
64
 
73
- case 'Home':
74
- case 'h':
75
- grid.clearSelectedRanges();
76
- grid.moveCursorToPosition(0, grid.state.cursorRow);
77
- return true;
65
+ case 'End':
66
+ {
67
+ var {
68
+ model: _model
69
+ } = grid.props;
70
+ var {
71
+ columnCount: _columnCount,
72
+ rowCount
73
+ } = _model;
78
74
 
79
- case 'l':
80
- case 'End':
81
- {
82
- var model = grid.props.model;
83
- var columnCount = model.columnCount;
75
+ if (!e.shiftKey) {
84
76
  grid.clearSelectedRanges();
85
- grid.moveCursorToPosition(columnCount - 1, grid.state.cursorRow);
86
- break;
87
77
  }
88
78
 
89
- case 'Escape':
90
- grid.clearSelectedRanges();
79
+ grid.moveCursorToPosition(GridUtils.isModifierKeyDown(e) ? grid.state.cursorColumn : _columnCount - 1, GridUtils.isModifierKeyDown(e) ? rowCount - 1 : grid.state.cursorRow, e.shiftKey, true, true);
91
80
  return true;
81
+ }
92
82
 
93
- case 'Enter':
94
- if (grid.state.selectedRanges.length > 0) {
95
- grid.moveCursorInDirection(e.shiftKey ? GridRange.SELECTION_DIRECTION.UP : GridRange.SELECTION_DIRECTION.DOWN);
96
- return true;
97
- }
83
+ case 'Escape':
84
+ grid.clearSelectedRanges();
85
+ return true;
98
86
 
99
- break;
87
+ case 'Enter':
88
+ if (grid.state.selectedRanges.length > 0) {
89
+ grid.moveCursorInDirection(e.shiftKey ? GridRange.SELECTION_DIRECTION.UP : GridRange.SELECTION_DIRECTION.DOWN);
90
+ return true;
91
+ }
100
92
 
101
- case 'Tab':
102
- if (grid.state.selectedRanges.length > 0) {
103
- grid.moveCursorInDirection(e.shiftKey ? GridRange.SELECTION_DIRECTION.LEFT : GridRange.SELECTION_DIRECTION.RIGHT);
104
- return true;
105
- }
93
+ break;
106
94
 
107
- break;
95
+ case 'Tab':
96
+ if (grid.state.selectedRanges.length > 0) {
97
+ grid.moveCursorInDirection(e.shiftKey ? GridRange.SELECTION_DIRECTION.LEFT : GridRange.SELECTION_DIRECTION.RIGHT);
98
+ return true;
99
+ }
108
100
 
109
- default:
110
- break;
111
- }
101
+ break;
112
102
 
113
- return false;
103
+ default:
104
+ break;
114
105
  }
115
- }, {
116
- key: "handleArrowMove",
117
- value: function handleArrowMove(deltaColumn, deltaRow, event, grid) {
118
- var isShiftKey = event.shiftKey;
119
- var isModifierKey = GridUtils.isModifierKeyDown(event);
120
-
121
- if (isShiftKey) {
122
- grid.trimSelectedRanges();
123
- } else {
124
- grid.clearSelectedRanges();
125
- }
126
106
 
127
- var _grid$state = grid.state,
128
- cursorRow = _grid$state.cursorRow,
129
- cursorColumn = _grid$state.cursorColumn,
130
- selectionEndColumn = _grid$state.selectionEndColumn,
131
- selectionEndRow = _grid$state.selectionEndRow;
132
- var column = isShiftKey ? selectionEndColumn : cursorColumn;
133
- var row = isShiftKey ? selectionEndRow : cursorRow;
134
-
135
- if (isModifierKey) {
136
- var model = grid.props.model;
137
- var columnCount = model.columnCount,
138
- rowCount = model.rowCount;
139
- var maximizePreviousRange = isModifierKey && isShiftKey;
140
- var moveToColumn = null;
141
- var moveToRow = null;
142
-
143
- if (deltaColumn < 0) {
144
- moveToColumn = 0;
145
- moveToRow = row;
146
- } else if (deltaColumn > 0) {
147
- moveToColumn = columnCount - 1;
148
- moveToRow = row;
149
- } else if (deltaRow < 0) {
150
- moveToColumn = column;
151
- moveToRow = 0;
152
- } else if (deltaRow > 0) {
153
- moveToColumn = column;
154
- moveToRow = rowCount - 1;
155
- }
107
+ return false;
108
+ }
156
109
 
157
- if (moveToColumn != null && moveToRow != null) {
158
- grid.moveCursorToPosition(moveToColumn, moveToRow, isShiftKey, true, maximizePreviousRange);
159
- }
160
- } else {
161
- var theme = grid.props.theme;
162
- var autoSelectRow = theme.autoSelectRow,
163
- autoSelectColumn = theme.autoSelectColumn;
164
-
165
- if (autoSelectRow && deltaColumn !== 0) {
166
- var lastLeft = grid.metrics.lastLeft;
167
- var left = grid.state.left;
168
- left = clamp(left + deltaColumn, 0, lastLeft);
169
- grid.moveCursorToPosition(left, cursorRow, isShiftKey, false);
170
- grid.setViewState({
171
- left: left
172
- });
173
- } else if (autoSelectColumn && deltaRow !== 0) {
174
- var lastTop = grid.metrics.lastTop;
175
- var top = grid.state.top;
176
- top = clamp(top + deltaRow, 0, lastTop);
177
- grid.moveCursorToPosition(top, cursorColumn, isShiftKey, false);
178
- grid.setViewState({
179
- top: top
180
- });
181
- } else {
182
- grid.moveCursor(deltaColumn, deltaRow, isShiftKey);
183
- }
184
- }
110
+ handleArrowMove(deltaColumn, deltaRow, event, grid) {
111
+ var isShiftKey = event.shiftKey;
112
+ var isModifierKey = GridUtils.isModifierKeyDown(event);
185
113
 
186
- return true;
114
+ if (isShiftKey) {
115
+ grid.trimSelectedRanges();
116
+ } else {
117
+ grid.clearSelectedRanges();
187
118
  }
188
- }, {
189
- key: "handlePageUp",
190
- value: function handlePageUp(e, grid) {
191
- var isShiftKey = e.shiftKey;
192
119
 
193
- if (isShiftKey) {
194
- grid.trimSelectedRanges();
195
- } else {
196
- grid.clearSelectedRanges();
120
+ var {
121
+ cursorRow,
122
+ cursorColumn,
123
+ selectionEndColumn,
124
+ selectionEndRow
125
+ } = grid.state;
126
+ var column = isShiftKey ? selectionEndColumn : cursorColumn;
127
+ var row = isShiftKey ? selectionEndRow : cursorRow;
128
+
129
+ if (isModifierKey) {
130
+ var {
131
+ model
132
+ } = grid.props;
133
+ var {
134
+ columnCount,
135
+ rowCount
136
+ } = model;
137
+ var maximizePreviousRange = isModifierKey && isShiftKey;
138
+ var moveToColumn = null;
139
+ var moveToRow = null;
140
+
141
+ if (deltaColumn < 0) {
142
+ moveToColumn = 0;
143
+ moveToRow = row;
144
+ } else if (deltaColumn > 0) {
145
+ moveToColumn = columnCount - 1;
146
+ moveToRow = row;
147
+ } else if (deltaRow < 0) {
148
+ moveToColumn = column;
149
+ moveToRow = 0;
150
+ } else if (deltaRow > 0) {
151
+ moveToColumn = column;
152
+ moveToRow = rowCount - 1;
197
153
  }
198
154
 
199
- var _grid$state2 = grid.state,
200
- cursorColumn = _grid$state2.cursorColumn,
201
- selectionEndRow = _grid$state2.selectionEndRow;
202
- var row = selectionEndRow;
203
- var column = cursorColumn;
204
-
205
- if (row == null) {
206
- return false;
155
+ if (moveToColumn != null && moveToRow != null) {
156
+ grid.moveCursorToPosition(moveToColumn, moveToRow, isShiftKey, true, maximizePreviousRange);
157
+ }
158
+ } else {
159
+ var {
160
+ theme
161
+ } = grid.props;
162
+ var {
163
+ autoSelectRow,
164
+ autoSelectColumn
165
+ } = theme;
166
+
167
+ if (autoSelectRow && deltaColumn !== 0) {
168
+ var {
169
+ lastLeft
170
+ } = grid.metrics;
171
+ var {
172
+ left
173
+ } = grid.state;
174
+ left = clamp(left + deltaColumn, 0, lastLeft);
175
+ grid.moveCursorToPosition(left, cursorRow, isShiftKey, false);
176
+ grid.setViewState({
177
+ left
178
+ });
179
+ } else if (autoSelectColumn && deltaRow !== 0) {
180
+ var {
181
+ lastTop
182
+ } = grid.metrics;
183
+ var {
184
+ top
185
+ } = grid.state;
186
+ top = clamp(top + deltaRow, 0, lastTop);
187
+ grid.moveCursorToPosition(top, cursorColumn, isShiftKey, false);
188
+ grid.setViewState({
189
+ top
190
+ });
191
+ } else {
192
+ grid.moveCursor(deltaColumn, deltaRow, isShiftKey);
207
193
  }
194
+ }
195
+
196
+ return true;
197
+ }
208
198
 
209
- var metricState = grid.getMetricState();
210
- var metricCalculator = grid.metricCalculator;
199
+ handlePageUp(e, grid) {
200
+ var isShiftKey = e.shiftKey;
211
201
 
212
- var _metricCalculator$get = metricCalculator.getMetrics(metricState),
213
- bottomVisible = _metricCalculator$get.bottomVisible,
214
- topVisible = _metricCalculator$get.topVisible,
215
- hasHorizontalBar = _metricCalculator$get.hasHorizontalBar;
202
+ if (isShiftKey) {
203
+ grid.trimSelectedRanges();
204
+ } else {
205
+ grid.clearSelectedRanges();
206
+ }
216
207
 
217
- var selectRangeEndPosition = row - (bottomVisible - topVisible);
218
- selectRangeEndPosition -= hasHorizontalBar ? 0 : 1; // Don't move beyond the top table row.
208
+ var {
209
+ cursorColumn,
210
+ selectionEndRow
211
+ } = grid.state;
212
+ var row = selectionEndRow;
213
+ var column = cursorColumn;
219
214
 
220
- selectRangeEndPosition = Math.max(selectRangeEndPosition, 0);
221
- var viewportPosition = Math.max(selectRangeEndPosition - (row - topVisible), 0);
222
- grid.moveCursorToPosition(column, selectRangeEndPosition, isShiftKey, false);
223
- grid.setViewState({
224
- top: viewportPosition
225
- });
226
- return true;
215
+ if (row == null) {
216
+ return false;
227
217
  }
228
- }, {
229
- key: "handlePageDown",
230
- value: function handlePageDown(e, grid) {
231
- var isShiftKey = e.shiftKey;
232
218
 
233
- if (isShiftKey) {
234
- grid.trimSelectedRanges();
235
- } else {
236
- grid.clearSelectedRanges();
237
- }
219
+ var metricState = grid.getMetricState();
220
+ var {
221
+ metricCalculator
222
+ } = grid;
223
+ var {
224
+ bottomVisible,
225
+ topVisible,
226
+ hasHorizontalBar
227
+ } = metricCalculator.getMetrics(metricState);
228
+ var selectRangeEndPosition = row - (bottomVisible - topVisible);
229
+ selectRangeEndPosition -= hasHorizontalBar ? 0 : 1; // Don't move beyond the top table row.
230
+
231
+ selectRangeEndPosition = Math.max(selectRangeEndPosition, 0);
232
+ var viewportPosition = Math.max(selectRangeEndPosition - (row - topVisible), 0);
233
+ grid.moveCursorToPosition(column, selectRangeEndPosition, isShiftKey, false);
234
+ grid.setViewState({
235
+ top: viewportPosition
236
+ });
237
+ return true;
238
+ }
238
239
 
239
- var _grid$state3 = grid.state,
240
- selectionEndRow = _grid$state3.selectionEndRow,
241
- cursorColumn = _grid$state3.cursorColumn;
242
- var row = selectionEndRow;
243
- var column = cursorColumn;
240
+ handlePageDown(e, grid) {
241
+ var isShiftKey = e.shiftKey;
244
242
 
245
- if (row === null) {
246
- return false;
247
- }
243
+ if (isShiftKey) {
244
+ grid.trimSelectedRanges();
245
+ } else {
246
+ grid.clearSelectedRanges();
247
+ }
248
248
 
249
- var metricState = grid.getMetricState();
250
- var metricCalculator = grid.metricCalculator;
251
-
252
- var _metricCalculator$get2 = metricCalculator.getMetrics(metricState),
253
- bottomVisible = _metricCalculator$get2.bottomVisible,
254
- topVisible = _metricCalculator$get2.topVisible,
255
- hasHorizontalBar = _metricCalculator$get2.hasHorizontalBar,
256
- rowCount = _metricCalculator$get2.rowCount,
257
- lastTop = _metricCalculator$get2.lastTop;
258
-
259
- var lastRowIndex = rowCount - 1;
260
- var selectRangeEndPosition = bottomVisible - topVisible + row;
261
- selectRangeEndPosition += hasHorizontalBar ? 0 : 1; // Don't move beyond the bottom table row.
262
-
263
- selectRangeEndPosition = Math.min(selectRangeEndPosition, lastRowIndex);
264
- var viewportPosition = Math.min(lastTop, selectRangeEndPosition - (row - topVisible));
265
- grid.moveCursorToPosition(column, selectRangeEndPosition, isShiftKey, false);
266
- grid.setViewState({
267
- top: viewportPosition
268
- });
269
- return true;
249
+ var {
250
+ selectionEndRow,
251
+ cursorColumn
252
+ } = grid.state;
253
+ var row = selectionEndRow;
254
+ var column = cursorColumn;
255
+
256
+ if (row === null) {
257
+ return false;
270
258
  }
271
- }]);
272
259
 
273
- return SelectionKeyHandler;
274
- }(KeyHandler);
260
+ var metricState = grid.getMetricState();
261
+ var {
262
+ metricCalculator
263
+ } = grid;
264
+ var {
265
+ bottomVisible,
266
+ topVisible,
267
+ hasHorizontalBar,
268
+ rowCount,
269
+ lastTop
270
+ } = metricCalculator.getMetrics(metricState);
271
+ var lastRowIndex = rowCount - 1;
272
+ var selectRangeEndPosition = bottomVisible - topVisible + row;
273
+ selectRangeEndPosition += hasHorizontalBar ? 0 : 1; // Don't move beyond the bottom table row.
274
+
275
+ selectRangeEndPosition = Math.min(selectRangeEndPosition, lastRowIndex);
276
+ var viewportPosition = Math.min(lastTop, selectRangeEndPosition - (row - topVisible));
277
+ grid.moveCursorToPosition(column, selectRangeEndPosition, isShiftKey, false);
278
+ grid.setViewState({
279
+ top: viewportPosition
280
+ });
281
+ return true;
282
+ }
283
+
284
+ }
275
285
 
276
286
  export default SelectionKeyHandler;
277
287
  //# sourceMappingURL=SelectionKeyHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/key-handlers/SelectionKeyHandler.ts"],"names":["clamp","GridRange","GridUtils","KeyHandler","SelectionKeyHandler","e","grid","key","isModifierKeyDown","selectAll","handleArrowMove","handlePageUp","handlePageDown","clearSelectedRanges","moveCursorToPosition","state","cursorRow","model","props","columnCount","selectedRanges","length","moveCursorInDirection","shiftKey","SELECTION_DIRECTION","UP","DOWN","LEFT","RIGHT","deltaColumn","deltaRow","event","isShiftKey","isModifierKey","trimSelectedRanges","cursorColumn","selectionEndColumn","selectionEndRow","column","row","rowCount","maximizePreviousRange","moveToColumn","moveToRow","theme","autoSelectRow","autoSelectColumn","lastLeft","metrics","left","setViewState","lastTop","top","moveCursor","metricState","getMetricState","metricCalculator","getMetrics","bottomVisible","topVisible","hasHorizontalBar","selectRangeEndPosition","Math","max","viewportPosition","lastRowIndex","min"],"mappings":"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","sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport clamp from 'lodash.clamp';\nimport Grid from '../Grid';\nimport GridRange from '../GridRange';\nimport GridUtils from '../GridUtils';\nimport KeyHandler from '../KeyHandler';\n\nclass SelectionKeyHandler extends KeyHandler {\n onDown(e: KeyboardEvent, grid: Grid): boolean {\n switch (e.key) {\n case 'a':\n if (GridUtils.isModifierKeyDown(e)) {\n grid.selectAll();\n return true;\n }\n break;\n case 'ArrowUp':\n return this.handleArrowMove(0, -1, e, grid);\n case 'ArrowDown':\n return this.handleArrowMove(0, 1, e, grid);\n case 'ArrowRight':\n return this.handleArrowMove(1, 0, e, grid);\n case 'ArrowLeft':\n return this.handleArrowMove(-1, 0, e, grid);\n case 'k': // h/j/k/l keys are grouped together for quick navigation by power users\n case 'PageUp':\n return this.handlePageUp(e, grid);\n case 'j':\n case 'PageDown':\n return this.handlePageDown(e, grid);\n case 'Home':\n case 'h':\n grid.clearSelectedRanges();\n grid.moveCursorToPosition(0, grid.state.cursorRow);\n return true;\n case 'l':\n case 'End': {\n const { model } = grid.props;\n const { columnCount } = model;\n grid.clearSelectedRanges();\n grid.moveCursorToPosition(columnCount - 1, grid.state.cursorRow);\n break;\n }\n case 'Escape':\n grid.clearSelectedRanges();\n return true;\n case 'Enter':\n if (grid.state.selectedRanges.length > 0) {\n grid.moveCursorInDirection(\n e.shiftKey\n ? GridRange.SELECTION_DIRECTION.UP\n : GridRange.SELECTION_DIRECTION.DOWN\n );\n return true;\n }\n break;\n case 'Tab':\n if (grid.state.selectedRanges.length > 0) {\n grid.moveCursorInDirection(\n e.shiftKey\n ? GridRange.SELECTION_DIRECTION.LEFT\n : GridRange.SELECTION_DIRECTION.RIGHT\n );\n return true;\n }\n break;\n default:\n break;\n }\n return false;\n }\n\n handleArrowMove(\n deltaColumn: number,\n deltaRow: number,\n event: KeyboardEvent,\n grid: Grid\n ): boolean {\n const isShiftKey = event.shiftKey;\n const isModifierKey = GridUtils.isModifierKeyDown(event);\n if (isShiftKey) {\n grid.trimSelectedRanges();\n } else {\n grid.clearSelectedRanges();\n }\n\n const {\n cursorRow,\n cursorColumn,\n selectionEndColumn,\n selectionEndRow,\n } = grid.state;\n const column = isShiftKey ? selectionEndColumn : cursorColumn;\n const row = isShiftKey ? selectionEndRow : cursorRow;\n if (isModifierKey) {\n const { model } = grid.props;\n const { columnCount, rowCount } = model;\n const maximizePreviousRange = isModifierKey && isShiftKey;\n let moveToColumn = null;\n let moveToRow = null;\n if (deltaColumn < 0) {\n moveToColumn = 0;\n moveToRow = row;\n } else if (deltaColumn > 0) {\n moveToColumn = columnCount - 1;\n moveToRow = row;\n } else if (deltaRow < 0) {\n moveToColumn = column;\n moveToRow = 0;\n } else if (deltaRow > 0) {\n moveToColumn = column;\n moveToRow = rowCount - 1;\n }\n if (moveToColumn != null && moveToRow != null) {\n grid.moveCursorToPosition(\n moveToColumn,\n moveToRow,\n isShiftKey,\n true,\n maximizePreviousRange\n );\n }\n } else {\n const { theme } = grid.props;\n const { autoSelectRow, autoSelectColumn } = theme;\n if (autoSelectRow && deltaColumn !== 0) {\n const { lastLeft } = grid.metrics;\n let { left } = grid.state;\n\n left = clamp(left + deltaColumn, 0, lastLeft);\n\n grid.moveCursorToPosition(left, cursorRow, isShiftKey, false);\n\n grid.setViewState({ left });\n } else if (autoSelectColumn && deltaRow !== 0) {\n const { lastTop } = grid.metrics;\n let { top } = grid.state;\n\n top = clamp(top + deltaRow, 0, lastTop);\n\n grid.moveCursorToPosition(top, cursorColumn, isShiftKey, false);\n\n grid.setViewState({ top });\n } else {\n grid.moveCursor(deltaColumn, deltaRow, isShiftKey);\n }\n }\n return true;\n }\n\n handlePageUp(e: KeyboardEvent, grid: Grid): boolean {\n const isShiftKey = e.shiftKey;\n\n if (isShiftKey) {\n grid.trimSelectedRanges();\n } else {\n grid.clearSelectedRanges();\n }\n\n const { cursorColumn, selectionEndRow } = grid.state;\n const row: number | null = selectionEndRow;\n const column: number | null = cursorColumn;\n if (row == null) {\n return false;\n }\n const metricState = grid.getMetricState();\n const { metricCalculator } = grid;\n const {\n bottomVisible,\n topVisible,\n hasHorizontalBar,\n } = metricCalculator.getMetrics(metricState);\n\n let selectRangeEndPosition = row - (bottomVisible - topVisible);\n selectRangeEndPosition -= hasHorizontalBar ? 0 : 1;\n\n // Don't move beyond the top table row.\n selectRangeEndPosition = Math.max(selectRangeEndPosition, 0);\n const viewportPosition = Math.max(\n selectRangeEndPosition - (row - topVisible),\n 0\n );\n\n grid.moveCursorToPosition(\n column,\n selectRangeEndPosition,\n isShiftKey,\n false\n );\n grid.setViewState({ top: viewportPosition });\n return true;\n }\n\n handlePageDown(e: KeyboardEvent, grid: Grid): boolean {\n const isShiftKey = e.shiftKey;\n\n if (isShiftKey) {\n grid.trimSelectedRanges();\n } else {\n grid.clearSelectedRanges();\n }\n\n const { selectionEndRow, cursorColumn } = grid.state;\n const row: number | null = selectionEndRow;\n const column: number | null = cursorColumn;\n if (row === null) {\n return false;\n }\n const metricState = grid.getMetricState();\n const { metricCalculator } = grid;\n const {\n bottomVisible,\n topVisible,\n hasHorizontalBar,\n rowCount,\n lastTop,\n } = metricCalculator.getMetrics(metricState);\n const lastRowIndex = rowCount - 1;\n\n let selectRangeEndPosition = bottomVisible - topVisible + row;\n selectRangeEndPosition += hasHorizontalBar ? 0 : 1;\n\n // Don't move beyond the bottom table row.\n selectRangeEndPosition = Math.min(selectRangeEndPosition, lastRowIndex);\n\n const viewportPosition = Math.min(\n lastTop,\n selectRangeEndPosition - (row - topVisible)\n );\n grid.moveCursorToPosition(\n column,\n selectRangeEndPosition,\n isShiftKey,\n false\n );\n grid.setViewState({ top: viewportPosition });\n\n return true;\n }\n}\n\nexport default SelectionKeyHandler;\n"],"file":"SelectionKeyHandler.js"}
1
+ {"version":3,"sources":["../../src/key-handlers/SelectionKeyHandler.ts"],"names":["clamp","GridRange","GridUtils","KeyHandler","SelectionKeyHandler","onDown","e","grid","key","isModifierKeyDown","selectAll","handleArrowMove","handlePageUp","handlePageDown","clearSelectedRanges","moveCursorToPosition","state","cursorRow","model","props","columnCount","shiftKey","cursorColumn","rowCount","selectedRanges","length","moveCursorInDirection","SELECTION_DIRECTION","UP","DOWN","LEFT","RIGHT","deltaColumn","deltaRow","event","isShiftKey","isModifierKey","trimSelectedRanges","selectionEndColumn","selectionEndRow","column","row","maximizePreviousRange","moveToColumn","moveToRow","theme","autoSelectRow","autoSelectColumn","lastLeft","metrics","left","setViewState","lastTop","top","moveCursor","metricState","getMetricState","metricCalculator","bottomVisible","topVisible","hasHorizontalBar","getMetrics","selectRangeEndPosition","Math","max","viewportPosition","lastRowIndex","min"],"mappings":"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","sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport clamp from 'lodash.clamp';\nimport Grid from '../Grid';\nimport GridRange from '../GridRange';\nimport GridUtils from '../GridUtils';\nimport KeyHandler from '../KeyHandler';\n\nclass SelectionKeyHandler extends KeyHandler {\n onDown(e: KeyboardEvent, grid: Grid): boolean {\n switch (e.key) {\n case 'a':\n if (GridUtils.isModifierKeyDown(e)) {\n grid.selectAll();\n return true;\n }\n break;\n case 'ArrowUp':\n return this.handleArrowMove(0, -1, e, grid);\n case 'ArrowDown':\n return this.handleArrowMove(0, 1, e, grid);\n case 'ArrowRight':\n return this.handleArrowMove(1, 0, e, grid);\n case 'ArrowLeft':\n return this.handleArrowMove(-1, 0, e, grid);\n case 'k': // h/j/k/l keys are grouped together for quick navigation by power users\n case 'PageUp':\n return this.handlePageUp(e, grid);\n case 'j':\n case 'PageDown':\n return this.handlePageDown(e, grid);\n case 'h':\n grid.clearSelectedRanges();\n grid.moveCursorToPosition(0, grid.state.cursorRow);\n return true;\n case 'l': {\n const { model } = grid.props;\n const { columnCount } = model;\n grid.clearSelectedRanges();\n grid.moveCursorToPosition(columnCount - 1, grid.state.cursorRow);\n return true;\n }\n case 'Home':\n if (!e.shiftKey) {\n grid.clearSelectedRanges();\n }\n grid.moveCursorToPosition(\n GridUtils.isModifierKeyDown(e) ? grid.state.cursorColumn : 0,\n GridUtils.isModifierKeyDown(e) ? 0 : grid.state.cursorRow,\n e.shiftKey,\n true,\n true\n );\n return true;\n case 'End': {\n const { model } = grid.props;\n const { columnCount, rowCount } = model;\n if (!e.shiftKey) {\n grid.clearSelectedRanges();\n }\n grid.moveCursorToPosition(\n GridUtils.isModifierKeyDown(e)\n ? grid.state.cursorColumn\n : columnCount - 1,\n GridUtils.isModifierKeyDown(e) ? rowCount - 1 : grid.state.cursorRow,\n e.shiftKey,\n true,\n true\n );\n return true;\n }\n case 'Escape':\n grid.clearSelectedRanges();\n return true;\n case 'Enter':\n if (grid.state.selectedRanges.length > 0) {\n grid.moveCursorInDirection(\n e.shiftKey\n ? GridRange.SELECTION_DIRECTION.UP\n : GridRange.SELECTION_DIRECTION.DOWN\n );\n return true;\n }\n break;\n case 'Tab':\n if (grid.state.selectedRanges.length > 0) {\n grid.moveCursorInDirection(\n e.shiftKey\n ? GridRange.SELECTION_DIRECTION.LEFT\n : GridRange.SELECTION_DIRECTION.RIGHT\n );\n return true;\n }\n break;\n default:\n break;\n }\n return false;\n }\n\n handleArrowMove(\n deltaColumn: number,\n deltaRow: number,\n event: KeyboardEvent,\n grid: Grid\n ): boolean {\n const isShiftKey = event.shiftKey;\n const isModifierKey = GridUtils.isModifierKeyDown(event);\n if (isShiftKey) {\n grid.trimSelectedRanges();\n } else {\n grid.clearSelectedRanges();\n }\n\n const {\n cursorRow,\n cursorColumn,\n selectionEndColumn,\n selectionEndRow,\n } = grid.state;\n const column = isShiftKey ? selectionEndColumn : cursorColumn;\n const row = isShiftKey ? selectionEndRow : cursorRow;\n if (isModifierKey) {\n const { model } = grid.props;\n const { columnCount, rowCount } = model;\n const maximizePreviousRange = isModifierKey && isShiftKey;\n let moveToColumn = null;\n let moveToRow = null;\n if (deltaColumn < 0) {\n moveToColumn = 0;\n moveToRow = row;\n } else if (deltaColumn > 0) {\n moveToColumn = columnCount - 1;\n moveToRow = row;\n } else if (deltaRow < 0) {\n moveToColumn = column;\n moveToRow = 0;\n } else if (deltaRow > 0) {\n moveToColumn = column;\n moveToRow = rowCount - 1;\n }\n if (moveToColumn != null && moveToRow != null) {\n grid.moveCursorToPosition(\n moveToColumn,\n moveToRow,\n isShiftKey,\n true,\n maximizePreviousRange\n );\n }\n } else {\n const { theme } = grid.props;\n const { autoSelectRow, autoSelectColumn } = theme;\n if (autoSelectRow && deltaColumn !== 0) {\n const { lastLeft } = grid.metrics;\n let { left } = grid.state;\n\n left = clamp(left + deltaColumn, 0, lastLeft);\n\n grid.moveCursorToPosition(left, cursorRow, isShiftKey, false);\n\n grid.setViewState({ left });\n } else if (autoSelectColumn && deltaRow !== 0) {\n const { lastTop } = grid.metrics;\n let { top } = grid.state;\n\n top = clamp(top + deltaRow, 0, lastTop);\n\n grid.moveCursorToPosition(top, cursorColumn, isShiftKey, false);\n\n grid.setViewState({ top });\n } else {\n grid.moveCursor(deltaColumn, deltaRow, isShiftKey);\n }\n }\n return true;\n }\n\n handlePageUp(e: KeyboardEvent, grid: Grid): boolean {\n const isShiftKey = e.shiftKey;\n\n if (isShiftKey) {\n grid.trimSelectedRanges();\n } else {\n grid.clearSelectedRanges();\n }\n\n const { cursorColumn, selectionEndRow } = grid.state;\n const row: number | null = selectionEndRow;\n const column: number | null = cursorColumn;\n if (row == null) {\n return false;\n }\n const metricState = grid.getMetricState();\n const { metricCalculator } = grid;\n const {\n bottomVisible,\n topVisible,\n hasHorizontalBar,\n } = metricCalculator.getMetrics(metricState);\n\n let selectRangeEndPosition = row - (bottomVisible - topVisible);\n selectRangeEndPosition -= hasHorizontalBar ? 0 : 1;\n\n // Don't move beyond the top table row.\n selectRangeEndPosition = Math.max(selectRangeEndPosition, 0);\n const viewportPosition = Math.max(\n selectRangeEndPosition - (row - topVisible),\n 0\n );\n\n grid.moveCursorToPosition(\n column,\n selectRangeEndPosition,\n isShiftKey,\n false\n );\n grid.setViewState({ top: viewportPosition });\n return true;\n }\n\n handlePageDown(e: KeyboardEvent, grid: Grid): boolean {\n const isShiftKey = e.shiftKey;\n\n if (isShiftKey) {\n grid.trimSelectedRanges();\n } else {\n grid.clearSelectedRanges();\n }\n\n const { selectionEndRow, cursorColumn } = grid.state;\n const row: number | null = selectionEndRow;\n const column: number | null = cursorColumn;\n if (row === null) {\n return false;\n }\n const metricState = grid.getMetricState();\n const { metricCalculator } = grid;\n const {\n bottomVisible,\n topVisible,\n hasHorizontalBar,\n rowCount,\n lastTop,\n } = metricCalculator.getMetrics(metricState);\n const lastRowIndex = rowCount - 1;\n\n let selectRangeEndPosition = bottomVisible - topVisible + row;\n selectRangeEndPosition += hasHorizontalBar ? 0 : 1;\n\n // Don't move beyond the bottom table row.\n selectRangeEndPosition = Math.min(selectRangeEndPosition, lastRowIndex);\n\n const viewportPosition = Math.min(\n lastTop,\n selectRangeEndPosition - (row - topVisible)\n );\n grid.moveCursorToPosition(\n column,\n selectRangeEndPosition,\n isShiftKey,\n false\n );\n grid.setViewState({ top: viewportPosition });\n\n return true;\n }\n}\n\nexport default SelectionKeyHandler;\n"],"file":"SelectionKeyHandler.js"}