@odoo/o-spreadsheet 17.1.15 → 17.1.17
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 +109 -65
- package/dist/o-spreadsheet.d.ts +1 -0
- package/dist/o-spreadsheet.esm.js +109 -65
- package/dist/o-spreadsheet.iife.js +109 -65
- package/dist/o-spreadsheet.iife.min.js +101 -101
- package/dist/o_spreadsheet.xml +3 -3
- package/package.json +1 -1
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* This file is generated by o-spreadsheet build tools. Do not edit it.
|
|
4
4
|
* @see https://github.com/odoo/o-spreadsheet
|
|
5
|
-
* @version 17.1.
|
|
6
|
-
* @date 2024-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 17.1.17
|
|
6
|
+
* @date 2024-06-03T14:54:06.711Z
|
|
7
|
+
* @hash 7dedb2f
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
'use strict';
|
|
@@ -567,8 +567,9 @@ function deepEquals(o1, o2, ignoreFunctions) {
|
|
|
567
567
|
return false;
|
|
568
568
|
}
|
|
569
569
|
else {
|
|
570
|
-
if (ignoreFunctions && typeOfO1Key === "function")
|
|
571
|
-
|
|
570
|
+
if (ignoreFunctions && typeOfO1Key === "function") {
|
|
571
|
+
continue;
|
|
572
|
+
}
|
|
572
573
|
if (o1[key] !== o2[key])
|
|
573
574
|
return false;
|
|
574
575
|
}
|
|
@@ -1802,7 +1803,7 @@ class LazyTranslatedString extends String {
|
|
|
1802
1803
|
}
|
|
1803
1804
|
valueOf() {
|
|
1804
1805
|
const str = super.valueOf();
|
|
1805
|
-
return _loaded() ? sprintf(_translate(str), ...this.values) : str;
|
|
1806
|
+
return _loaded() ? sprintf(_translate(str), ...this.values) : sprintf(str, ...this.values);
|
|
1806
1807
|
}
|
|
1807
1808
|
toString() {
|
|
1808
1809
|
return this.valueOf();
|
|
@@ -2606,7 +2607,7 @@ function evaluatePredicate(value, criterion) {
|
|
|
2606
2607
|
return false;
|
|
2607
2608
|
}
|
|
2608
2609
|
if (typeof operand === "number" && operator === "=") {
|
|
2609
|
-
return toString(
|
|
2610
|
+
return value.toString() === operand.toString();
|
|
2610
2611
|
}
|
|
2611
2612
|
if (operator === "<>" || operator === "=") {
|
|
2612
2613
|
let result;
|
|
@@ -2666,14 +2667,13 @@ function visitMatchingRanges(args, cb, locale, isQuery = false) {
|
|
|
2666
2667
|
if (countArg % 2 === 1) {
|
|
2667
2668
|
throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects criteria_range and criterion to be in pairs."));
|
|
2668
2669
|
}
|
|
2669
|
-
const
|
|
2670
|
-
const
|
|
2670
|
+
const firstArg = toMatrix(args[0]);
|
|
2671
|
+
const dimRow = firstArg.length;
|
|
2672
|
+
const dimCol = firstArg[0].length;
|
|
2671
2673
|
let predicates = [];
|
|
2672
2674
|
for (let i = 0; i < countArg - 1; i += 2) {
|
|
2673
|
-
const criteriaRange = args[i];
|
|
2674
|
-
if (
|
|
2675
|
-
criteriaRange.length !== dimRow ||
|
|
2676
|
-
criteriaRange[0].length !== dimCol) {
|
|
2675
|
+
const criteriaRange = toMatrix(args[i]);
|
|
2676
|
+
if (criteriaRange.length !== dimRow || criteriaRange[0].length !== dimCol) {
|
|
2677
2677
|
throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects criteria_range to have the same dimension"));
|
|
2678
2678
|
}
|
|
2679
2679
|
const description = toString(args[i + 1]);
|
|
@@ -2683,7 +2683,7 @@ function visitMatchingRanges(args, cb, locale, isQuery = false) {
|
|
|
2683
2683
|
for (let j = 0; j < dimCol; j++) {
|
|
2684
2684
|
let validatedPredicates = true;
|
|
2685
2685
|
for (let k = 0; k < countArg - 1; k += 2) {
|
|
2686
|
-
const criteriaValue = args[k][i][j].value;
|
|
2686
|
+
const criteriaValue = toMatrix(args[k])[i][j].value;
|
|
2687
2687
|
const criterion = predicates[k / 2];
|
|
2688
2688
|
validatedPredicates = evaluatePredicate(criteriaValue ?? undefined, criterion);
|
|
2689
2689
|
if (!validatedPredicates) {
|
|
@@ -4371,8 +4371,11 @@ function copyRangeWithNewSheetId(sheetIdFrom, sheetIdTo, range) {
|
|
|
4371
4371
|
/**
|
|
4372
4372
|
* Create a range from a xc. If the xc is empty, this function returns undefined.
|
|
4373
4373
|
*/
|
|
4374
|
-
function
|
|
4375
|
-
|
|
4374
|
+
function createValidRange(getters, sheetId, xc) {
|
|
4375
|
+
if (!xc)
|
|
4376
|
+
return;
|
|
4377
|
+
const range = getters.getRangeFromSheetXC(sheetId, xc);
|
|
4378
|
+
return !(range.invalidSheetName || range.invalidXc) ? range : undefined;
|
|
4376
4379
|
}
|
|
4377
4380
|
/**
|
|
4378
4381
|
* Spread multiple colrows zone to one row/col zone and add a many new input range as needed.
|
|
@@ -5303,8 +5306,8 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
|
|
|
5303
5306
|
type = "scorecard";
|
|
5304
5307
|
constructor(definition, sheetId, getters) {
|
|
5305
5308
|
super(definition, sheetId, getters);
|
|
5306
|
-
this.keyValue =
|
|
5307
|
-
this.baseline =
|
|
5309
|
+
this.keyValue = createValidRange(getters, sheetId, definition.keyValue);
|
|
5310
|
+
this.baseline = createValidRange(getters, sheetId, definition.baseline);
|
|
5308
5311
|
this.baselineMode = definition.baselineMode;
|
|
5309
5312
|
this.baselineDescr = definition.baselineDescr;
|
|
5310
5313
|
this.background = definition.background;
|
|
@@ -8647,7 +8650,7 @@ class BarChart extends AbstractChart {
|
|
|
8647
8650
|
constructor(definition, sheetId, getters) {
|
|
8648
8651
|
super(definition, sheetId, getters);
|
|
8649
8652
|
this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
|
|
8650
|
-
this.labelRange =
|
|
8653
|
+
this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
|
|
8651
8654
|
this.background = definition.background;
|
|
8652
8655
|
this.verticalAxisPosition = definition.verticalAxisPosition;
|
|
8653
8656
|
this.legendPosition = definition.legendPosition;
|
|
@@ -8890,7 +8893,7 @@ class GaugeChart extends AbstractChart {
|
|
|
8890
8893
|
type = "gauge";
|
|
8891
8894
|
constructor(definition, sheetId, getters) {
|
|
8892
8895
|
super(definition, sheetId, getters);
|
|
8893
|
-
this.dataRange =
|
|
8896
|
+
this.dataRange = createValidRange(this.getters, this.sheetId, definition.dataRange);
|
|
8894
8897
|
this.sectionRule = definition.sectionRule;
|
|
8895
8898
|
this.background = definition.background;
|
|
8896
8899
|
}
|
|
@@ -9224,7 +9227,7 @@ class LineChart extends AbstractChart {
|
|
|
9224
9227
|
constructor(definition, sheetId, getters) {
|
|
9225
9228
|
super(definition, sheetId, getters);
|
|
9226
9229
|
this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
|
|
9227
|
-
this.labelRange =
|
|
9230
|
+
this.labelRange = createValidRange(this.getters, sheetId, definition.labelRange);
|
|
9228
9231
|
this.background = definition.background;
|
|
9229
9232
|
this.verticalAxisPosition = definition.verticalAxisPosition;
|
|
9230
9233
|
this.legendPosition = definition.legendPosition;
|
|
@@ -9544,7 +9547,7 @@ class PieChart extends AbstractChart {
|
|
|
9544
9547
|
constructor(definition, sheetId, getters) {
|
|
9545
9548
|
super(definition, sheetId, getters);
|
|
9546
9549
|
this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
|
|
9547
|
-
this.labelRange =
|
|
9550
|
+
this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
|
|
9548
9551
|
this.background = definition.background;
|
|
9549
9552
|
this.legendPosition = definition.legendPosition;
|
|
9550
9553
|
this.aggregated = definition.aggregated;
|
|
@@ -11188,6 +11191,9 @@ function makeArg(str, description) {
|
|
|
11188
11191
|
if (types.some((t) => t.startsWith("RANGE"))) {
|
|
11189
11192
|
result.acceptMatrix = true;
|
|
11190
11193
|
}
|
|
11194
|
+
if (types.every((t) => t.startsWith("RANGE"))) {
|
|
11195
|
+
result.acceptMatrixOnly = true;
|
|
11196
|
+
}
|
|
11191
11197
|
return result;
|
|
11192
11198
|
}
|
|
11193
11199
|
/**
|
|
@@ -11469,11 +11475,16 @@ const CHOOSECOLS = {
|
|
|
11469
11475
|
compute: function (array, ...columns) {
|
|
11470
11476
|
const _array = toMatrix(array);
|
|
11471
11477
|
const _columns = flattenRowFirst(columns, (item) => toInteger(item?.value, this.locale));
|
|
11472
|
-
|
|
11478
|
+
const argOutOfRange = _columns.filter((col) => col === 0 || _array.length < Math.abs(col));
|
|
11479
|
+
assert(() => argOutOfRange.length === 0, _t("The columns arguments must be between -%s and %s (got %s), excluding 0.", _array.length.toString(), _array.length.toString(), argOutOfRange.join(",")));
|
|
11473
11480
|
const result = Array(_columns.length);
|
|
11474
11481
|
for (let col = 0; col < _columns.length; col++) {
|
|
11475
|
-
|
|
11476
|
-
|
|
11482
|
+
if (_columns[col] > 0) {
|
|
11483
|
+
result[col] = _array[_columns[col] - 1]; // -1 because columns arguments are 1-indexed
|
|
11484
|
+
}
|
|
11485
|
+
else {
|
|
11486
|
+
result[col] = _array[_array.length + _columns[col]];
|
|
11487
|
+
}
|
|
11477
11488
|
}
|
|
11478
11489
|
return result;
|
|
11479
11490
|
},
|
|
@@ -11494,8 +11505,14 @@ const CHOOSEROWS = {
|
|
|
11494
11505
|
const _array = toMatrix(array);
|
|
11495
11506
|
const _rows = flattenRowFirst(rows, (item) => toInteger(item?.value, this.locale));
|
|
11496
11507
|
const _nbColumns = _array.length;
|
|
11497
|
-
|
|
11498
|
-
|
|
11508
|
+
const argOutOfRange = _rows.filter((row) => row === 0 || _array[0].length < Math.abs(row));
|
|
11509
|
+
assert(() => argOutOfRange.length === 0, _t("The rows arguments must be between -%s and %s (got %s), excluding 0.", _array[0].length.toString(), _array[0].length.toString(), argOutOfRange.join(",")));
|
|
11510
|
+
return generateMatrix(_nbColumns, _rows.length, (col, row) => {
|
|
11511
|
+
if (_rows[row] > 0) {
|
|
11512
|
+
return _array[col][_rows[row] - 1]; // -1 because columns arguments are 1-indexed
|
|
11513
|
+
}
|
|
11514
|
+
return _array[col][_array[col].length + _rows[row]];
|
|
11515
|
+
});
|
|
11499
11516
|
},
|
|
11500
11517
|
isExported: true,
|
|
11501
11518
|
};
|
|
@@ -12403,7 +12420,7 @@ const COUNTUNIQUEIFS = {
|
|
|
12403
12420
|
compute: function (range, ...args) {
|
|
12404
12421
|
let uniqueValues = new Set();
|
|
12405
12422
|
visitMatchingRanges(args, (i, j) => {
|
|
12406
|
-
const data = range[i][j];
|
|
12423
|
+
const data = range[i]?.[j];
|
|
12407
12424
|
if (isDefined(data)) {
|
|
12408
12425
|
uniqueValues.add(data.value);
|
|
12409
12426
|
}
|
|
@@ -13033,7 +13050,7 @@ const SUMIF = {
|
|
|
13033
13050
|
}
|
|
13034
13051
|
let sum = 0;
|
|
13035
13052
|
visitMatchingRanges([criteriaRange, criterion], (i, j) => {
|
|
13036
|
-
const value = sumRange[i][j]
|
|
13053
|
+
const value = sumRange[i]?.[j]?.value;
|
|
13037
13054
|
if (typeof value === "number") {
|
|
13038
13055
|
sum += value;
|
|
13039
13056
|
}
|
|
@@ -13058,7 +13075,7 @@ const SUMIFS = {
|
|
|
13058
13075
|
compute: function (sumRange, ...criters) {
|
|
13059
13076
|
let sum = 0;
|
|
13060
13077
|
visitMatchingRanges(criters, (i, j) => {
|
|
13061
|
-
const value = sumRange[i][j]
|
|
13078
|
+
const value = sumRange[i]?.[j]?.value;
|
|
13062
13079
|
if (typeof value === "number") {
|
|
13063
13080
|
sum += value;
|
|
13064
13081
|
}
|
|
@@ -13605,7 +13622,7 @@ const AVERAGEIF = {
|
|
|
13605
13622
|
let count = 0;
|
|
13606
13623
|
let sum = 0;
|
|
13607
13624
|
visitMatchingRanges([criteriaRange, criterion], (i, j) => {
|
|
13608
|
-
const value = _averageRange[i][j]
|
|
13625
|
+
const value = _averageRange[i]?.[j]?.value;
|
|
13609
13626
|
if (typeof value === "number") {
|
|
13610
13627
|
count += 1;
|
|
13611
13628
|
sum += value;
|
|
@@ -13634,7 +13651,7 @@ const AVERAGEIFS = {
|
|
|
13634
13651
|
let count = 0;
|
|
13635
13652
|
let sum = 0;
|
|
13636
13653
|
visitMatchingRanges(args, (i, j) => {
|
|
13637
|
-
const value = _averageRange[i][j]
|
|
13654
|
+
const value = _averageRange[i]?.[j]?.value;
|
|
13638
13655
|
if (typeof value === "number") {
|
|
13639
13656
|
count += 1;
|
|
13640
13657
|
sum += value;
|
|
@@ -13939,7 +13956,7 @@ const MAXIFS = {
|
|
|
13939
13956
|
compute: function (range, ...args) {
|
|
13940
13957
|
let result = -Infinity;
|
|
13941
13958
|
visitMatchingRanges(args, (i, j) => {
|
|
13942
|
-
const value = range[i][j]
|
|
13959
|
+
const value = range[i]?.[j]?.value;
|
|
13943
13960
|
if (typeof value === "number") {
|
|
13944
13961
|
result = result < value ? value : result;
|
|
13945
13962
|
}
|
|
@@ -14022,7 +14039,7 @@ const MINIFS = {
|
|
|
14022
14039
|
compute: function (range, ...args) {
|
|
14023
14040
|
let result = Infinity;
|
|
14024
14041
|
visitMatchingRanges(args, (i, j) => {
|
|
14025
|
-
const value = range[i][j]
|
|
14042
|
+
const value = range[i]?.[j]?.value;
|
|
14026
14043
|
if (typeof value === "number") {
|
|
14027
14044
|
result = result > value ? value : result;
|
|
14028
14045
|
}
|
|
@@ -19799,6 +19816,9 @@ function addInputHandling(descr) {
|
|
|
19799
19816
|
}
|
|
19800
19817
|
args[i] = arg[0][0];
|
|
19801
19818
|
}
|
|
19819
|
+
if (!isMatrix(arg) && argDefinition.acceptMatrixOnly) {
|
|
19820
|
+
throw new BadExpressionError(_t("Function [[FUNCTION_NAME]] expects the parameter '%s' to be reference to a cell or range.", (i + 1).toString()));
|
|
19821
|
+
}
|
|
19802
19822
|
}
|
|
19803
19823
|
return descr.compute.apply(this, args);
|
|
19804
19824
|
}
|
|
@@ -22151,7 +22171,7 @@ class LineBarPieConfigPanel extends owl.Component {
|
|
|
22151
22171
|
}
|
|
22152
22172
|
const getters = this.env.model.getters;
|
|
22153
22173
|
const sheetId = getters.getActiveSheetId();
|
|
22154
|
-
const labelRange =
|
|
22174
|
+
const labelRange = createValidRange(getters, sheetId, this.labelRange);
|
|
22155
22175
|
const dataSets = createDataSets(getters, this.dataSeriesRanges, sheetId, this.props.definition.dataSetsHaveTitle);
|
|
22156
22176
|
if (dataSets.length) {
|
|
22157
22177
|
return dataSets[0].dataRange.zone.top + 1;
|
|
@@ -26274,14 +26294,14 @@ class FigureComponent extends owl.Component {
|
|
|
26274
26294
|
}
|
|
26275
26295
|
onKeyDown(ev) {
|
|
26276
26296
|
const figure = this.props.figure;
|
|
26277
|
-
|
|
26297
|
+
const keyDownShortcut = keyboardEventToShortcutString(ev);
|
|
26298
|
+
switch (keyDownShortcut) {
|
|
26278
26299
|
case "Delete":
|
|
26279
26300
|
this.env.model.dispatch("DELETE_FIGURE", {
|
|
26280
26301
|
sheetId: this.env.model.getters.getActiveSheetId(),
|
|
26281
26302
|
id: figure.id,
|
|
26282
26303
|
});
|
|
26283
26304
|
this.props.onFigureDeleted();
|
|
26284
|
-
ev.stopPropagation();
|
|
26285
26305
|
ev.preventDefault();
|
|
26286
26306
|
ev.stopPropagation();
|
|
26287
26307
|
break;
|
|
@@ -26302,7 +26322,22 @@ class FigureComponent extends owl.Component {
|
|
|
26302
26322
|
x: figure.x + delta[0],
|
|
26303
26323
|
y: figure.y + delta[1],
|
|
26304
26324
|
});
|
|
26325
|
+
ev.preventDefault();
|
|
26305
26326
|
ev.stopPropagation();
|
|
26327
|
+
break;
|
|
26328
|
+
case "Ctrl+A":
|
|
26329
|
+
// Maybe in the future we will implement a way to select all figures
|
|
26330
|
+
ev.preventDefault();
|
|
26331
|
+
ev.stopPropagation();
|
|
26332
|
+
break;
|
|
26333
|
+
case "Ctrl+Y":
|
|
26334
|
+
case "Ctrl+Z":
|
|
26335
|
+
if (keyDownShortcut === "Ctrl+Y") {
|
|
26336
|
+
this.env.model.dispatch("REQUEST_REDO");
|
|
26337
|
+
}
|
|
26338
|
+
else if (keyDownShortcut === "Ctrl+Z") {
|
|
26339
|
+
this.env.model.dispatch("REQUEST_UNDO");
|
|
26340
|
+
}
|
|
26306
26341
|
ev.preventDefault();
|
|
26307
26342
|
ev.stopPropagation();
|
|
26308
26343
|
break;
|
|
@@ -27177,7 +27212,7 @@ class Composer extends owl.Component {
|
|
|
27177
27212
|
"Ctrl+Enter": this.processNewLineEvent,
|
|
27178
27213
|
Escape: this.processEscapeKey,
|
|
27179
27214
|
F2: () => console.warn("Not implemented"),
|
|
27180
|
-
F4: this.processF4Key,
|
|
27215
|
+
F4: (ev) => this.processF4Key(ev),
|
|
27181
27216
|
Tab: (ev) => this.processTabKey(ev, "right"),
|
|
27182
27217
|
"Shift+Tab": (ev) => this.processTabKey(ev, "left"),
|
|
27183
27218
|
};
|
|
@@ -27291,9 +27326,10 @@ class Composer extends owl.Component {
|
|
|
27291
27326
|
processEscapeKey() {
|
|
27292
27327
|
this.env.model.dispatch("CANCEL_EDITION");
|
|
27293
27328
|
}
|
|
27294
|
-
processF4Key() {
|
|
27329
|
+
processF4Key(ev) {
|
|
27295
27330
|
this.env.model.dispatch("CYCLE_EDITION_REFERENCES");
|
|
27296
27331
|
this.processContent();
|
|
27332
|
+
ev.stopPropagation();
|
|
27297
27333
|
}
|
|
27298
27334
|
processNumpadDecimal(ev) {
|
|
27299
27335
|
ev.stopPropagation();
|
|
@@ -35762,12 +35798,6 @@ function compileTokens(tokens) {
|
|
|
35762
35798
|
// detect when an argument need to be evaluated as a meta argument
|
|
35763
35799
|
const isMeta = argTypes.includes("META");
|
|
35764
35800
|
const hasRange = argTypes.some((t) => isRangeType(t));
|
|
35765
|
-
const isRangeOnly = argTypes.every((t) => isRangeType(t));
|
|
35766
|
-
if (isRangeOnly) {
|
|
35767
|
-
if (!isRangeInput(currentArg)) {
|
|
35768
|
-
throw new BadExpressionError(_t("Function %s expects the parameter %s to be reference to a cell or range, not a %s.", functionName, (i + 1).toString(), currentArg.type.toLowerCase()));
|
|
35769
|
-
}
|
|
35770
|
-
}
|
|
35771
35801
|
compiledArgs.push(compileAST(currentArg, isMeta, hasRange, {
|
|
35772
35802
|
functionName,
|
|
35773
35803
|
paramIndex: i + 1,
|
|
@@ -35938,16 +35968,6 @@ function assertEnoughArgs(ast) {
|
|
|
35938
35968
|
function isRangeType(type) {
|
|
35939
35969
|
return type.startsWith("RANGE");
|
|
35940
35970
|
}
|
|
35941
|
-
function isRangeInput(arg) {
|
|
35942
|
-
if (arg.type === "REFERENCE") {
|
|
35943
|
-
return true;
|
|
35944
|
-
}
|
|
35945
|
-
if (arg.type === "FUNCALL") {
|
|
35946
|
-
const fnDef = functions$1[arg.value.toUpperCase()];
|
|
35947
|
-
return fnDef && isRangeType(fnDef.returns[0]);
|
|
35948
|
-
}
|
|
35949
|
-
return false;
|
|
35950
|
-
}
|
|
35951
35971
|
|
|
35952
35972
|
/**
|
|
35953
35973
|
* Add the following information on tokens:
|
|
@@ -38454,7 +38474,12 @@ class MergePlugin extends CorePlugin {
|
|
|
38454
38474
|
* if they have at least a common cell
|
|
38455
38475
|
*/
|
|
38456
38476
|
doesIntersectMerge(sheetId, zone) {
|
|
38457
|
-
|
|
38477
|
+
for (const merge of this.getMerges(sheetId)) {
|
|
38478
|
+
if (overlap(zone, merge)) {
|
|
38479
|
+
return true;
|
|
38480
|
+
}
|
|
38481
|
+
}
|
|
38482
|
+
return false;
|
|
38458
38483
|
}
|
|
38459
38484
|
/**
|
|
38460
38485
|
* Returns true if two columns have at least one merge in common
|
|
@@ -39055,6 +39080,9 @@ class RangeAdapter {
|
|
|
39055
39080
|
if (range.invalidXc) {
|
|
39056
39081
|
return range.invalidXc;
|
|
39057
39082
|
}
|
|
39083
|
+
if (!this.getters.tryGetSheet(range.sheetId)) {
|
|
39084
|
+
return CellErrorType.InvalidReference;
|
|
39085
|
+
}
|
|
39058
39086
|
if (range.zone.bottom - range.zone.top < 0 || range.zone.right - range.zone.left < 0) {
|
|
39059
39087
|
return CellErrorType.InvalidReference;
|
|
39060
39088
|
}
|
|
@@ -42502,16 +42530,22 @@ class EvaluationPlugin extends UIPlugin {
|
|
|
42502
42530
|
let newContent = undefined;
|
|
42503
42531
|
let newFormat = undefined;
|
|
42504
42532
|
let isExported = true;
|
|
42533
|
+
const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
|
|
42505
42534
|
const formulaCell = this.getCorrespondingFormulaCell(position);
|
|
42506
42535
|
if (formulaCell) {
|
|
42507
42536
|
isExported = isExportableToExcel(formulaCell.compiledFormula.tokens);
|
|
42508
42537
|
isFormula = isExported;
|
|
42509
42538
|
if (!isExported) {
|
|
42510
|
-
|
|
42511
|
-
|
|
42539
|
+
// If the cell contains a non-exported formula and that is evaluates to
|
|
42540
|
+
// nothing* ,we don't export it.
|
|
42541
|
+
// * non-falsy value are relevant and so are 0 and FALSE, which only leaves
|
|
42542
|
+
// the empty string.
|
|
42543
|
+
if (value !== "") {
|
|
42544
|
+
newContent = value.toString();
|
|
42545
|
+
newFormat = evaluatedCell.format;
|
|
42546
|
+
}
|
|
42512
42547
|
}
|
|
42513
42548
|
}
|
|
42514
|
-
const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
|
|
42515
42549
|
const exportedCellData = exportedSheetData.cells[xc] || {};
|
|
42516
42550
|
const format = newFormat
|
|
42517
42551
|
? getItemId(newFormat, data.formats)
|
|
@@ -48813,7 +48847,7 @@ class ClipboardPlugin extends UIPlugin {
|
|
|
48813
48847
|
case "ADD_COLUMNS_ROWS": {
|
|
48814
48848
|
this.status = "invisible";
|
|
48815
48849
|
// If we add a col/row inside or before the cut area, we invalidate the clipboard
|
|
48816
|
-
if (this.state?.operation !== "CUT") {
|
|
48850
|
+
if (this.state?.operation !== "CUT" || cmd.sheetId !== this.state?.sheetId) {
|
|
48817
48851
|
return;
|
|
48818
48852
|
}
|
|
48819
48853
|
const isClipboardDirty = this.state.isColRowDirtyingClipboard(cmd.position === "before" ? cmd.base : cmd.base + 1, cmd.dimension);
|
|
@@ -48825,7 +48859,7 @@ class ClipboardPlugin extends UIPlugin {
|
|
|
48825
48859
|
case "REMOVE_COLUMNS_ROWS": {
|
|
48826
48860
|
this.status = "invisible";
|
|
48827
48861
|
// If we remove a col/row inside or before the cut area, we invalidate the clipboard
|
|
48828
|
-
if (this.state?.operation !== "CUT") {
|
|
48862
|
+
if (this.state?.operation !== "CUT" || cmd.sheetId !== this.state?.sheetId) {
|
|
48829
48863
|
return;
|
|
48830
48864
|
}
|
|
48831
48865
|
for (let el of cmd.elements) {
|
|
@@ -52008,9 +52042,11 @@ class BottomBarSheet extends owl.Component {
|
|
|
52008
52042
|
if (ev.key === "Enter") {
|
|
52009
52043
|
ev.preventDefault();
|
|
52010
52044
|
this.stopEdition();
|
|
52045
|
+
this.env.focusableElement.focus();
|
|
52011
52046
|
}
|
|
52012
52047
|
if (ev.key === "Escape") {
|
|
52013
52048
|
this.cancelEdition();
|
|
52049
|
+
this.env.focusableElement.focus();
|
|
52014
52050
|
}
|
|
52015
52051
|
}
|
|
52016
52052
|
onClickSheetName(ev) {
|
|
@@ -53896,6 +53932,10 @@ class Spreadsheet extends owl.Component {
|
|
|
53896
53932
|
}, () => [this.env.model.getters.getActiveSheetId()]);
|
|
53897
53933
|
owl.useExternalListener(window, "resize", () => this.render(true));
|
|
53898
53934
|
owl.useExternalListener(window, "beforeunload", this.unbindModelEvents.bind(this));
|
|
53935
|
+
// For some reason, the wheel event is not properly registered inside templates
|
|
53936
|
+
// in Chromium-based browsers based on chromium 125
|
|
53937
|
+
// This hack ensures the event declared in the template is properly registered/working
|
|
53938
|
+
owl.useExternalListener(document.body, "wheel", () => { });
|
|
53899
53939
|
this.bindModelEvents();
|
|
53900
53940
|
owl.onWillUpdateProps((nextProps) => {
|
|
53901
53941
|
if (nextProps.model !== this.props.model) {
|
|
@@ -56701,7 +56741,11 @@ function addRows(construct, data, sheet) {
|
|
|
56701
56741
|
let cellNode = escapeXml ``;
|
|
56702
56742
|
// Either formula or static value inside the cell
|
|
56703
56743
|
if (cell.isFormula) {
|
|
56704
|
-
|
|
56744
|
+
const res = addFormula(cell);
|
|
56745
|
+
if (!res) {
|
|
56746
|
+
continue;
|
|
56747
|
+
}
|
|
56748
|
+
({ attrs: additionalAttrs, node: cellNode } = res);
|
|
56705
56749
|
}
|
|
56706
56750
|
else if (cell.content && isMarkdownLink(cell.content)) {
|
|
56707
56751
|
const { label } = parseMarkdownLink(cell.content);
|
|
@@ -57731,6 +57775,6 @@ exports.setTranslationMethod = setTranslationMethod;
|
|
|
57731
57775
|
exports.tokenize = tokenize;
|
|
57732
57776
|
|
|
57733
57777
|
|
|
57734
|
-
__info__.version = "17.1.
|
|
57735
|
-
__info__.date = "2024-
|
|
57736
|
-
__info__.hash = "
|
|
57778
|
+
__info__.version = "17.1.17";
|
|
57779
|
+
__info__.date = "2024-06-03T14:54:06.711Z";
|
|
57780
|
+
__info__.hash = "7dedb2f";
|
package/dist/o-spreadsheet.d.ts
CHANGED
|
@@ -5200,6 +5200,7 @@ type Getters = {
|
|
|
5200
5200
|
type ArgType = "ANY" | "BOOLEAN" | "NUMBER" | "STRING" | "DATE" | "RANGE" | "RANGE<BOOLEAN>" | "RANGE<NUMBER>" | "RANGE<DATE>" | "RANGE<STRING>" | "RANGE<ANY>" | "META";
|
|
5201
5201
|
interface ArgDefinition {
|
|
5202
5202
|
acceptMatrix?: boolean;
|
|
5203
|
+
acceptMatrixOnly?: boolean;
|
|
5203
5204
|
repeating?: boolean;
|
|
5204
5205
|
optional?: boolean;
|
|
5205
5206
|
description: string;
|