@odoo/o-spreadsheet 16.2.23 → 16.2.26
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.
- package/dist/o-spreadsheet.cjs.js +112 -83
- package/dist/o-spreadsheet.d.ts +11 -9
- package/dist/o-spreadsheet.esm.js +112 -83
- package/dist/o-spreadsheet.iife.js +112 -83
- package/dist/o-spreadsheet.iife.min.js +243 -243
- package/dist/o_spreadsheet.xml +3 -3
- package/package.json +1 -1
|
@@ -1366,8 +1366,10 @@ function isSameColor(color1, color2) {
|
|
|
1366
1366
|
const cellReference = new RegExp(/\$?([A-Z]{1,3})\$?([0-9]{1,7})/, "i");
|
|
1367
1367
|
// Same as above, but matches the exact string (nothing before or after)
|
|
1368
1368
|
const singleCellReference = new RegExp(/^\$?([A-Z]{1,3})\$?([0-9]{1,7})$/, "i");
|
|
1369
|
-
/** Reference of a column header (eg. A, AB) */
|
|
1370
|
-
const colHeader = new RegExp(
|
|
1369
|
+
/** Reference of a column header (eg. A, AB, $A) */
|
|
1370
|
+
const colHeader = new RegExp(/^\$?([A-Z]{1,3})+$/, "i");
|
|
1371
|
+
/** Reference of a row header (eg. 1, $1) */
|
|
1372
|
+
const rowHeader = new RegExp(/^\$?([0-9]{1,7})+$/, "i");
|
|
1371
1373
|
/** Reference of a column (eg. A, $CA, Sheet1!B) */
|
|
1372
1374
|
const colReference = new RegExp(/^\s*('.+'!|[^']+!)?\$?([A-Z]{1,3})$/, "i");
|
|
1373
1375
|
/** Reference of a row (eg. 1, 59, Sheet1!9) */
|
|
@@ -1397,6 +1399,9 @@ function isRowReference(xc) {
|
|
|
1397
1399
|
function isColHeader(str) {
|
|
1398
1400
|
return colHeader.test(str);
|
|
1399
1401
|
}
|
|
1402
|
+
function isRowHeader(str) {
|
|
1403
|
+
return rowHeader.test(str);
|
|
1404
|
+
}
|
|
1400
1405
|
/**
|
|
1401
1406
|
* Return true if the given xc is the reference of a single cell,
|
|
1402
1407
|
* without any specified sheet (e.g. A1)
|
|
@@ -2186,18 +2191,10 @@ class RangeImpl {
|
|
|
2186
2191
|
if (isFullCol) {
|
|
2187
2192
|
parts[0].rowFixed = parts[0].rowFixed || parts[1].rowFixed;
|
|
2188
2193
|
parts[1].rowFixed = parts[0].rowFixed || parts[1].rowFixed;
|
|
2189
|
-
if (zone.left === zone.right) {
|
|
2190
|
-
parts[0].colFixed = parts[0].colFixed || parts[1].colFixed;
|
|
2191
|
-
parts[1].colFixed = parts[0].colFixed || parts[1].colFixed;
|
|
2192
|
-
}
|
|
2193
2194
|
}
|
|
2194
2195
|
if (isFullRow) {
|
|
2195
2196
|
parts[0].colFixed = parts[0].colFixed || parts[1].colFixed;
|
|
2196
2197
|
parts[1].colFixed = parts[0].colFixed || parts[1].colFixed;
|
|
2197
|
-
if (zone.top === zone.bottom) {
|
|
2198
|
-
parts[0].rowFixed = parts[0].rowFixed || parts[1].rowFixed;
|
|
2199
|
-
parts[1].rowFixed = parts[0].rowFixed || parts[1].rowFixed;
|
|
2200
|
-
}
|
|
2201
2198
|
}
|
|
2202
2199
|
return parts;
|
|
2203
2200
|
}
|
|
@@ -5051,6 +5048,7 @@ const FilterMenuPopoverBuilder = {
|
|
|
5051
5048
|
},
|
|
5052
5049
|
};
|
|
5053
5050
|
|
|
5051
|
+
const macRegex = /Mac/i;
|
|
5054
5052
|
/**
|
|
5055
5053
|
* Return true if the event was triggered from
|
|
5056
5054
|
* a child element.
|
|
@@ -5096,6 +5094,17 @@ function setElementScrollTop(el, scroll) {
|
|
|
5096
5094
|
}
|
|
5097
5095
|
function getOpenedMenus() {
|
|
5098
5096
|
return Array.from(document.querySelectorAll(".o-spreadsheet .o-menu"));
|
|
5097
|
+
}
|
|
5098
|
+
function isMacOS() {
|
|
5099
|
+
return Boolean(macRegex.test(navigator.userAgent));
|
|
5100
|
+
}
|
|
5101
|
+
/**
|
|
5102
|
+
* @param {KeyboardEvent | MouseEvent} ev
|
|
5103
|
+
* @returns Returns true if the event was triggered with the "ctrl" modifier pressed.
|
|
5104
|
+
* On Mac, this is the "meta" or "command" key.
|
|
5105
|
+
*/
|
|
5106
|
+
function isCtrlKey(ev) {
|
|
5107
|
+
return isMacOS() ? ev.metaKey : ev.ctrlKey;
|
|
5099
5108
|
}
|
|
5100
5109
|
|
|
5101
5110
|
/**
|
|
@@ -16713,10 +16722,10 @@ const arrowMap = {
|
|
|
16713
16722
|
function updateSelectionWithArrowKeys(ev, selection) {
|
|
16714
16723
|
const direction = arrowMap[ev.key];
|
|
16715
16724
|
if (ev.shiftKey) {
|
|
16716
|
-
selection.resizeAnchorZone(direction, ev
|
|
16725
|
+
selection.resizeAnchorZone(direction, isCtrlKey(ev) ? "end" : 1);
|
|
16717
16726
|
}
|
|
16718
16727
|
else {
|
|
16719
|
-
selection.moveAnchorCell(direction, ev
|
|
16728
|
+
selection.moveAnchorCell(direction, isCtrlKey(ev) ? "end" : 1);
|
|
16720
16729
|
}
|
|
16721
16730
|
}
|
|
16722
16731
|
|
|
@@ -21051,7 +21060,10 @@ class GridOverlay extends owl.Component {
|
|
|
21051
21060
|
return;
|
|
21052
21061
|
}
|
|
21053
21062
|
const [col, row] = this.getCartesianCoordinates(ev);
|
|
21054
|
-
this.props.onCellClicked(col, row, {
|
|
21063
|
+
this.props.onCellClicked(col, row, {
|
|
21064
|
+
expandZone: ev.shiftKey,
|
|
21065
|
+
addZone: isCtrlKey(ev),
|
|
21066
|
+
});
|
|
21055
21067
|
}
|
|
21056
21068
|
onDoubleClick(ev) {
|
|
21057
21069
|
const [col, row] = this.getCartesianCoordinates(ev);
|
|
@@ -21139,6 +21151,7 @@ class AbstractResizer extends owl.Component {
|
|
|
21139
21151
|
draggerShadowThickness: 0,
|
|
21140
21152
|
delta: 0,
|
|
21141
21153
|
base: 0,
|
|
21154
|
+
position: "before",
|
|
21142
21155
|
});
|
|
21143
21156
|
}
|
|
21144
21157
|
_computeHandleDisplay(ev) {
|
|
@@ -21264,11 +21277,13 @@ class AbstractResizer extends owl.Component {
|
|
|
21264
21277
|
this.state.draggerLinePosition = dimensions.start;
|
|
21265
21278
|
this.state.draggerShadowPosition = dimensions.start;
|
|
21266
21279
|
this.state.base = elementIndex;
|
|
21280
|
+
this.state.position = "before";
|
|
21267
21281
|
}
|
|
21268
21282
|
else if (this._getSelectedZoneEnd() < elementIndex) {
|
|
21269
21283
|
this.state.draggerLinePosition = dimensions.end;
|
|
21270
21284
|
this.state.draggerShadowPosition = dimensions.end - this.state.draggerShadowThickness;
|
|
21271
|
-
this.state.base = elementIndex
|
|
21285
|
+
this.state.base = elementIndex;
|
|
21286
|
+
this.state.position = "after";
|
|
21272
21287
|
}
|
|
21273
21288
|
else {
|
|
21274
21289
|
this.state.draggerLinePosition = startDimensions.start;
|
|
@@ -21292,7 +21307,7 @@ class AbstractResizer extends owl.Component {
|
|
|
21292
21307
|
this._increaseSelection(index);
|
|
21293
21308
|
}
|
|
21294
21309
|
else {
|
|
21295
|
-
this._selectElement(index, ev
|
|
21310
|
+
this._selectElement(index, isCtrlKey(ev));
|
|
21296
21311
|
}
|
|
21297
21312
|
this.lastSelectedElementIndex = index;
|
|
21298
21313
|
const mouseMoveSelect = (col, row) => {
|
|
@@ -21305,7 +21320,7 @@ class AbstractResizer extends owl.Component {
|
|
|
21305
21320
|
const mouseUpSelect = () => {
|
|
21306
21321
|
this.state.isSelecting = false;
|
|
21307
21322
|
this.lastSelectedElementIndex = null;
|
|
21308
|
-
this.env.model.dispatch(ev
|
|
21323
|
+
this.env.model.dispatch(isCtrlKey(ev) ? "PREPARE_SELECTION_INPUT_EXPANSION" : "STOP_SELECTION_INPUT");
|
|
21309
21324
|
this._computeGrabDisplay(ev);
|
|
21310
21325
|
};
|
|
21311
21326
|
dragAndDropBeyondTheViewport(this.env, mouseMoveSelect, mouseUpSelect);
|
|
@@ -21449,13 +21464,14 @@ class ColResizer extends AbstractResizer {
|
|
|
21449
21464
|
dimension: "COL",
|
|
21450
21465
|
base: this.state.base,
|
|
21451
21466
|
elements,
|
|
21467
|
+
position: this.state.position,
|
|
21452
21468
|
});
|
|
21453
21469
|
if (!result.isSuccessful && result.reasons.includes(2 /* CommandResult.WillRemoveExistingMerge */)) {
|
|
21454
21470
|
this.env.raiseError(MergeErrorMessage);
|
|
21455
21471
|
}
|
|
21456
21472
|
}
|
|
21457
|
-
_selectElement(index,
|
|
21458
|
-
this.env.model.selection.selectColumn(index,
|
|
21473
|
+
_selectElement(index, addDistinctHeader) {
|
|
21474
|
+
this.env.model.selection.selectColumn(index, addDistinctHeader ? "newAnchor" : "overrideSelection");
|
|
21459
21475
|
}
|
|
21460
21476
|
_increaseSelection(index) {
|
|
21461
21477
|
this.env.model.selection.selectColumn(index, "updateAnchor");
|
|
@@ -21621,13 +21637,14 @@ class RowResizer extends AbstractResizer {
|
|
|
21621
21637
|
dimension: "ROW",
|
|
21622
21638
|
base: this.state.base,
|
|
21623
21639
|
elements,
|
|
21640
|
+
position: this.state.position,
|
|
21624
21641
|
});
|
|
21625
21642
|
if (!result.isSuccessful && result.reasons.includes(2 /* CommandResult.WillRemoveExistingMerge */)) {
|
|
21626
21643
|
this.env.raiseError(MergeErrorMessage);
|
|
21627
21644
|
}
|
|
21628
21645
|
}
|
|
21629
|
-
_selectElement(index,
|
|
21630
|
-
this.env.model.selection.selectRow(index,
|
|
21646
|
+
_selectElement(index, addDistinctHeader) {
|
|
21647
|
+
this.env.model.selection.selectRow(index, addDistinctHeader ? "newAnchor" : "overrideSelection");
|
|
21631
21648
|
}
|
|
21632
21649
|
_increaseSelection(index) {
|
|
21633
21650
|
this.env.model.selection.selectRow(index, "updateAnchor");
|
|
@@ -21729,8 +21746,8 @@ function useWheelHandler(handler) {
|
|
|
21729
21746
|
return val * (deltaMode === 0 ? 1 : DEFAULT_CELL_HEIGHT);
|
|
21730
21747
|
}
|
|
21731
21748
|
const onMouseWheel = (ev) => {
|
|
21732
|
-
const deltaX = normalize(ev.shiftKey ? ev.deltaY : ev.deltaX, ev.deltaMode);
|
|
21733
|
-
const deltaY = normalize(ev.shiftKey ? ev.deltaX : ev.deltaY, ev.deltaMode);
|
|
21749
|
+
const deltaX = normalize(ev.shiftKey && !isMacOS() ? ev.deltaY : ev.deltaX, ev.deltaMode);
|
|
21750
|
+
const deltaY = normalize(ev.shiftKey && !isMacOS() ? ev.deltaX : ev.deltaY, ev.deltaMode);
|
|
21734
21751
|
handler(deltaX, deltaY);
|
|
21735
21752
|
};
|
|
21736
21753
|
return onMouseWheel;
|
|
@@ -22374,8 +22391,8 @@ class Grid extends owl.Component {
|
|
|
22374
22391
|
// ---------------------------------------------------------------------------
|
|
22375
22392
|
// Zone selection with mouse
|
|
22376
22393
|
// ---------------------------------------------------------------------------
|
|
22377
|
-
onCellClicked(col, row, {
|
|
22378
|
-
if (
|
|
22394
|
+
onCellClicked(col, row, { addZone, expandZone }) {
|
|
22395
|
+
if (addZone) {
|
|
22379
22396
|
this.env.model.dispatch("PREPARE_SELECTION_INPUT_EXPANSION");
|
|
22380
22397
|
}
|
|
22381
22398
|
if (this.env.model.getters.hasOpenedPopover()) {
|
|
@@ -22384,10 +22401,10 @@ class Grid extends owl.Component {
|
|
|
22384
22401
|
if (this.env.model.getters.getEditionMode() === "editing") {
|
|
22385
22402
|
this.env.model.dispatch("STOP_EDITION");
|
|
22386
22403
|
}
|
|
22387
|
-
if (
|
|
22404
|
+
if (expandZone) {
|
|
22388
22405
|
this.env.model.selection.setAnchorCorner(col, row);
|
|
22389
22406
|
}
|
|
22390
|
-
else if (
|
|
22407
|
+
else if (addZone) {
|
|
22391
22408
|
this.env.model.selection.addCellToSelection(col, row);
|
|
22392
22409
|
}
|
|
22393
22410
|
else {
|
|
@@ -22449,9 +22466,7 @@ class Grid extends owl.Component {
|
|
|
22449
22466
|
return;
|
|
22450
22467
|
}
|
|
22451
22468
|
let keyDownString = "";
|
|
22452
|
-
if (ev
|
|
22453
|
-
keyDownString += "CTRL+";
|
|
22454
|
-
if (ev.metaKey)
|
|
22469
|
+
if (isCtrlKey(ev))
|
|
22455
22470
|
keyDownString += "CTRL+";
|
|
22456
22471
|
if (ev.altKey)
|
|
22457
22472
|
keyDownString += "ALT+";
|
|
@@ -24318,7 +24333,7 @@ const machine = {
|
|
|
24318
24333
|
SPACE: goTo(State.RightRef),
|
|
24319
24334
|
NUMBER: goTo(State.Found),
|
|
24320
24335
|
REFERENCE: goTo(State.Found, (token) => isSingleCellReference(token.value)),
|
|
24321
|
-
SYMBOL: goTo(State.Found, (token) => isColHeader(token.value)),
|
|
24336
|
+
SYMBOL: goTo(State.Found, (token) => isColHeader(token.value) || isRowHeader(token.value)),
|
|
24322
24337
|
},
|
|
24323
24338
|
[State.RightColumnRef]: {
|
|
24324
24339
|
SPACE: goTo(State.RightColumnRef),
|
|
@@ -24329,6 +24344,7 @@ const machine = {
|
|
|
24329
24344
|
SPACE: goTo(State.RightRowRef),
|
|
24330
24345
|
NUMBER: goTo(State.Found),
|
|
24331
24346
|
REFERENCE: goTo(State.Found, (token) => isSingleCellReference(token.value)),
|
|
24347
|
+
SYMBOL: goTo(State.Found, (token) => isRowHeader(token.value)),
|
|
24332
24348
|
},
|
|
24333
24349
|
[State.Found]: {},
|
|
24334
24350
|
};
|
|
@@ -30931,7 +30947,7 @@ class SheetPlugin extends CorePlugin {
|
|
|
30931
30947
|
const elements = cmd.dimension === "COL"
|
|
30932
30948
|
? this.getNumberCols(cmd.sheetId)
|
|
30933
30949
|
: this.getNumberRows(cmd.sheetId);
|
|
30934
|
-
if (cmd.base < 0 || cmd.base
|
|
30950
|
+
if (cmd.base < 0 || cmd.base >= elements) {
|
|
30935
30951
|
return 86 /* CommandResult.InvalidHeaderIndex */;
|
|
30936
30952
|
}
|
|
30937
30953
|
else if (cmd.quantity <= 0) {
|
|
@@ -31968,13 +31984,18 @@ class EvaluationPlugin extends UIPlugin {
|
|
|
31968
31984
|
// Getters
|
|
31969
31985
|
// ---------------------------------------------------------------------------
|
|
31970
31986
|
evaluateFormula(formulaString, sheetId = this.getters.getActiveSheetId()) {
|
|
31971
|
-
|
|
31972
|
-
|
|
31973
|
-
|
|
31974
|
-
|
|
31975
|
-
|
|
31987
|
+
try {
|
|
31988
|
+
const compiledFormula = compile(formulaString);
|
|
31989
|
+
const params = this.getCompilationParameters((cell) => this.getEvaluatedCell(this.getters.getCellPosition(cell.id)));
|
|
31990
|
+
const ranges = [];
|
|
31991
|
+
for (let xc of compiledFormula.dependencies) {
|
|
31992
|
+
ranges.push(this.getters.getRangeFromSheetXC(sheetId, xc));
|
|
31993
|
+
}
|
|
31994
|
+
return compiledFormula.execute(ranges, ...params).value;
|
|
31995
|
+
}
|
|
31996
|
+
catch (error) {
|
|
31997
|
+
return error instanceof EvaluationError ? error.errorType : CellErrorType.GenericError;
|
|
31976
31998
|
}
|
|
31977
|
-
return compiledFormula.execute(ranges, ...params).value;
|
|
31978
31999
|
}
|
|
31979
32000
|
/**
|
|
31980
32001
|
* Return the value of each cell in the range as they are displayed in the grid.
|
|
@@ -32476,39 +32497,34 @@ class EvaluationConditionalFormatPlugin extends UIPlugin {
|
|
|
32476
32497
|
this.computedIcons[sheetId] = {};
|
|
32477
32498
|
const computedStyle = this.computedStyles[sheetId];
|
|
32478
32499
|
for (let cf of this.getters.getConditionalFormats(sheetId).reverse()) {
|
|
32479
|
-
|
|
32480
|
-
|
|
32481
|
-
|
|
32482
|
-
|
|
32483
|
-
|
|
32484
|
-
|
|
32485
|
-
|
|
32486
|
-
|
|
32487
|
-
|
|
32488
|
-
|
|
32489
|
-
|
|
32490
|
-
|
|
32491
|
-
|
|
32492
|
-
|
|
32493
|
-
|
|
32494
|
-
for (let
|
|
32495
|
-
|
|
32496
|
-
|
|
32497
|
-
|
|
32498
|
-
if (
|
|
32499
|
-
|
|
32500
|
-
|
|
32501
|
-
|
|
32502
|
-
computedStyle[col][row] = Object.assign(((_a = computedStyle[col]) === null || _a === void 0 ? void 0 : _a[row]) || {}, cf.rule.style);
|
|
32503
|
-
}
|
|
32500
|
+
switch (cf.rule.type) {
|
|
32501
|
+
case "ColorScaleRule":
|
|
32502
|
+
for (let range of cf.ranges) {
|
|
32503
|
+
this.applyColorScale(range, cf.rule);
|
|
32504
|
+
}
|
|
32505
|
+
break;
|
|
32506
|
+
case "IconSetRule":
|
|
32507
|
+
for (let range of cf.ranges) {
|
|
32508
|
+
this.applyIcon(range, cf.rule);
|
|
32509
|
+
}
|
|
32510
|
+
break;
|
|
32511
|
+
default:
|
|
32512
|
+
for (let ref of cf.ranges) {
|
|
32513
|
+
const zone = this.getters.getRangeFromSheetXC(sheetId, ref).zone;
|
|
32514
|
+
for (let row = zone.top; row <= zone.bottom; row++) {
|
|
32515
|
+
for (let col = zone.left; col <= zone.right; col++) {
|
|
32516
|
+
const pr = this.rulePredicate[cf.rule.type];
|
|
32517
|
+
let cell = this.getters.getEvaluatedCell({ sheetId, col, row });
|
|
32518
|
+
if (pr && pr(cell, cf.rule)) {
|
|
32519
|
+
if (!computedStyle[col])
|
|
32520
|
+
computedStyle[col] = [];
|
|
32521
|
+
// we must combine all the properties of all the CF rules applied to the given cell
|
|
32522
|
+
computedStyle[col][row] = Object.assign(((_a = computedStyle[col]) === null || _a === void 0 ? void 0 : _a[row]) || {}, cf.rule.style);
|
|
32504
32523
|
}
|
|
32505
32524
|
}
|
|
32506
32525
|
}
|
|
32507
|
-
|
|
32508
|
-
|
|
32509
|
-
}
|
|
32510
|
-
catch (_) {
|
|
32511
|
-
// we don't care about the errors within the evaluation of a rule
|
|
32526
|
+
}
|
|
32527
|
+
break;
|
|
32512
32528
|
}
|
|
32513
32529
|
}
|
|
32514
32530
|
}
|
|
@@ -32533,7 +32549,7 @@ class EvaluationConditionalFormatPlugin extends UIPlugin {
|
|
|
32533
32549
|
return percentile(rangeValues, Number(threshold.value) / 100, true);
|
|
32534
32550
|
case "formula":
|
|
32535
32551
|
const value = threshold.value && this.getters.evaluateFormula(threshold.value);
|
|
32536
|
-
return
|
|
32552
|
+
return typeof value === "number" ? value : null;
|
|
32537
32553
|
default:
|
|
32538
32554
|
return null;
|
|
32539
32555
|
}
|
|
@@ -34096,24 +34112,27 @@ class AutofillPlugin extends UIPlugin {
|
|
|
34096
34112
|
* autofiller
|
|
34097
34113
|
*/
|
|
34098
34114
|
autofillAuto() {
|
|
34115
|
+
var _a, _b;
|
|
34099
34116
|
const zone = this.getters.getSelectedZone();
|
|
34100
34117
|
const sheetId = this.getters.getActiveSheetId();
|
|
34101
34118
|
let col = zone.left;
|
|
34102
34119
|
let row = zone.bottom;
|
|
34103
34120
|
if (col > 0) {
|
|
34104
|
-
let
|
|
34105
|
-
while (
|
|
34121
|
+
let leftPosition = { sheetId, col: col - 1, row };
|
|
34122
|
+
while (this.getters.getEvaluatedCell(leftPosition).type !== CellValueType.empty ||
|
|
34123
|
+
((_a = this.getters.getCell(leftPosition)) === null || _a === void 0 ? void 0 : _a.content)) {
|
|
34106
34124
|
row += 1;
|
|
34107
|
-
|
|
34125
|
+
leftPosition = { sheetId, col: col - 1, row };
|
|
34108
34126
|
}
|
|
34109
34127
|
}
|
|
34110
34128
|
if (row === zone.bottom) {
|
|
34111
34129
|
col = zone.right;
|
|
34112
34130
|
if (col <= this.getters.getNumberCols(sheetId)) {
|
|
34113
|
-
let
|
|
34114
|
-
while (
|
|
34131
|
+
let rightPosition = { sheetId, col: col + 1, row };
|
|
34132
|
+
while (this.getters.getEvaluatedCell(rightPosition).type !== CellValueType.empty ||
|
|
34133
|
+
((_b = this.getters.getCell(rightPosition)) === null || _b === void 0 ? void 0 : _b.content)) {
|
|
34115
34134
|
row += 1;
|
|
34116
|
-
|
|
34135
|
+
rightPosition = { sheetId, col: col + 1, row };
|
|
34117
34136
|
}
|
|
34118
34137
|
}
|
|
34119
34138
|
}
|
|
@@ -38431,6 +38450,10 @@ function setXcToReferenceType(xc, referenceType) {
|
|
|
38431
38450
|
return xc.slice(0, indexOfNumber) + "$" + xc.slice(indexOfNumber);
|
|
38432
38451
|
case "colrow":
|
|
38433
38452
|
indexOfNumber = xc.search(/[0-9]/);
|
|
38453
|
+
if (indexOfNumber === -1 || indexOfNumber === 0) {
|
|
38454
|
+
// no row number (eg. A) or no column (eg. 1)
|
|
38455
|
+
return "$" + xc;
|
|
38456
|
+
}
|
|
38434
38457
|
xc = xc.slice(0, indexOfNumber) + "$" + xc.slice(indexOfNumber);
|
|
38435
38458
|
return "$" + xc;
|
|
38436
38459
|
case "none":
|
|
@@ -39572,7 +39595,7 @@ class GridSelectionPlugin extends UIPlugin {
|
|
|
39572
39595
|
sheetId: cmd.sheetId,
|
|
39573
39596
|
base: cmd.base,
|
|
39574
39597
|
quantity: thickness,
|
|
39575
|
-
position:
|
|
39598
|
+
position: cmd.position,
|
|
39576
39599
|
});
|
|
39577
39600
|
const isCol = cmd.dimension === "COL";
|
|
39578
39601
|
const start = cmd.elements[0];
|
|
@@ -39589,12 +39612,13 @@ class GridSelectionPlugin extends UIPlugin {
|
|
|
39589
39612
|
},
|
|
39590
39613
|
];
|
|
39591
39614
|
const state = new ClipboardCellsState(target, "CUT", this.getters, this.dispatch, this.selection);
|
|
39615
|
+
const base = isBasedBefore ? cmd.base : cmd.base + 1;
|
|
39592
39616
|
const pasteTarget = [
|
|
39593
39617
|
{
|
|
39594
|
-
left: isCol ?
|
|
39595
|
-
right: isCol ?
|
|
39596
|
-
top: !isCol ?
|
|
39597
|
-
bottom: !isCol ?
|
|
39618
|
+
left: isCol ? base : 0,
|
|
39619
|
+
right: isCol ? base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
|
|
39620
|
+
top: !isCol ? base : 0,
|
|
39621
|
+
bottom: !isCol ? base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
|
|
39598
39622
|
},
|
|
39599
39623
|
];
|
|
39600
39624
|
state.paste(pasteTarget, { selectTarget: true });
|
|
@@ -39631,6 +39655,11 @@ class GridSelectionPlugin extends UIPlugin {
|
|
|
39631
39655
|
doesElementsHaveCommonMerges(id, cmd.base - 1, cmd.base)) {
|
|
39632
39656
|
return 2 /* CommandResult.WillRemoveExistingMerge */;
|
|
39633
39657
|
}
|
|
39658
|
+
const headers = [cmd.base, ...cmd.elements];
|
|
39659
|
+
const maxHeaderValue = isCol ? this.getters.getNumberCols(id) : this.getters.getNumberRows(id);
|
|
39660
|
+
if (headers.some((h) => h < 0 || h >= maxHeaderValue)) {
|
|
39661
|
+
return 86 /* CommandResult.InvalidHeaderIndex */;
|
|
39662
|
+
}
|
|
39634
39663
|
return 0 /* CommandResult.Success */;
|
|
39635
39664
|
}
|
|
39636
39665
|
//-------------------------------------------
|
|
@@ -41868,7 +41897,7 @@ class Spreadsheet extends owl.Component {
|
|
|
41868
41897
|
}
|
|
41869
41898
|
onKeydown(ev) {
|
|
41870
41899
|
let keyDownString = "";
|
|
41871
|
-
if (ev
|
|
41900
|
+
if (isCtrlKey(ev)) {
|
|
41872
41901
|
keyDownString += "CTRL+";
|
|
41873
41902
|
}
|
|
41874
41903
|
keyDownString += ev.key.toUpperCase();
|
|
@@ -45572,6 +45601,6 @@ exports.setTranslationMethod = setTranslationMethod;
|
|
|
45572
45601
|
exports.tokenize = tokenize;
|
|
45573
45602
|
|
|
45574
45603
|
|
|
45575
|
-
__info__.version = '16.2.
|
|
45576
|
-
__info__.date = '
|
|
45577
|
-
__info__.hash = '
|
|
45604
|
+
__info__.version = '16.2.26';
|
|
45605
|
+
__info__.date = '2024-01-04T16:19:52.806Z';
|
|
45606
|
+
__info__.hash = 'ef51232';
|
package/dist/o-spreadsheet.d.ts
CHANGED
|
@@ -1507,6 +1507,7 @@ interface MoveColumnsRowsCommand extends GridDependentCommand {
|
|
|
1507
1507
|
type: "MOVE_COLUMNS_ROWS";
|
|
1508
1508
|
base: HeaderIndex;
|
|
1509
1509
|
elements: HeaderIndex[];
|
|
1510
|
+
position: "before" | "after";
|
|
1510
1511
|
}
|
|
1511
1512
|
interface ResizeColumnsRowsCommand extends GridDependentCommand {
|
|
1512
1513
|
type: "RESIZE_COLUMNS_ROWS";
|
|
@@ -3686,7 +3687,7 @@ declare class EvaluationPlugin extends UIPlugin {
|
|
|
3686
3687
|
constructor(config: UIPluginConfig);
|
|
3687
3688
|
handle(cmd: Command): void;
|
|
3688
3689
|
finalize(): void;
|
|
3689
|
-
evaluateFormula(formulaString: string, sheetId?: UID):
|
|
3690
|
+
evaluateFormula(formulaString: string, sheetId?: UID): FunctionReturnValue | null;
|
|
3690
3691
|
/**
|
|
3691
3692
|
* Return the value of each cell in the range as they are displayed in the grid.
|
|
3692
3693
|
*/
|
|
@@ -5781,8 +5782,8 @@ interface Props$h {
|
|
|
5781
5782
|
onCellHovered: (position: Partial<Position$1>) => void;
|
|
5782
5783
|
onCellDoubleClicked: (col: HeaderIndex, row: HeaderIndex) => void;
|
|
5783
5784
|
onCellClicked: (col: HeaderIndex, row: HeaderIndex, modifiers: {
|
|
5784
|
-
|
|
5785
|
-
|
|
5785
|
+
addZone: boolean;
|
|
5786
|
+
expandZone: boolean;
|
|
5786
5787
|
}) => void;
|
|
5787
5788
|
onCellRightClicked: (col: HeaderIndex, row: HeaderIndex, coordinates: DOMCoordinates) => void;
|
|
5788
5789
|
onGridResized: (dimension: DOMDimension) => void;
|
|
@@ -6345,6 +6346,7 @@ interface ResizerState {
|
|
|
6345
6346
|
draggerShadowThickness: number;
|
|
6346
6347
|
delta: number;
|
|
6347
6348
|
base: number;
|
|
6349
|
+
position: "before" | "after";
|
|
6348
6350
|
}
|
|
6349
6351
|
interface ResizerProps {
|
|
6350
6352
|
onOpenContextMenu: (type: ContextMenuType, x: Pixel, y: Pixel) => void;
|
|
@@ -6367,7 +6369,7 @@ declare abstract class AbstractResizer extends Component<ResizerProps, Spreadshe
|
|
|
6367
6369
|
abstract _getMaxSize(): Pixel;
|
|
6368
6370
|
abstract _updateSize(): void;
|
|
6369
6371
|
abstract _moveElements(): void;
|
|
6370
|
-
abstract _selectElement(index: HeaderIndex,
|
|
6372
|
+
abstract _selectElement(index: HeaderIndex, addDistinctHeader: boolean): void;
|
|
6371
6373
|
abstract _increaseSelection(index: HeaderIndex): void;
|
|
6372
6374
|
abstract _fitElementSize(index: HeaderIndex): void;
|
|
6373
6375
|
abstract _getType(): ContextMenuType;
|
|
@@ -6401,7 +6403,7 @@ declare class ColResizer extends AbstractResizer {
|
|
|
6401
6403
|
_getMaxSize(): Pixel;
|
|
6402
6404
|
_updateSize(): void;
|
|
6403
6405
|
_moveElements(): void;
|
|
6404
|
-
_selectElement(index: HeaderIndex,
|
|
6406
|
+
_selectElement(index: HeaderIndex, addDistinctHeader: boolean): void;
|
|
6405
6407
|
_increaseSelection(index: HeaderIndex): void;
|
|
6406
6408
|
_fitElementSize(index: HeaderIndex): void;
|
|
6407
6409
|
_getType(): ContextMenuType;
|
|
@@ -6426,7 +6428,7 @@ declare class RowResizer extends AbstractResizer {
|
|
|
6426
6428
|
_getMaxSize(): Pixel;
|
|
6427
6429
|
_updateSize(): void;
|
|
6428
6430
|
_moveElements(): void;
|
|
6429
|
-
_selectElement(index: HeaderIndex,
|
|
6431
|
+
_selectElement(index: HeaderIndex, addDistinctHeader: boolean): void;
|
|
6430
6432
|
_increaseSelection(index: HeaderIndex): void;
|
|
6431
6433
|
_fitElementSize(index: HeaderIndex): void;
|
|
6432
6434
|
_getType(): ContextMenuType;
|
|
@@ -6553,9 +6555,9 @@ declare class Grid extends Component<Props$1, SpreadsheetChildEnv> {
|
|
|
6553
6555
|
getClientPositionKey(client: Client): string;
|
|
6554
6556
|
isCellHovered(col: HeaderIndex, row: HeaderIndex): boolean;
|
|
6555
6557
|
private getGridRect;
|
|
6556
|
-
onCellClicked(col: HeaderIndex, row: HeaderIndex, {
|
|
6557
|
-
|
|
6558
|
-
|
|
6558
|
+
onCellClicked(col: HeaderIndex, row: HeaderIndex, { addZone, expandZone }: {
|
|
6559
|
+
addZone: boolean;
|
|
6560
|
+
expandZone: boolean;
|
|
6559
6561
|
}): void;
|
|
6560
6562
|
onCellDoubleClicked(col: HeaderIndex, row: HeaderIndex): void;
|
|
6561
6563
|
closeOpenedPopover(): void;
|