handsontable 0.0.0-next-221e46b-20240307 → 0.0.0-next-200799f-20240311
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.
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 +22 -5
- package/3rdparty/walkontable/src/cell/range.mjs +22 -5
- 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.d.ts +4 -3
- package/core.js +78 -21
- package/core.mjs +78 -21
- package/dist/handsontable.css +2 -2
- package/dist/handsontable.full.css +2 -2
- package/dist/handsontable.full.js +2645 -1363
- package/dist/handsontable.full.min.css +2 -2
- package/dist/handsontable.full.min.js +152 -152
- package/dist/handsontable.js +2645 -1363
- 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/calculations/selection.js +1 -70
- package/plugins/mergeCells/calculations/selection.mjs +1 -70
- package/plugins/mergeCells/cellsCollection.js +116 -0
- package/plugins/mergeCells/cellsCollection.mjs +116 -0
- package/plugins/mergeCells/contextMenuItem/toggleMerge.js +11 -1
- package/plugins/mergeCells/contextMenuItem/toggleMerge.mjs +11 -1
- package/plugins/mergeCells/focusOrder.js +258 -0
- package/plugins/mergeCells/focusOrder.mjs +253 -0
- package/plugins/mergeCells/mergeCells.js +394 -199
- package/plugins/mergeCells/mergeCells.mjs +394 -199
- 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/highlight/visualSelection.js +16 -2
- package/selection/highlight/visualSelection.mjs +16 -2
- package/selection/selection.js +225 -44
- package/selection/selection.mjs +224 -43
- package/selection/transformation.js +86 -32
- package/selection/transformation.mjs +86 -32
- 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/extendCellsSelection/down.js +1 -1
- package/shortcutContexts/commands/extendCellsSelection/down.mjs +1 -1
- package/shortcutContexts/commands/extendCellsSelection/left.js +1 -1
- package/shortcutContexts/commands/extendCellsSelection/left.mjs +1 -1
- package/shortcutContexts/commands/extendCellsSelection/right.js +1 -1
- package/shortcutContexts/commands/extendCellsSelection/right.mjs +1 -1
- package/shortcutContexts/commands/extendCellsSelection/toColumns.js +1 -1
- package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +1 -1
- package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +3 -1
- package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +3 -1
- package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +9 -3
- package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +9 -3
- package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +10 -3
- package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +10 -3
- package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +3 -1
- package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +3 -1
- package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +3 -1
- package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +3 -1
- package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +3 -1
- package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +3 -1
- package/shortcutContexts/commands/extendCellsSelection/toRows.js +1 -1
- package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +1 -1
- package/shortcutContexts/commands/extendCellsSelection/up.js +1 -1
- package/shortcutContexts/commands/extendCellsSelection/up.mjs +1 -1
- 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
- package/tableView.js +20 -0
- package/tableView.mjs +20 -0
- package/utils/dataStructures/linkedList.js +6 -1
- package/utils/dataStructures/linkedList.mjs +6 -1
@@ -3,6 +3,7 @@
|
|
3
3
|
exports.__esModule = true;
|
4
4
|
require("core-js/modules/es.array.push.js");
|
5
5
|
require("core-js/modules/es.error.cause.js");
|
6
|
+
require("core-js/modules/es.array.unscopables.flat-map.js");
|
6
7
|
var _cellCoords = _interopRequireDefault(require("./cellCoords"));
|
7
8
|
var _number = require("../../helpers/number");
|
8
9
|
var _console = require("../../helpers/console");
|
@@ -10,17 +11,30 @@ var _array = require("../../helpers/array");
|
|
10
11
|
var _utils = require("./utils");
|
11
12
|
var _templateLiteralTag = require("../../helpers/templateLiteralTag");
|
12
13
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
14
|
+
function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); }
|
15
|
+
function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
|
13
16
|
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; }
|
14
17
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
15
18
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
19
|
+
function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; }
|
16
20
|
/**
|
17
21
|
* Defines a container object for the merged cells.
|
18
22
|
*
|
19
23
|
* @private
|
20
24
|
* @class MergedCellsCollection
|
21
25
|
*/
|
26
|
+
var _getNonIntersectingIndexes = /*#__PURE__*/new WeakSet();
|
22
27
|
class MergedCellsCollection {
|
23
28
|
constructor(mergeCellsPlugin) {
|
29
|
+
/**
|
30
|
+
* Gets the list of the indexes that do not intersect with other merged cells within the provided range.
|
31
|
+
*
|
32
|
+
* @param {CellRange} range The range to search within.
|
33
|
+
* @param {'row' | 'col'} axis The axis to search within.
|
34
|
+
* @param {number} scanDirection The direction to scan the range. `1` for forward, `-1` for backward.
|
35
|
+
* @returns {number[]}
|
36
|
+
*/
|
37
|
+
_classPrivateMethodInitSpec(this, _getNonIntersectingIndexes);
|
24
38
|
/**
|
25
39
|
* Reference to the Merge Cells plugin.
|
26
40
|
*
|
@@ -259,6 +273,81 @@ class MergedCellsCollection {
|
|
259
273
|
return this.hot._createCellCoords(firstRenderableRow, firstRenderableColumn);
|
260
274
|
}
|
261
275
|
|
276
|
+
/**
|
277
|
+
* Gets the start-most visual column index that do not intersect with other merged cells within the provided range.
|
278
|
+
*
|
279
|
+
* @param {CellRange} range The range to search within.
|
280
|
+
* @param {number} visualColumnIndex The visual column index to start the search from.
|
281
|
+
* @returns {number}
|
282
|
+
*/
|
283
|
+
getStartMostColumnIndex(range, visualColumnIndex) {
|
284
|
+
const indexes = _classPrivateMethodGet(this, _getNonIntersectingIndexes, _getNonIntersectingIndexes2).call(this, range, 'col', -1);
|
285
|
+
let startMostIndex = visualColumnIndex;
|
286
|
+
for (let i = 0; i < indexes.length; i++) {
|
287
|
+
if (indexes[i] <= visualColumnIndex) {
|
288
|
+
startMostIndex = indexes[i];
|
289
|
+
break;
|
290
|
+
}
|
291
|
+
}
|
292
|
+
return startMostIndex;
|
293
|
+
}
|
294
|
+
|
295
|
+
/**
|
296
|
+
* Gets the end-most visual column index that do not intersect with other merged cells within the provided range.
|
297
|
+
*
|
298
|
+
* @param {CellRange} range The range to search within.
|
299
|
+
* @param {number} visualColumnIndex The visual column index to start the search from.
|
300
|
+
* @returns {number}
|
301
|
+
*/
|
302
|
+
getEndMostColumnIndex(range, visualColumnIndex) {
|
303
|
+
const indexes = _classPrivateMethodGet(this, _getNonIntersectingIndexes, _getNonIntersectingIndexes2).call(this, range, 'col', 1);
|
304
|
+
let endMostIndex = visualColumnIndex;
|
305
|
+
for (let i = 0; i < indexes.length; i++) {
|
306
|
+
if (indexes[i] >= visualColumnIndex) {
|
307
|
+
endMostIndex = indexes[i];
|
308
|
+
break;
|
309
|
+
}
|
310
|
+
}
|
311
|
+
return endMostIndex;
|
312
|
+
}
|
313
|
+
|
314
|
+
/**
|
315
|
+
* Gets the top-most visual row index that do not intersect with other merged cells within the provided range.
|
316
|
+
*
|
317
|
+
* @param {CellRange} range The range to search within.
|
318
|
+
* @param {number} visualRowIndex The visual row index to start the search from.
|
319
|
+
* @returns {number}
|
320
|
+
*/
|
321
|
+
getTopMostRowIndex(range, visualRowIndex) {
|
322
|
+
const indexes = _classPrivateMethodGet(this, _getNonIntersectingIndexes, _getNonIntersectingIndexes2).call(this, range, 'row', -1);
|
323
|
+
let topMostIndex = visualRowIndex;
|
324
|
+
for (let i = 0; i < indexes.length; i++) {
|
325
|
+
if (indexes[i] <= visualRowIndex) {
|
326
|
+
topMostIndex = indexes[i];
|
327
|
+
break;
|
328
|
+
}
|
329
|
+
}
|
330
|
+
return topMostIndex;
|
331
|
+
}
|
332
|
+
|
333
|
+
/**
|
334
|
+
* Gets the bottom-most visual row index that do not intersect with other merged cells within the provided range.
|
335
|
+
*
|
336
|
+
* @param {CellRange} range The range to search within.
|
337
|
+
* @param {number} visualRowIndex The visual row index to start the search from.
|
338
|
+
* @returns {number}
|
339
|
+
*/
|
340
|
+
getBottomMostRowIndex(range, visualRowIndex) {
|
341
|
+
const indexes = _classPrivateMethodGet(this, _getNonIntersectingIndexes, _getNonIntersectingIndexes2).call(this, range, 'row', 1);
|
342
|
+
let bottomMostIndex = visualRowIndex;
|
343
|
+
for (let i = 0; i < indexes.length; i++) {
|
344
|
+
if (indexes[i] >= visualRowIndex) {
|
345
|
+
bottomMostIndex = indexes[i];
|
346
|
+
break;
|
347
|
+
}
|
348
|
+
}
|
349
|
+
return bottomMostIndex;
|
350
|
+
}
|
262
351
|
/**
|
263
352
|
* Shift the merged cell in the direction and by an offset defined in the arguments.
|
264
353
|
*
|
@@ -294,4 +383,31 @@ class MergedCellsCollection {
|
|
294
383
|
});
|
295
384
|
}
|
296
385
|
}
|
386
|
+
function _getNonIntersectingIndexes2(range, axis) {
|
387
|
+
let scanDirection = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
|
388
|
+
const indexes = new Map();
|
389
|
+
const from = scanDirection === 1 ? range.getTopStartCorner() : range.getBottomEndCorner();
|
390
|
+
const to = scanDirection === 1 ? range.getBottomEndCorner() : range.getTopStartCorner();
|
391
|
+
for (let row = from.row; scanDirection === 1 ? row <= to.row : row >= to.row; row += scanDirection) {
|
392
|
+
for (let column = from.col; scanDirection === 1 ? column <= to.col : column >= to.col; column += scanDirection) {
|
393
|
+
const index = axis === 'row' ? row : column;
|
394
|
+
const mergedCell = this.get(row, column);
|
395
|
+
let lastIndex = index;
|
396
|
+
if (mergedCell) {
|
397
|
+
lastIndex = scanDirection === 1 ? mergedCell[axis] + mergedCell[`${axis}span`] - 1 : mergedCell[axis];
|
398
|
+
}
|
399
|
+
if (!indexes.has(index)) {
|
400
|
+
indexes.set(index, new Set());
|
401
|
+
}
|
402
|
+
indexes.get(index).add(lastIndex);
|
403
|
+
}
|
404
|
+
}
|
405
|
+
return Array.from(new Set(Array.from(indexes.entries()).filter(_ref => {
|
406
|
+
let [, set] = _ref;
|
407
|
+
return set.size === 1;
|
408
|
+
}).flatMap(_ref2 => {
|
409
|
+
let [, set] = _ref2;
|
410
|
+
return Array.from(set);
|
411
|
+
})));
|
412
|
+
}
|
297
413
|
var _default = exports.default = MergedCellsCollection;
|
@@ -1,8 +1,12 @@
|
|
1
1
|
import "core-js/modules/es.array.push.js";
|
2
|
+
import "core-js/modules/es.array.unscopables.flat-map.js";
|
2
3
|
import "core-js/modules/es.error.cause.js";
|
4
|
+
function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); }
|
5
|
+
function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
|
3
6
|
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
7
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
|
5
8
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
9
|
+
function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; }
|
6
10
|
import MergedCellCoords from "./cellCoords.mjs";
|
7
11
|
import { rangeEach, rangeEachReverse } from "../../helpers/number.mjs";
|
8
12
|
import { warn } from "../../helpers/console.mjs";
|
@@ -15,8 +19,18 @@ import { toSingleLine } from "../../helpers/templateLiteralTag.mjs";
|
|
15
19
|
* @private
|
16
20
|
* @class MergedCellsCollection
|
17
21
|
*/
|
22
|
+
var _getNonIntersectingIndexes = /*#__PURE__*/new WeakSet();
|
18
23
|
class MergedCellsCollection {
|
19
24
|
constructor(mergeCellsPlugin) {
|
25
|
+
/**
|
26
|
+
* Gets the list of the indexes that do not intersect with other merged cells within the provided range.
|
27
|
+
*
|
28
|
+
* @param {CellRange} range The range to search within.
|
29
|
+
* @param {'row' | 'col'} axis The axis to search within.
|
30
|
+
* @param {number} scanDirection The direction to scan the range. `1` for forward, `-1` for backward.
|
31
|
+
* @returns {number[]}
|
32
|
+
*/
|
33
|
+
_classPrivateMethodInitSpec(this, _getNonIntersectingIndexes);
|
20
34
|
/**
|
21
35
|
* Reference to the Merge Cells plugin.
|
22
36
|
*
|
@@ -255,6 +269,81 @@ class MergedCellsCollection {
|
|
255
269
|
return this.hot._createCellCoords(firstRenderableRow, firstRenderableColumn);
|
256
270
|
}
|
257
271
|
|
272
|
+
/**
|
273
|
+
* Gets the start-most visual column index that do not intersect with other merged cells within the provided range.
|
274
|
+
*
|
275
|
+
* @param {CellRange} range The range to search within.
|
276
|
+
* @param {number} visualColumnIndex The visual column index to start the search from.
|
277
|
+
* @returns {number}
|
278
|
+
*/
|
279
|
+
getStartMostColumnIndex(range, visualColumnIndex) {
|
280
|
+
const indexes = _classPrivateMethodGet(this, _getNonIntersectingIndexes, _getNonIntersectingIndexes2).call(this, range, 'col', -1);
|
281
|
+
let startMostIndex = visualColumnIndex;
|
282
|
+
for (let i = 0; i < indexes.length; i++) {
|
283
|
+
if (indexes[i] <= visualColumnIndex) {
|
284
|
+
startMostIndex = indexes[i];
|
285
|
+
break;
|
286
|
+
}
|
287
|
+
}
|
288
|
+
return startMostIndex;
|
289
|
+
}
|
290
|
+
|
291
|
+
/**
|
292
|
+
* Gets the end-most visual column index that do not intersect with other merged cells within the provided range.
|
293
|
+
*
|
294
|
+
* @param {CellRange} range The range to search within.
|
295
|
+
* @param {number} visualColumnIndex The visual column index to start the search from.
|
296
|
+
* @returns {number}
|
297
|
+
*/
|
298
|
+
getEndMostColumnIndex(range, visualColumnIndex) {
|
299
|
+
const indexes = _classPrivateMethodGet(this, _getNonIntersectingIndexes, _getNonIntersectingIndexes2).call(this, range, 'col', 1);
|
300
|
+
let endMostIndex = visualColumnIndex;
|
301
|
+
for (let i = 0; i < indexes.length; i++) {
|
302
|
+
if (indexes[i] >= visualColumnIndex) {
|
303
|
+
endMostIndex = indexes[i];
|
304
|
+
break;
|
305
|
+
}
|
306
|
+
}
|
307
|
+
return endMostIndex;
|
308
|
+
}
|
309
|
+
|
310
|
+
/**
|
311
|
+
* Gets the top-most visual row index that do not intersect with other merged cells within the provided range.
|
312
|
+
*
|
313
|
+
* @param {CellRange} range The range to search within.
|
314
|
+
* @param {number} visualRowIndex The visual row index to start the search from.
|
315
|
+
* @returns {number}
|
316
|
+
*/
|
317
|
+
getTopMostRowIndex(range, visualRowIndex) {
|
318
|
+
const indexes = _classPrivateMethodGet(this, _getNonIntersectingIndexes, _getNonIntersectingIndexes2).call(this, range, 'row', -1);
|
319
|
+
let topMostIndex = visualRowIndex;
|
320
|
+
for (let i = 0; i < indexes.length; i++) {
|
321
|
+
if (indexes[i] <= visualRowIndex) {
|
322
|
+
topMostIndex = indexes[i];
|
323
|
+
break;
|
324
|
+
}
|
325
|
+
}
|
326
|
+
return topMostIndex;
|
327
|
+
}
|
328
|
+
|
329
|
+
/**
|
330
|
+
* Gets the bottom-most visual row index that do not intersect with other merged cells within the provided range.
|
331
|
+
*
|
332
|
+
* @param {CellRange} range The range to search within.
|
333
|
+
* @param {number} visualRowIndex The visual row index to start the search from.
|
334
|
+
* @returns {number}
|
335
|
+
*/
|
336
|
+
getBottomMostRowIndex(range, visualRowIndex) {
|
337
|
+
const indexes = _classPrivateMethodGet(this, _getNonIntersectingIndexes, _getNonIntersectingIndexes2).call(this, range, 'row', 1);
|
338
|
+
let bottomMostIndex = visualRowIndex;
|
339
|
+
for (let i = 0; i < indexes.length; i++) {
|
340
|
+
if (indexes[i] >= visualRowIndex) {
|
341
|
+
bottomMostIndex = indexes[i];
|
342
|
+
break;
|
343
|
+
}
|
344
|
+
}
|
345
|
+
return bottomMostIndex;
|
346
|
+
}
|
258
347
|
/**
|
259
348
|
* Shift the merged cell in the direction and by an offset defined in the arguments.
|
260
349
|
*
|
@@ -290,4 +379,31 @@ class MergedCellsCollection {
|
|
290
379
|
});
|
291
380
|
}
|
292
381
|
}
|
382
|
+
function _getNonIntersectingIndexes2(range, axis) {
|
383
|
+
let scanDirection = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
|
384
|
+
const indexes = new Map();
|
385
|
+
const from = scanDirection === 1 ? range.getTopStartCorner() : range.getBottomEndCorner();
|
386
|
+
const to = scanDirection === 1 ? range.getBottomEndCorner() : range.getTopStartCorner();
|
387
|
+
for (let row = from.row; scanDirection === 1 ? row <= to.row : row >= to.row; row += scanDirection) {
|
388
|
+
for (let column = from.col; scanDirection === 1 ? column <= to.col : column >= to.col; column += scanDirection) {
|
389
|
+
const index = axis === 'row' ? row : column;
|
390
|
+
const mergedCell = this.get(row, column);
|
391
|
+
let lastIndex = index;
|
392
|
+
if (mergedCell) {
|
393
|
+
lastIndex = scanDirection === 1 ? mergedCell[axis] + mergedCell[`${axis}span`] - 1 : mergedCell[axis];
|
394
|
+
}
|
395
|
+
if (!indexes.has(index)) {
|
396
|
+
indexes.set(index, new Set());
|
397
|
+
}
|
398
|
+
indexes.get(index).add(lastIndex);
|
399
|
+
}
|
400
|
+
}
|
401
|
+
return Array.from(new Set(Array.from(indexes.entries()).filter(_ref => {
|
402
|
+
let [, set] = _ref;
|
403
|
+
return set.size === 1;
|
404
|
+
}).flatMap(_ref2 => {
|
405
|
+
let [, set] = _ref2;
|
406
|
+
return Array.from(set);
|
407
|
+
})));
|
408
|
+
}
|
293
409
|
export default MergedCellsCollection;
|
@@ -25,7 +25,17 @@ function toggleMergeItem(plugin) {
|
|
25
25
|
return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_MERGE_CELLS);
|
26
26
|
},
|
27
27
|
callback() {
|
28
|
-
|
28
|
+
const currentRange = this.getSelectedRangeLast();
|
29
|
+
if (!currentRange) {
|
30
|
+
return;
|
31
|
+
}
|
32
|
+
currentRange.setDirection(this.isRtl() ? 'NE-SW' : 'NW-SE');
|
33
|
+
const {
|
34
|
+
from,
|
35
|
+
to
|
36
|
+
} = currentRange;
|
37
|
+
plugin.toggleMerge(currentRange);
|
38
|
+
this.selectCell(from.row, from.col, to.row, to.col, false);
|
29
39
|
},
|
30
40
|
disabled() {
|
31
41
|
const sel = this.getSelectedLast();
|
@@ -18,7 +18,17 @@ export default function toggleMergeItem(plugin) {
|
|
18
18
|
return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_MERGE_CELLS);
|
19
19
|
},
|
20
20
|
callback() {
|
21
|
-
|
21
|
+
const currentRange = this.getSelectedRangeLast();
|
22
|
+
if (!currentRange) {
|
23
|
+
return;
|
24
|
+
}
|
25
|
+
currentRange.setDirection(this.isRtl() ? 'NE-SW' : 'NW-SE');
|
26
|
+
const {
|
27
|
+
from,
|
28
|
+
to
|
29
|
+
} = currentRange;
|
30
|
+
plugin.toggleMerge(currentRange);
|
31
|
+
this.selectCell(from.row, from.col, to.row, to.col, false);
|
22
32
|
},
|
23
33
|
disabled() {
|
24
34
|
const sel = this.getSelectedLast();
|
@@ -0,0 +1,258 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
exports.__esModule = true;
|
4
|
+
require("core-js/modules/es.error.cause.js");
|
5
|
+
require("core-js/modules/es.array.push.js");
|
6
|
+
var _linkedList = _interopRequireDefault(require("../../utils/dataStructures/linkedList"));
|
7
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
8
|
+
function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); }
|
9
|
+
function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
|
10
|
+
function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
|
11
|
+
function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; }
|
12
|
+
function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
|
13
|
+
function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
|
14
|
+
function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
|
15
|
+
function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
|
16
|
+
function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
|
17
|
+
/**
|
18
|
+
* Class responsible for providing the correct focus order (vertical and horizontal) within a selection that
|
19
|
+
* contains merged cells.
|
20
|
+
*/
|
21
|
+
var _cellsHorizontalOrder = /*#__PURE__*/new WeakMap();
|
22
|
+
var _cellsVerticalOrder = /*#__PURE__*/new WeakMap();
|
23
|
+
var _currentHorizontalLinkedNode = /*#__PURE__*/new WeakMap();
|
24
|
+
var _currentVerticalLinkedNode = /*#__PURE__*/new WeakMap();
|
25
|
+
var _mergedCellsGetter = /*#__PURE__*/new WeakMap();
|
26
|
+
var _pushOrderNode = /*#__PURE__*/new WeakSet();
|
27
|
+
class FocusOrder {
|
28
|
+
constructor(mergedCellsGetter) {
|
29
|
+
/**
|
30
|
+
* Pushes a new node to the provided list order.
|
31
|
+
*
|
32
|
+
* @param {CellRange} selectedRange The selected range to build the focus order for.
|
33
|
+
* @param {LinkedList} listOrder The list order to push the node to.
|
34
|
+
* @param {WeakSet} mergeCellsVisitor The set of visited cells.
|
35
|
+
* @param {number} row The visual row index.
|
36
|
+
* @param {number} column The visual column index.
|
37
|
+
* @returns {NodeStructure | null}
|
38
|
+
*/
|
39
|
+
_classPrivateMethodInitSpec(this, _pushOrderNode);
|
40
|
+
/**
|
41
|
+
* The linked list of the all cells within the current selection in horizontal order. The list is
|
42
|
+
* recreated every time the selection is changed.
|
43
|
+
*
|
44
|
+
* @type {LinkedList}
|
45
|
+
*/
|
46
|
+
_classPrivateFieldInitSpec(this, _cellsHorizontalOrder, {
|
47
|
+
writable: true,
|
48
|
+
value: new _linkedList.default()
|
49
|
+
});
|
50
|
+
/**
|
51
|
+
* The linked list of the all cells within the current selection in horizontal order. The list is
|
52
|
+
* recreated every time the selection is changed.
|
53
|
+
*
|
54
|
+
* @type {LinkedList}
|
55
|
+
*/
|
56
|
+
_classPrivateFieldInitSpec(this, _cellsVerticalOrder, {
|
57
|
+
writable: true,
|
58
|
+
value: new _linkedList.default()
|
59
|
+
});
|
60
|
+
/**
|
61
|
+
* The currently highlighted cell within the horizontal linked list.
|
62
|
+
*
|
63
|
+
* @type {NodeStructure | null}
|
64
|
+
*/
|
65
|
+
_classPrivateFieldInitSpec(this, _currentHorizontalLinkedNode, {
|
66
|
+
writable: true,
|
67
|
+
value: null
|
68
|
+
});
|
69
|
+
/**
|
70
|
+
* The currently highlighted cell within the vertical linked list.
|
71
|
+
*
|
72
|
+
* @type {NodeStructure | null}
|
73
|
+
*/
|
74
|
+
_classPrivateFieldInitSpec(this, _currentVerticalLinkedNode, {
|
75
|
+
writable: true,
|
76
|
+
value: null
|
77
|
+
});
|
78
|
+
/**
|
79
|
+
* The merged cells getter function.
|
80
|
+
*
|
81
|
+
* @type {function(): {row: number, col: number, rowspan: number, colspan: number} | null}}
|
82
|
+
*/
|
83
|
+
_classPrivateFieldInitSpec(this, _mergedCellsGetter, {
|
84
|
+
writable: true,
|
85
|
+
value: null
|
86
|
+
});
|
87
|
+
_classPrivateFieldSet(this, _mergedCellsGetter, mergedCellsGetter);
|
88
|
+
}
|
89
|
+
|
90
|
+
/**
|
91
|
+
* Gets the currently selected node data from the vertical focus order list.
|
92
|
+
*
|
93
|
+
* @returns {NodeStructure}
|
94
|
+
*/
|
95
|
+
getCurrentVerticalNode() {
|
96
|
+
return _classPrivateFieldGet(this, _currentVerticalLinkedNode).data;
|
97
|
+
}
|
98
|
+
|
99
|
+
/**
|
100
|
+
* Gets the next selected node data from the vertical focus order list.
|
101
|
+
*
|
102
|
+
* @returns {NodeStructure}
|
103
|
+
*/
|
104
|
+
getNextVerticalNode() {
|
105
|
+
return _classPrivateFieldGet(this, _currentVerticalLinkedNode).next.data;
|
106
|
+
}
|
107
|
+
|
108
|
+
/**
|
109
|
+
* Gets the previous selected node data from the vertical focus order list.
|
110
|
+
*
|
111
|
+
* @returns {NodeStructure}
|
112
|
+
*/
|
113
|
+
getPrevVerticalNode() {
|
114
|
+
return _classPrivateFieldGet(this, _currentVerticalLinkedNode).prev.data;
|
115
|
+
}
|
116
|
+
|
117
|
+
/**
|
118
|
+
* Gets the currently selected node data from the horizontal focus order list.
|
119
|
+
*
|
120
|
+
* @returns {NodeStructure}
|
121
|
+
*/
|
122
|
+
getCurrentHorizontalNode() {
|
123
|
+
return _classPrivateFieldGet(this, _currentHorizontalLinkedNode).data;
|
124
|
+
}
|
125
|
+
|
126
|
+
/**
|
127
|
+
* Gets the next selected node data from the horizontal focus order list.
|
128
|
+
*
|
129
|
+
* @returns {NodeStructure}
|
130
|
+
*/
|
131
|
+
getNextHorizontalNode() {
|
132
|
+
return _classPrivateFieldGet(this, _currentHorizontalLinkedNode).next.data;
|
133
|
+
}
|
134
|
+
|
135
|
+
/**
|
136
|
+
* Gets the previous selected node data from the horizontal focus order list.
|
137
|
+
*
|
138
|
+
* @returns {NodeStructure}
|
139
|
+
*/
|
140
|
+
getPrevHorizontalNode() {
|
141
|
+
return _classPrivateFieldGet(this, _currentHorizontalLinkedNode).prev.data;
|
142
|
+
}
|
143
|
+
|
144
|
+
/**
|
145
|
+
* Rebuilds the focus order list based on the provided selection.
|
146
|
+
*
|
147
|
+
* @param {CellRange} selectedRange The selected range to build the focus order for.
|
148
|
+
*/
|
149
|
+
buildFocusOrder(selectedRange) {
|
150
|
+
const topStart = selectedRange.getTopStartCorner();
|
151
|
+
const bottomEnd = selectedRange.getBottomEndCorner();
|
152
|
+
const visitedHorizontalCells = new WeakSet();
|
153
|
+
_classPrivateFieldSet(this, _cellsHorizontalOrder, new _linkedList.default());
|
154
|
+
for (let r = topStart.row; r <= bottomEnd.row; r++) {
|
155
|
+
for (let c = topStart.col; c <= bottomEnd.col; c++) {
|
156
|
+
const mergeParent = _classPrivateFieldGet(this, _mergedCellsGetter).call(this, r, c);
|
157
|
+
const node = _classPrivateMethodGet(this, _pushOrderNode, _pushOrderNode2).call(this, selectedRange, _classPrivateFieldGet(this, _cellsHorizontalOrder), visitedHorizontalCells, r, c);
|
158
|
+
if (node) {
|
159
|
+
_classPrivateFieldSet(this, _currentHorizontalLinkedNode, node);
|
160
|
+
}
|
161
|
+
if (mergeParent) {
|
162
|
+
c += mergeParent.colspan - 1;
|
163
|
+
if (mergeParent.col < topStart.col) {
|
164
|
+
c += mergeParent.col - topStart.col;
|
165
|
+
}
|
166
|
+
}
|
167
|
+
}
|
168
|
+
}
|
169
|
+
|
170
|
+
// create circular linked list
|
171
|
+
_classPrivateFieldGet(this, _cellsHorizontalOrder).first.prev = _classPrivateFieldGet(this, _cellsHorizontalOrder).last;
|
172
|
+
_classPrivateFieldGet(this, _cellsHorizontalOrder).last.next = _classPrivateFieldGet(this, _cellsHorizontalOrder).first;
|
173
|
+
const visitedVerticalCells = new WeakSet();
|
174
|
+
_classPrivateFieldSet(this, _cellsVerticalOrder, new _linkedList.default());
|
175
|
+
for (let c = topStart.col; c <= bottomEnd.col; c++) {
|
176
|
+
for (let r = topStart.row; r <= bottomEnd.row; r++) {
|
177
|
+
const mergeParent = _classPrivateFieldGet(this, _mergedCellsGetter).call(this, r, c);
|
178
|
+
const node = _classPrivateMethodGet(this, _pushOrderNode, _pushOrderNode2).call(this, selectedRange, _classPrivateFieldGet(this, _cellsVerticalOrder), visitedVerticalCells, r, c);
|
179
|
+
if (node) {
|
180
|
+
_classPrivateFieldSet(this, _currentVerticalLinkedNode, node);
|
181
|
+
}
|
182
|
+
if (mergeParent) {
|
183
|
+
r += mergeParent.rowspan - 1;
|
184
|
+
if (mergeParent.row < topStart.row) {
|
185
|
+
r += mergeParent.row - topStart.row;
|
186
|
+
}
|
187
|
+
}
|
188
|
+
}
|
189
|
+
}
|
190
|
+
|
191
|
+
// create circular linked list
|
192
|
+
_classPrivateFieldGet(this, _cellsVerticalOrder).first.prev = _classPrivateFieldGet(this, _cellsVerticalOrder).last;
|
193
|
+
_classPrivateFieldGet(this, _cellsVerticalOrder).last.next = _classPrivateFieldGet(this, _cellsVerticalOrder).first;
|
194
|
+
}
|
195
|
+
/**
|
196
|
+
* Sets the active node based on the provided row and column.
|
197
|
+
*
|
198
|
+
* @param {number} row The visual row index.
|
199
|
+
* @param {number} column The visual column index.
|
200
|
+
*/
|
201
|
+
setActiveNode(row, column) {
|
202
|
+
_classPrivateFieldGet(this, _cellsHorizontalOrder).inorder(node => {
|
203
|
+
const {
|
204
|
+
rowStart,
|
205
|
+
rowEnd,
|
206
|
+
colStart,
|
207
|
+
colEnd
|
208
|
+
} = node.data;
|
209
|
+
if (row >= rowStart && row <= rowEnd && column >= colStart && column <= colEnd) {
|
210
|
+
_classPrivateFieldSet(this, _currentHorizontalLinkedNode, node);
|
211
|
+
return false;
|
212
|
+
}
|
213
|
+
});
|
214
|
+
_classPrivateFieldGet(this, _cellsVerticalOrder).inorder(node => {
|
215
|
+
const {
|
216
|
+
rowStart,
|
217
|
+
rowEnd,
|
218
|
+
colStart,
|
219
|
+
colEnd
|
220
|
+
} = node.data;
|
221
|
+
if (row >= rowStart && row <= rowEnd && column >= colStart && column <= colEnd) {
|
222
|
+
_classPrivateFieldSet(this, _currentVerticalLinkedNode, node);
|
223
|
+
return false;
|
224
|
+
}
|
225
|
+
});
|
226
|
+
}
|
227
|
+
}
|
228
|
+
exports.FocusOrder = FocusOrder;
|
229
|
+
function _pushOrderNode2(selectedRange, listOrder, mergeCellsVisitor, row, column) {
|
230
|
+
const topStart = selectedRange.getTopStartCorner();
|
231
|
+
const bottomEnd = selectedRange.getBottomEndCorner();
|
232
|
+
const highlight = selectedRange.highlight.clone().normalize();
|
233
|
+
const mergeParent = _classPrivateFieldGet(this, _mergedCellsGetter).call(this, row, column);
|
234
|
+
if (mergeParent && mergeCellsVisitor.has(mergeParent)) {
|
235
|
+
return null;
|
236
|
+
}
|
237
|
+
const node = {
|
238
|
+
colStart: column,
|
239
|
+
colEnd: column,
|
240
|
+
rowStart: row,
|
241
|
+
rowEnd: row
|
242
|
+
};
|
243
|
+
if (mergeParent) {
|
244
|
+
mergeCellsVisitor.add(mergeParent);
|
245
|
+
if (mergeParent.row < topStart.row || mergeParent.row + mergeParent.rowspan - 1 > bottomEnd.row || mergeParent.col < topStart.col || mergeParent.col + mergeParent.colspan - 1 > bottomEnd.col) {
|
246
|
+
return null;
|
247
|
+
}
|
248
|
+
node.colStart = mergeParent.col;
|
249
|
+
node.colEnd = mergeParent.col + mergeParent.colspan - 1;
|
250
|
+
node.rowStart = mergeParent.row;
|
251
|
+
node.rowEnd = mergeParent.row + mergeParent.rowspan - 1;
|
252
|
+
}
|
253
|
+
const linkedNode = listOrder.push(node);
|
254
|
+
if (row === highlight.row && column === highlight.col || mergeParent && highlight.row >= mergeParent.row && highlight.row <= mergeParent.row + mergeParent.rowspan - 1 && highlight.col >= mergeParent.col && highlight.col <= mergeParent.col + mergeParent.colspan - 1) {
|
255
|
+
return linkedNode;
|
256
|
+
}
|
257
|
+
return null;
|
258
|
+
}
|