handsontable 0.0.0-next-ba17d71-20240207 → 0.0.0-next-a2cc849-20240208
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of handsontable might be problematic. Click here for more details.
- package/3rdparty/walkontable/src/cell/range.d.ts +1 -0
- package/3rdparty/walkontable/src/cell/range.js +12 -0
- package/3rdparty/walkontable/src/cell/range.mjs +12 -0
- package/base.js +2 -2
- package/base.mjs +2 -2
- package/core/viewportScroll/index.js +4 -1
- package/core/viewportScroll/index.mjs +4 -1
- package/core/viewportScroll/scrollStrategies/focusScroll.js +15 -0
- package/core/viewportScroll/scrollStrategies/focusScroll.mjs +11 -0
- package/core.js +14 -0
- package/core.mjs +14 -0
- package/dist/handsontable.css +2 -2
- package/dist/handsontable.full.css +2 -2
- package/dist/handsontable.full.js +1304 -1022
- package/dist/handsontable.full.min.css +2 -2
- package/dist/handsontable.full.min.js +151 -151
- package/dist/handsontable.js +1306 -1024
- package/dist/handsontable.min.css +2 -2
- package/dist/handsontable.min.js +32 -32
- package/editorManager.js +12 -8
- package/editorManager.mjs +12 -8
- package/helpers/mixed.js +1 -1
- package/helpers/mixed.mjs +1 -1
- package/package.json +1 -1
- package/pluginHooks.d.ts +1 -0
- package/pluginHooks.js +43 -1
- package/pluginHooks.mjs +43 -1
- package/plugins/collapsibleColumns/collapsibleColumns.js +7 -1
- package/plugins/collapsibleColumns/collapsibleColumns.mjs +7 -1
- package/plugins/columnSorting/columnSorting.js +6 -0
- package/plugins/columnSorting/columnSorting.mjs +6 -0
- package/plugins/contextMenu/menu/defaultShortcutsList.js +26 -10
- package/plugins/contextMenu/menu/defaultShortcutsList.mjs +26 -10
- package/plugins/mergeCells/mergeCells.js +3 -1
- package/plugins/mergeCells/mergeCells.mjs +3 -1
- package/plugins/multiColumnSorting/multiColumnSorting.js +6 -0
- package/plugins/multiColumnSorting/multiColumnSorting.mjs +6 -0
- package/plugins/nestedHeaders/nestedHeaders.js +1 -0
- package/plugins/nestedHeaders/nestedHeaders.mjs +1 -0
- package/plugins/nestedRows/nestedRows.js +7 -1
- package/plugins/nestedRows/nestedRows.mjs +7 -1
- package/renderers/checkboxRenderer/checkboxRenderer.js +4 -4
- package/renderers/checkboxRenderer/checkboxRenderer.mjs +4 -4
- package/selection/selection.js +156 -30
- package/selection/selection.mjs +155 -29
- package/selection/transformation.js +18 -27
- package/selection/transformation.mjs +18 -27
- package/shortcutContexts/commands/editor/closeAndSave.js +2 -2
- package/shortcutContexts/commands/editor/closeAndSave.mjs +2 -2
- package/shortcutContexts/commands/editor/open.js +18 -3
- package/shortcutContexts/commands/editor/open.mjs +18 -3
- package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +6 -1
- package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +6 -1
- package/shortcutContexts/commands/moveCellSelection/inlineStart.js +6 -1
- package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +6 -1
- package/shortcutContexts/grid.js +2 -2
- package/shortcutContexts/grid.mjs +2 -2
- package/shortcuts/context.js +2 -1
- package/shortcuts/context.mjs +2 -1
@@ -20,6 +20,7 @@ import ContextMenuUI from "./ui/contextMenu.mjs";
|
|
20
20
|
import { error } from "../../helpers/console.mjs";
|
21
21
|
import { isArrayOfObjects } from "../../helpers/data.mjs";
|
22
22
|
import { TrimmingMap } from "../../translations/index.mjs";
|
23
|
+
import { EDITOR_EDIT_GROUP as SHORTCUTS_GROUP_EDITOR } from "../../shortcutContexts/index.mjs";
|
23
24
|
import RowMoveController from "./utils/rowMoveController.mjs";
|
24
25
|
export const PLUGIN_KEY = 'nestedRows';
|
25
26
|
export const PLUGIN_PRIORITY = 300;
|
@@ -396,13 +397,18 @@ export class NestedRows extends BasePlugin {
|
|
396
397
|
this.collapsingUI.collapseChildren(row);
|
397
398
|
}
|
398
399
|
}
|
400
|
+
|
401
|
+
// prevent default Enter behavior (move to the next row within a selection range)
|
402
|
+
return false;
|
399
403
|
},
|
400
404
|
runOnlyIf: () => {
|
401
405
|
var _this$hot$getSelected;
|
402
406
|
const highlight = (_this$hot$getSelected = this.hot.getSelectedRangeLast()) === null || _this$hot$getSelected === void 0 ? void 0 : _this$hot$getSelected.highlight;
|
403
407
|
return highlight && this.hot.selection.isCellVisible(highlight) && highlight.isHeader();
|
404
408
|
},
|
405
|
-
group: SHORTCUTS_GROUP
|
409
|
+
group: SHORTCUTS_GROUP,
|
410
|
+
relativeToGroup: SHORTCUTS_GROUP_EDITOR,
|
411
|
+
position: 'before'
|
406
412
|
});
|
407
413
|
}
|
408
414
|
|
@@ -139,7 +139,9 @@ function checkboxRenderer(hotInstance, TD, row, col, prop, value, cellProperties
|
|
139
139
|
const shortcutManager = hotInstance.getShortcutManager();
|
140
140
|
const gridContext = shortcutManager.getContext('grid');
|
141
141
|
const config = {
|
142
|
-
group: SHORTCUTS_GROUP
|
142
|
+
group: SHORTCUTS_GROUP,
|
143
|
+
relativeToGroup: _shortcutContexts.EDITOR_EDIT_GROUP,
|
144
|
+
position: 'before'
|
143
145
|
};
|
144
146
|
gridContext.addShortcuts([{
|
145
147
|
keys: [['space']],
|
@@ -159,9 +161,7 @@ function checkboxRenderer(hotInstance, TD, row, col, prop, value, cellProperties
|
|
159
161
|
callback: () => {
|
160
162
|
changeSelectedCheckboxesState(true);
|
161
163
|
return !areSelectedCheckboxCells(); // False blocks next action associated with the keyboard shortcut.
|
162
|
-
}
|
163
|
-
relativeToGroup: _shortcutContexts.EDITOR_EDIT_GROUP,
|
164
|
-
position: 'before'
|
164
|
+
}
|
165
165
|
}], config);
|
166
166
|
}
|
167
167
|
|
@@ -134,7 +134,9 @@ export function checkboxRenderer(hotInstance, TD, row, col, prop, value, cellPro
|
|
134
134
|
const shortcutManager = hotInstance.getShortcutManager();
|
135
135
|
const gridContext = shortcutManager.getContext('grid');
|
136
136
|
const config = {
|
137
|
-
group: SHORTCUTS_GROUP
|
137
|
+
group: SHORTCUTS_GROUP,
|
138
|
+
relativeToGroup: SHORTCUTS_GROUP_EDITOR,
|
139
|
+
position: 'before'
|
138
140
|
};
|
139
141
|
gridContext.addShortcuts([{
|
140
142
|
keys: [['space']],
|
@@ -154,9 +156,7 @@ export function checkboxRenderer(hotInstance, TD, row, col, prop, value, cellPro
|
|
154
156
|
callback: () => {
|
155
157
|
changeSelectedCheckboxesState(true);
|
156
158
|
return !areSelectedCheckboxCells(); // False blocks next action associated with the keyboard shortcut.
|
157
|
-
}
|
158
|
-
relativeToGroup: SHORTCUTS_GROUP_EDITOR,
|
159
|
-
position: 'before'
|
159
|
+
}
|
160
160
|
}], config);
|
161
161
|
}
|
162
162
|
|
package/selection/selection.js
CHANGED
@@ -9,7 +9,7 @@ var _mixed = require("./../helpers/mixed");
|
|
9
9
|
var _number = require("./../helpers/number");
|
10
10
|
var _array = require("./../helpers/array");
|
11
11
|
var _localHooks = _interopRequireDefault(require("./../mixins/localHooks"));
|
12
|
-
var
|
12
|
+
var _transformation2 = _interopRequireDefault(require("./transformation"));
|
13
13
|
var _utils = require("./utils");
|
14
14
|
var _templateLiteralTag = require("./../helpers/templateLiteralTag");
|
15
15
|
var _a11y = require("../helpers/a11y");
|
@@ -30,6 +30,9 @@ function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.
|
|
30
30
|
* @class Selection
|
31
31
|
* @util
|
32
32
|
*/
|
33
|
+
var _transformation = /*#__PURE__*/new WeakMap();
|
34
|
+
var _focusTransformation = /*#__PURE__*/new WeakMap();
|
35
|
+
var _isFocusSelectionChanged = /*#__PURE__*/new WeakMap();
|
33
36
|
var _disableHeadersHighlight = /*#__PURE__*/new WeakMap();
|
34
37
|
var _selectionSource = /*#__PURE__*/new WeakMap();
|
35
38
|
var _expectedLayersCount = /*#__PURE__*/new WeakMap();
|
@@ -69,11 +72,23 @@ class Selection {
|
|
69
72
|
*/
|
70
73
|
_defineProperty(this, "highlight", void 0);
|
71
74
|
/**
|
72
|
-
* The module for modifying coordinates.
|
75
|
+
* The module for modifying coordinates of the start and end selection.
|
73
76
|
*
|
74
77
|
* @type {Transformation}
|
75
78
|
*/
|
76
|
-
|
79
|
+
_classPrivateFieldInitSpec(this, _transformation, {
|
80
|
+
writable: true,
|
81
|
+
value: void 0
|
82
|
+
});
|
83
|
+
/**
|
84
|
+
* The module for modifying coordinates of the focus selection.
|
85
|
+
*
|
86
|
+
* @type {Transformation}
|
87
|
+
*/
|
88
|
+
_classPrivateFieldInitSpec(this, _focusTransformation, {
|
89
|
+
writable: true,
|
90
|
+
value: void 0
|
91
|
+
});
|
77
92
|
/**
|
78
93
|
* The collection of the selection layer levels where the whole row was selected using the row header or
|
79
94
|
* the corner header.
|
@@ -88,6 +103,15 @@ class Selection {
|
|
88
103
|
* @type {Set<number>}
|
89
104
|
*/
|
90
105
|
_defineProperty(this, "selectedByColumnHeader", new Set());
|
106
|
+
/**
|
107
|
+
* The flag which determines if the focus selection was changed.
|
108
|
+
*
|
109
|
+
* @type {boolean}
|
110
|
+
*/
|
111
|
+
_classPrivateFieldInitSpec(this, _isFocusSelectionChanged, {
|
112
|
+
writable: true,
|
113
|
+
value: false
|
114
|
+
});
|
91
115
|
/**
|
92
116
|
* When sets disable highlighting the headers even when the logical coordinates points on them.
|
93
117
|
*
|
@@ -138,71 +162,100 @@ class Selection {
|
|
138
162
|
createCellCoords: (row, column) => this.tableProps.createCellCoords(row, column),
|
139
163
|
createCellRange: (highlight, from, to) => this.tableProps.createCellRange(highlight, from, to)
|
140
164
|
});
|
141
|
-
this
|
165
|
+
_classPrivateFieldSet(this, _transformation, new _transformation2.default(this.selectedRange, {
|
142
166
|
rowIndexMapper: this.tableProps.rowIndexMapper,
|
143
167
|
columnIndexMapper: this.tableProps.columnIndexMapper,
|
144
168
|
countRenderableRows: () => this.tableProps.countRenderableRows(),
|
145
169
|
countRenderableColumns: () => this.tableProps.countRenderableColumns(),
|
146
|
-
countRowHeaders: () => this.tableProps.countRowHeaders(),
|
147
|
-
countColHeaders: () => this.tableProps.countColHeaders(),
|
148
170
|
visualToRenderableCoords: coords => this.tableProps.visualToRenderableCoords(coords),
|
149
171
|
renderableToVisualCoords: coords => this.tableProps.renderableToVisualCoords(coords),
|
150
172
|
createCellCoords: (row, column) => this.tableProps.createCellCoords(row, column),
|
151
|
-
navigableHeaders: () => settings.navigableHeaders,
|
152
173
|
fixedRowsBottom: () => settings.fixedRowsBottom,
|
153
174
|
minSpareRows: () => settings.minSpareRows,
|
154
175
|
minSpareCols: () => settings.minSpareCols,
|
155
176
|
autoWrapRow: () => settings.autoWrapRow,
|
156
177
|
autoWrapCol: () => settings.autoWrapCol
|
157
|
-
});
|
158
|
-
this
|
178
|
+
}));
|
179
|
+
_classPrivateFieldSet(this, _focusTransformation, new _transformation2.default(this.selectedRange, {
|
180
|
+
rowIndexMapper: this.tableProps.rowIndexMapper,
|
181
|
+
columnIndexMapper: this.tableProps.columnIndexMapper,
|
182
|
+
countRenderableRows: () => {
|
183
|
+
const range = this.selectedRange.current();
|
184
|
+
return this.tableProps.countRenderableRowsInRange(0, range.getOuterBottomEndCorner().row);
|
185
|
+
},
|
186
|
+
countRenderableColumns: () => {
|
187
|
+
const range = this.selectedRange.current();
|
188
|
+
return this.tableProps.countRenderableColumnsInRange(0, range.getOuterBottomEndCorner().col);
|
189
|
+
},
|
190
|
+
visualToRenderableCoords: coords => this.tableProps.visualToRenderableCoords(coords),
|
191
|
+
renderableToVisualCoords: coords => this.tableProps.renderableToVisualCoords(coords),
|
192
|
+
createCellCoords: (row, column) => this.tableProps.createCellCoords(row, column),
|
193
|
+
fixedRowsBottom: () => 0,
|
194
|
+
minSpareRows: () => 0,
|
195
|
+
minSpareCols: () => 0,
|
196
|
+
autoWrapRow: () => true,
|
197
|
+
autoWrapCol: () => true
|
198
|
+
}));
|
199
|
+
_classPrivateFieldGet(this, _transformation).addLocalHook('beforeTransformStart', function () {
|
159
200
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
160
201
|
args[_key] = arguments[_key];
|
161
202
|
}
|
162
203
|
return _this.runLocalHooks('beforeModifyTransformStart', ...args);
|
163
204
|
});
|
164
|
-
this.
|
205
|
+
_classPrivateFieldGet(this, _transformation).addLocalHook('afterTransformStart', function () {
|
165
206
|
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
166
207
|
args[_key2] = arguments[_key2];
|
167
208
|
}
|
168
209
|
return _this.runLocalHooks('afterModifyTransformStart', ...args);
|
169
210
|
});
|
170
|
-
this.
|
211
|
+
_classPrivateFieldGet(this, _transformation).addLocalHook('beforeTransformEnd', function () {
|
171
212
|
for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
172
213
|
args[_key3] = arguments[_key3];
|
173
214
|
}
|
174
215
|
return _this.runLocalHooks('beforeModifyTransformEnd', ...args);
|
175
216
|
});
|
176
|
-
this.
|
217
|
+
_classPrivateFieldGet(this, _transformation).addLocalHook('afterTransformEnd', function () {
|
177
218
|
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
178
219
|
args[_key4] = arguments[_key4];
|
179
220
|
}
|
180
221
|
return _this.runLocalHooks('afterModifyTransformEnd', ...args);
|
181
222
|
});
|
182
|
-
this.
|
223
|
+
_classPrivateFieldGet(this, _transformation).addLocalHook('insertRowRequire', function () {
|
183
224
|
for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
|
184
225
|
args[_key5] = arguments[_key5];
|
185
226
|
}
|
186
227
|
return _this.runLocalHooks('insertRowRequire', ...args);
|
187
228
|
});
|
188
|
-
this.
|
229
|
+
_classPrivateFieldGet(this, _transformation).addLocalHook('insertColRequire', function () {
|
189
230
|
for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
|
190
231
|
args[_key6] = arguments[_key6];
|
191
232
|
}
|
192
233
|
return _this.runLocalHooks('insertColRequire', ...args);
|
193
234
|
});
|
194
|
-
this.
|
235
|
+
_classPrivateFieldGet(this, _transformation).addLocalHook('beforeRowWrap', function () {
|
195
236
|
for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
|
196
237
|
args[_key7] = arguments[_key7];
|
197
238
|
}
|
198
239
|
return _this.runLocalHooks('beforeRowWrap', ...args);
|
199
240
|
});
|
200
|
-
this.
|
241
|
+
_classPrivateFieldGet(this, _transformation).addLocalHook('beforeColumnWrap', function () {
|
201
242
|
for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
|
202
243
|
args[_key8] = arguments[_key8];
|
203
244
|
}
|
204
245
|
return _this.runLocalHooks('beforeColumnWrap', ...args);
|
205
246
|
});
|
247
|
+
_classPrivateFieldGet(this, _focusTransformation).addLocalHook('beforeTransformStart', function () {
|
248
|
+
for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
|
249
|
+
args[_key9] = arguments[_key9];
|
250
|
+
}
|
251
|
+
return _this.runLocalHooks('beforeModifyTransformStart', ...args);
|
252
|
+
});
|
253
|
+
_classPrivateFieldGet(this, _focusTransformation).addLocalHook('afterTransformStart', function () {
|
254
|
+
for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
|
255
|
+
args[_key10] = arguments[_key10];
|
256
|
+
}
|
257
|
+
return _this.runLocalHooks('afterModifyTransformStart', ...args);
|
258
|
+
});
|
206
259
|
}
|
207
260
|
|
208
261
|
/**
|
@@ -293,6 +346,7 @@ class Selection {
|
|
293
346
|
// We are creating copy. We would like to modify just the start of the selection by below hook. Then original coords
|
294
347
|
// should be handled by next methods.
|
295
348
|
const coordsClone = coords.clone();
|
349
|
+
_classPrivateFieldSet(this, _isFocusSelectionChanged, false);
|
296
350
|
this.runLocalHooks(`beforeSetRangeStart${fragment ? 'Only' : ''}`, coordsClone);
|
297
351
|
if (!isMultipleMode || isMultipleMode && !isMultipleSelection && (0, _mixed.isUndefined)(multipleSelection)) {
|
298
352
|
this.selectedRange.clear();
|
@@ -360,11 +414,7 @@ class Selection {
|
|
360
414
|
}
|
361
415
|
}
|
362
416
|
this.runLocalHooks('beforeHighlightSet');
|
363
|
-
|
364
|
-
focusHighlight.clear();
|
365
|
-
if (this.highlight.isEnabledFor(_highlight.FOCUS_TYPE, cellRange.highlight)) {
|
366
|
-
focusHighlight.add(this.selectedRange.current().highlight).commit().syncWith(cellRange);
|
367
|
-
}
|
417
|
+
this.setRangeFocus(this.selectedRange.current().highlight);
|
368
418
|
const layerLevel = this.getLayerLevel();
|
369
419
|
|
370
420
|
// If the next layer level is lower than previous then clear all area and header highlights. This is the
|
@@ -452,15 +502,24 @@ class Selection {
|
|
452
502
|
}
|
453
503
|
|
454
504
|
/**
|
455
|
-
*
|
456
|
-
* the selection.
|
505
|
+
* Sets the selection focus position at the specified coordinates.
|
457
506
|
*
|
458
|
-
* @
|
507
|
+
* @param {CellCoords} coords The CellCoords instance with defined visual coordinates.
|
459
508
|
*/
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
509
|
+
setRangeFocus(coords) {
|
510
|
+
if (this.selectedRange.isEmpty()) {
|
511
|
+
return;
|
512
|
+
}
|
513
|
+
const cellRange = this.selectedRange.current();
|
514
|
+
const focusHighlight = this.highlight.getFocus();
|
515
|
+
focusHighlight.clear();
|
516
|
+
if (this.highlight.isEnabledFor(_highlight.FOCUS_TYPE, cellRange.highlight)) {
|
517
|
+
focusHighlight.add(coords).commit().syncWith(cellRange);
|
518
|
+
}
|
519
|
+
if (!this.inProgress) {
|
520
|
+
_classPrivateFieldSet(this, _isFocusSelectionChanged, true);
|
521
|
+
this.runLocalHooks('afterSetFocus', coords);
|
522
|
+
}
|
464
523
|
}
|
465
524
|
|
466
525
|
/**
|
@@ -473,7 +532,13 @@ class Selection {
|
|
473
532
|
*/
|
474
533
|
transformStart(rowDelta, colDelta) {
|
475
534
|
let createMissingRecords = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
476
|
-
|
535
|
+
if (this.settings.navigableHeaders) {
|
536
|
+
_classPrivateFieldGet(this, _transformation).setOffsetSize({
|
537
|
+
x: this.tableProps.countRowHeaders(),
|
538
|
+
y: this.tableProps.countColHeaders()
|
539
|
+
});
|
540
|
+
}
|
541
|
+
this.setRangeStart(_classPrivateFieldGet(this, _transformation).transformStart(rowDelta, colDelta, createMissingRecords));
|
477
542
|
}
|
478
543
|
|
479
544
|
/**
|
@@ -483,7 +548,44 @@ class Selection {
|
|
483
548
|
* @param {number} colDelta Columns number to move, value can be passed as negative number.
|
484
549
|
*/
|
485
550
|
transformEnd(rowDelta, colDelta) {
|
486
|
-
|
551
|
+
if (this.settings.navigableHeaders) {
|
552
|
+
_classPrivateFieldGet(this, _transformation).setOffsetSize({
|
553
|
+
x: this.tableProps.countRowHeaders(),
|
554
|
+
y: this.tableProps.countColHeaders()
|
555
|
+
});
|
556
|
+
}
|
557
|
+
this.setRangeEnd(_classPrivateFieldGet(this, _transformation).transformEnd(rowDelta, colDelta));
|
558
|
+
}
|
559
|
+
|
560
|
+
/**
|
561
|
+
* Transforms the focus cell selection relative to the current focus position.
|
562
|
+
*
|
563
|
+
* @param {number} rowDelta Rows number to move, value can be passed as negative number.
|
564
|
+
* @param {number} colDelta Columns number to move, value can be passed as negative number.
|
565
|
+
*/
|
566
|
+
transformFocus(rowDelta, colDelta) {
|
567
|
+
const range = this.selectedRange.current();
|
568
|
+
const {
|
569
|
+
row,
|
570
|
+
col
|
571
|
+
} = range.getOuterTopStartCorner();
|
572
|
+
const columnsInRange = this.tableProps.countRenderableColumnsInRange(0, col - 1);
|
573
|
+
const rowsInRange = this.tableProps.countRenderableRowsInRange(0, row - 1);
|
574
|
+
if (range.highlight.isHeader()) {
|
575
|
+
// for header focus selection calculate the new coords based on the selection including headers
|
576
|
+
_classPrivateFieldGet(this, _focusTransformation).setOffsetSize({
|
577
|
+
x: col < 0 ? Math.abs(col) : -columnsInRange,
|
578
|
+
y: row < 0 ? Math.abs(row) : -rowsInRange
|
579
|
+
});
|
580
|
+
} else {
|
581
|
+
// for focus selection in cells calculate the new coords only based on the selected cells
|
582
|
+
_classPrivateFieldGet(this, _focusTransformation).setOffsetSize({
|
583
|
+
x: col < 0 ? 0 : -columnsInRange,
|
584
|
+
y: row < 0 ? 0 : -rowsInRange
|
585
|
+
});
|
586
|
+
}
|
587
|
+
const focusCoords = _classPrivateFieldGet(this, _focusTransformation).transformStart(rowDelta, colDelta);
|
588
|
+
this.setRangeFocus(focusCoords.normalize());
|
487
589
|
}
|
488
590
|
|
489
591
|
/**
|
@@ -504,6 +606,30 @@ class Selection {
|
|
504
606
|
return !this.selectedRange.isEmpty();
|
505
607
|
}
|
506
608
|
|
609
|
+
/**
|
610
|
+
* Returns information if we have a multi-selection. This method check multi-selection only on the latest layer of
|
611
|
+
* the selection.
|
612
|
+
*
|
613
|
+
* @returns {boolean}
|
614
|
+
*/
|
615
|
+
isMultiple() {
|
616
|
+
if (!this.isSelected()) {
|
617
|
+
return false;
|
618
|
+
}
|
619
|
+
const isMultipleListener = (0, _object.createObjectPropListener)(!this.selectedRange.current().isSingle());
|
620
|
+
this.runLocalHooks('afterIsMultipleSelection', isMultipleListener);
|
621
|
+
return isMultipleListener.value;
|
622
|
+
}
|
623
|
+
|
624
|
+
/**
|
625
|
+
* Checks if the last selection involves changing the focus cell position only.
|
626
|
+
*
|
627
|
+
* @returns {boolean}
|
628
|
+
*/
|
629
|
+
isFocusSelectionChanged() {
|
630
|
+
return this.isSelected() && _classPrivateFieldGet(this, _isFocusSelectionChanged);
|
631
|
+
}
|
632
|
+
|
507
633
|
/**
|
508
634
|
* Returns `true` if the selection was applied by clicking to the row header. If the `layerLevel`
|
509
635
|
* argument is passed then only that layer will be checked. Otherwise, it checks if any row header
|