@odoo/o-spreadsheet 17.1.16 → 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 +90 -57
- package/dist/o-spreadsheet.d.ts +1 -0
- package/dist/o-spreadsheet.esm.js +90 -57
- package/dist/o-spreadsheet.iife.js +90 -57
- package/dist/o-spreadsheet.iife.min.js +100 -100
- 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
|
(function (exports, owl) {
|
|
@@ -2606,7 +2606,7 @@
|
|
|
2606
2606
|
return false;
|
|
2607
2607
|
}
|
|
2608
2608
|
if (typeof operand === "number" && operator === "=") {
|
|
2609
|
-
return toString(
|
|
2609
|
+
return value.toString() === operand.toString();
|
|
2610
2610
|
}
|
|
2611
2611
|
if (operator === "<>" || operator === "=") {
|
|
2612
2612
|
let result;
|
|
@@ -2666,14 +2666,13 @@
|
|
|
2666
2666
|
if (countArg % 2 === 1) {
|
|
2667
2667
|
throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects criteria_range and criterion to be in pairs."));
|
|
2668
2668
|
}
|
|
2669
|
-
const
|
|
2670
|
-
const
|
|
2669
|
+
const firstArg = toMatrix(args[0]);
|
|
2670
|
+
const dimRow = firstArg.length;
|
|
2671
|
+
const dimCol = firstArg[0].length;
|
|
2671
2672
|
let predicates = [];
|
|
2672
2673
|
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) {
|
|
2674
|
+
const criteriaRange = toMatrix(args[i]);
|
|
2675
|
+
if (criteriaRange.length !== dimRow || criteriaRange[0].length !== dimCol) {
|
|
2677
2676
|
throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects criteria_range to have the same dimension"));
|
|
2678
2677
|
}
|
|
2679
2678
|
const description = toString(args[i + 1]);
|
|
@@ -2683,7 +2682,7 @@
|
|
|
2683
2682
|
for (let j = 0; j < dimCol; j++) {
|
|
2684
2683
|
let validatedPredicates = true;
|
|
2685
2684
|
for (let k = 0; k < countArg - 1; k += 2) {
|
|
2686
|
-
const criteriaValue = args[k][i][j].value;
|
|
2685
|
+
const criteriaValue = toMatrix(args[k])[i][j].value;
|
|
2687
2686
|
const criterion = predicates[k / 2];
|
|
2688
2687
|
validatedPredicates = evaluatePredicate(criteriaValue ?? undefined, criterion);
|
|
2689
2688
|
if (!validatedPredicates) {
|
|
@@ -4371,8 +4370,11 @@
|
|
|
4371
4370
|
/**
|
|
4372
4371
|
* Create a range from a xc. If the xc is empty, this function returns undefined.
|
|
4373
4372
|
*/
|
|
4374
|
-
function
|
|
4375
|
-
|
|
4373
|
+
function createValidRange(getters, sheetId, xc) {
|
|
4374
|
+
if (!xc)
|
|
4375
|
+
return;
|
|
4376
|
+
const range = getters.getRangeFromSheetXC(sheetId, xc);
|
|
4377
|
+
return !(range.invalidSheetName || range.invalidXc) ? range : undefined;
|
|
4376
4378
|
}
|
|
4377
4379
|
/**
|
|
4378
4380
|
* Spread multiple colrows zone to one row/col zone and add a many new input range as needed.
|
|
@@ -5303,8 +5305,8 @@
|
|
|
5303
5305
|
type = "scorecard";
|
|
5304
5306
|
constructor(definition, sheetId, getters) {
|
|
5305
5307
|
super(definition, sheetId, getters);
|
|
5306
|
-
this.keyValue =
|
|
5307
|
-
this.baseline =
|
|
5308
|
+
this.keyValue = createValidRange(getters, sheetId, definition.keyValue);
|
|
5309
|
+
this.baseline = createValidRange(getters, sheetId, definition.baseline);
|
|
5308
5310
|
this.baselineMode = definition.baselineMode;
|
|
5309
5311
|
this.baselineDescr = definition.baselineDescr;
|
|
5310
5312
|
this.background = definition.background;
|
|
@@ -8647,7 +8649,7 @@
|
|
|
8647
8649
|
constructor(definition, sheetId, getters) {
|
|
8648
8650
|
super(definition, sheetId, getters);
|
|
8649
8651
|
this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
|
|
8650
|
-
this.labelRange =
|
|
8652
|
+
this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
|
|
8651
8653
|
this.background = definition.background;
|
|
8652
8654
|
this.verticalAxisPosition = definition.verticalAxisPosition;
|
|
8653
8655
|
this.legendPosition = definition.legendPosition;
|
|
@@ -8890,7 +8892,7 @@
|
|
|
8890
8892
|
type = "gauge";
|
|
8891
8893
|
constructor(definition, sheetId, getters) {
|
|
8892
8894
|
super(definition, sheetId, getters);
|
|
8893
|
-
this.dataRange =
|
|
8895
|
+
this.dataRange = createValidRange(this.getters, this.sheetId, definition.dataRange);
|
|
8894
8896
|
this.sectionRule = definition.sectionRule;
|
|
8895
8897
|
this.background = definition.background;
|
|
8896
8898
|
}
|
|
@@ -9224,7 +9226,7 @@
|
|
|
9224
9226
|
constructor(definition, sheetId, getters) {
|
|
9225
9227
|
super(definition, sheetId, getters);
|
|
9226
9228
|
this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
|
|
9227
|
-
this.labelRange =
|
|
9229
|
+
this.labelRange = createValidRange(this.getters, sheetId, definition.labelRange);
|
|
9228
9230
|
this.background = definition.background;
|
|
9229
9231
|
this.verticalAxisPosition = definition.verticalAxisPosition;
|
|
9230
9232
|
this.legendPosition = definition.legendPosition;
|
|
@@ -9544,7 +9546,7 @@
|
|
|
9544
9546
|
constructor(definition, sheetId, getters) {
|
|
9545
9547
|
super(definition, sheetId, getters);
|
|
9546
9548
|
this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
|
|
9547
|
-
this.labelRange =
|
|
9549
|
+
this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
|
|
9548
9550
|
this.background = definition.background;
|
|
9549
9551
|
this.legendPosition = definition.legendPosition;
|
|
9550
9552
|
this.aggregated = definition.aggregated;
|
|
@@ -11188,6 +11190,9 @@
|
|
|
11188
11190
|
if (types.some((t) => t.startsWith("RANGE"))) {
|
|
11189
11191
|
result.acceptMatrix = true;
|
|
11190
11192
|
}
|
|
11193
|
+
if (types.every((t) => t.startsWith("RANGE"))) {
|
|
11194
|
+
result.acceptMatrixOnly = true;
|
|
11195
|
+
}
|
|
11191
11196
|
return result;
|
|
11192
11197
|
}
|
|
11193
11198
|
/**
|
|
@@ -11469,11 +11474,16 @@
|
|
|
11469
11474
|
compute: function (array, ...columns) {
|
|
11470
11475
|
const _array = toMatrix(array);
|
|
11471
11476
|
const _columns = flattenRowFirst(columns, (item) => toInteger(item?.value, this.locale));
|
|
11472
|
-
|
|
11477
|
+
const argOutOfRange = _columns.filter((col) => col === 0 || _array.length < Math.abs(col));
|
|
11478
|
+
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
11479
|
const result = Array(_columns.length);
|
|
11474
11480
|
for (let col = 0; col < _columns.length; col++) {
|
|
11475
|
-
|
|
11476
|
-
|
|
11481
|
+
if (_columns[col] > 0) {
|
|
11482
|
+
result[col] = _array[_columns[col] - 1]; // -1 because columns arguments are 1-indexed
|
|
11483
|
+
}
|
|
11484
|
+
else {
|
|
11485
|
+
result[col] = _array[_array.length + _columns[col]];
|
|
11486
|
+
}
|
|
11477
11487
|
}
|
|
11478
11488
|
return result;
|
|
11479
11489
|
},
|
|
@@ -11494,8 +11504,14 @@
|
|
|
11494
11504
|
const _array = toMatrix(array);
|
|
11495
11505
|
const _rows = flattenRowFirst(rows, (item) => toInteger(item?.value, this.locale));
|
|
11496
11506
|
const _nbColumns = _array.length;
|
|
11497
|
-
|
|
11498
|
-
|
|
11507
|
+
const argOutOfRange = _rows.filter((row) => row === 0 || _array[0].length < Math.abs(row));
|
|
11508
|
+
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(",")));
|
|
11509
|
+
return generateMatrix(_nbColumns, _rows.length, (col, row) => {
|
|
11510
|
+
if (_rows[row] > 0) {
|
|
11511
|
+
return _array[col][_rows[row] - 1]; // -1 because columns arguments are 1-indexed
|
|
11512
|
+
}
|
|
11513
|
+
return _array[col][_array[col].length + _rows[row]];
|
|
11514
|
+
});
|
|
11499
11515
|
},
|
|
11500
11516
|
isExported: true,
|
|
11501
11517
|
};
|
|
@@ -12403,7 +12419,7 @@
|
|
|
12403
12419
|
compute: function (range, ...args) {
|
|
12404
12420
|
let uniqueValues = new Set();
|
|
12405
12421
|
visitMatchingRanges(args, (i, j) => {
|
|
12406
|
-
const data = range[i][j];
|
|
12422
|
+
const data = range[i]?.[j];
|
|
12407
12423
|
if (isDefined(data)) {
|
|
12408
12424
|
uniqueValues.add(data.value);
|
|
12409
12425
|
}
|
|
@@ -13033,7 +13049,7 @@
|
|
|
13033
13049
|
}
|
|
13034
13050
|
let sum = 0;
|
|
13035
13051
|
visitMatchingRanges([criteriaRange, criterion], (i, j) => {
|
|
13036
|
-
const value = sumRange[i][j]
|
|
13052
|
+
const value = sumRange[i]?.[j]?.value;
|
|
13037
13053
|
if (typeof value === "number") {
|
|
13038
13054
|
sum += value;
|
|
13039
13055
|
}
|
|
@@ -13058,7 +13074,7 @@
|
|
|
13058
13074
|
compute: function (sumRange, ...criters) {
|
|
13059
13075
|
let sum = 0;
|
|
13060
13076
|
visitMatchingRanges(criters, (i, j) => {
|
|
13061
|
-
const value = sumRange[i][j]
|
|
13077
|
+
const value = sumRange[i]?.[j]?.value;
|
|
13062
13078
|
if (typeof value === "number") {
|
|
13063
13079
|
sum += value;
|
|
13064
13080
|
}
|
|
@@ -13605,7 +13621,7 @@
|
|
|
13605
13621
|
let count = 0;
|
|
13606
13622
|
let sum = 0;
|
|
13607
13623
|
visitMatchingRanges([criteriaRange, criterion], (i, j) => {
|
|
13608
|
-
const value = _averageRange[i][j]
|
|
13624
|
+
const value = _averageRange[i]?.[j]?.value;
|
|
13609
13625
|
if (typeof value === "number") {
|
|
13610
13626
|
count += 1;
|
|
13611
13627
|
sum += value;
|
|
@@ -13634,7 +13650,7 @@
|
|
|
13634
13650
|
let count = 0;
|
|
13635
13651
|
let sum = 0;
|
|
13636
13652
|
visitMatchingRanges(args, (i, j) => {
|
|
13637
|
-
const value = _averageRange[i][j]
|
|
13653
|
+
const value = _averageRange[i]?.[j]?.value;
|
|
13638
13654
|
if (typeof value === "number") {
|
|
13639
13655
|
count += 1;
|
|
13640
13656
|
sum += value;
|
|
@@ -13939,7 +13955,7 @@
|
|
|
13939
13955
|
compute: function (range, ...args) {
|
|
13940
13956
|
let result = -Infinity;
|
|
13941
13957
|
visitMatchingRanges(args, (i, j) => {
|
|
13942
|
-
const value = range[i][j]
|
|
13958
|
+
const value = range[i]?.[j]?.value;
|
|
13943
13959
|
if (typeof value === "number") {
|
|
13944
13960
|
result = result < value ? value : result;
|
|
13945
13961
|
}
|
|
@@ -14022,7 +14038,7 @@
|
|
|
14022
14038
|
compute: function (range, ...args) {
|
|
14023
14039
|
let result = Infinity;
|
|
14024
14040
|
visitMatchingRanges(args, (i, j) => {
|
|
14025
|
-
const value = range[i][j]
|
|
14041
|
+
const value = range[i]?.[j]?.value;
|
|
14026
14042
|
if (typeof value === "number") {
|
|
14027
14043
|
result = result > value ? value : result;
|
|
14028
14044
|
}
|
|
@@ -19799,6 +19815,9 @@
|
|
|
19799
19815
|
}
|
|
19800
19816
|
args[i] = arg[0][0];
|
|
19801
19817
|
}
|
|
19818
|
+
if (!isMatrix(arg) && argDefinition.acceptMatrixOnly) {
|
|
19819
|
+
throw new BadExpressionError(_t("Function [[FUNCTION_NAME]] expects the parameter '%s' to be reference to a cell or range.", (i + 1).toString()));
|
|
19820
|
+
}
|
|
19802
19821
|
}
|
|
19803
19822
|
return descr.compute.apply(this, args);
|
|
19804
19823
|
}
|
|
@@ -22151,7 +22170,7 @@
|
|
|
22151
22170
|
}
|
|
22152
22171
|
const getters = this.env.model.getters;
|
|
22153
22172
|
const sheetId = getters.getActiveSheetId();
|
|
22154
|
-
const labelRange =
|
|
22173
|
+
const labelRange = createValidRange(getters, sheetId, this.labelRange);
|
|
22155
22174
|
const dataSets = createDataSets(getters, this.dataSeriesRanges, sheetId, this.props.definition.dataSetsHaveTitle);
|
|
22156
22175
|
if (dataSets.length) {
|
|
22157
22176
|
return dataSets[0].dataRange.zone.top + 1;
|
|
@@ -26274,14 +26293,14 @@
|
|
|
26274
26293
|
}
|
|
26275
26294
|
onKeyDown(ev) {
|
|
26276
26295
|
const figure = this.props.figure;
|
|
26277
|
-
|
|
26296
|
+
const keyDownShortcut = keyboardEventToShortcutString(ev);
|
|
26297
|
+
switch (keyDownShortcut) {
|
|
26278
26298
|
case "Delete":
|
|
26279
26299
|
this.env.model.dispatch("DELETE_FIGURE", {
|
|
26280
26300
|
sheetId: this.env.model.getters.getActiveSheetId(),
|
|
26281
26301
|
id: figure.id,
|
|
26282
26302
|
});
|
|
26283
26303
|
this.props.onFigureDeleted();
|
|
26284
|
-
ev.stopPropagation();
|
|
26285
26304
|
ev.preventDefault();
|
|
26286
26305
|
ev.stopPropagation();
|
|
26287
26306
|
break;
|
|
@@ -26302,7 +26321,22 @@
|
|
|
26302
26321
|
x: figure.x + delta[0],
|
|
26303
26322
|
y: figure.y + delta[1],
|
|
26304
26323
|
});
|
|
26324
|
+
ev.preventDefault();
|
|
26325
|
+
ev.stopPropagation();
|
|
26326
|
+
break;
|
|
26327
|
+
case "Ctrl+A":
|
|
26328
|
+
// Maybe in the future we will implement a way to select all figures
|
|
26329
|
+
ev.preventDefault();
|
|
26305
26330
|
ev.stopPropagation();
|
|
26331
|
+
break;
|
|
26332
|
+
case "Ctrl+Y":
|
|
26333
|
+
case "Ctrl+Z":
|
|
26334
|
+
if (keyDownShortcut === "Ctrl+Y") {
|
|
26335
|
+
this.env.model.dispatch("REQUEST_REDO");
|
|
26336
|
+
}
|
|
26337
|
+
else if (keyDownShortcut === "Ctrl+Z") {
|
|
26338
|
+
this.env.model.dispatch("REQUEST_UNDO");
|
|
26339
|
+
}
|
|
26306
26340
|
ev.preventDefault();
|
|
26307
26341
|
ev.stopPropagation();
|
|
26308
26342
|
break;
|
|
@@ -35763,12 +35797,6 @@
|
|
|
35763
35797
|
// detect when an argument need to be evaluated as a meta argument
|
|
35764
35798
|
const isMeta = argTypes.includes("META");
|
|
35765
35799
|
const hasRange = argTypes.some((t) => isRangeType(t));
|
|
35766
|
-
const isRangeOnly = argTypes.every((t) => isRangeType(t));
|
|
35767
|
-
if (isRangeOnly) {
|
|
35768
|
-
if (!isRangeInput(currentArg)) {
|
|
35769
|
-
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()));
|
|
35770
|
-
}
|
|
35771
|
-
}
|
|
35772
35800
|
compiledArgs.push(compileAST(currentArg, isMeta, hasRange, {
|
|
35773
35801
|
functionName,
|
|
35774
35802
|
paramIndex: i + 1,
|
|
@@ -35939,16 +35967,6 @@
|
|
|
35939
35967
|
function isRangeType(type) {
|
|
35940
35968
|
return type.startsWith("RANGE");
|
|
35941
35969
|
}
|
|
35942
|
-
function isRangeInput(arg) {
|
|
35943
|
-
if (arg.type === "REFERENCE") {
|
|
35944
|
-
return true;
|
|
35945
|
-
}
|
|
35946
|
-
if (arg.type === "FUNCALL") {
|
|
35947
|
-
const fnDef = functions$1[arg.value.toUpperCase()];
|
|
35948
|
-
return fnDef && isRangeType(fnDef.returns[0]);
|
|
35949
|
-
}
|
|
35950
|
-
return false;
|
|
35951
|
-
}
|
|
35952
35970
|
|
|
35953
35971
|
/**
|
|
35954
35972
|
* Add the following information on tokens:
|
|
@@ -39061,6 +39079,9 @@
|
|
|
39061
39079
|
if (range.invalidXc) {
|
|
39062
39080
|
return range.invalidXc;
|
|
39063
39081
|
}
|
|
39082
|
+
if (!this.getters.tryGetSheet(range.sheetId)) {
|
|
39083
|
+
return CellErrorType.InvalidReference;
|
|
39084
|
+
}
|
|
39064
39085
|
if (range.zone.bottom - range.zone.top < 0 || range.zone.right - range.zone.left < 0) {
|
|
39065
39086
|
return CellErrorType.InvalidReference;
|
|
39066
39087
|
}
|
|
@@ -42508,16 +42529,22 @@
|
|
|
42508
42529
|
let newContent = undefined;
|
|
42509
42530
|
let newFormat = undefined;
|
|
42510
42531
|
let isExported = true;
|
|
42532
|
+
const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
|
|
42511
42533
|
const formulaCell = this.getCorrespondingFormulaCell(position);
|
|
42512
42534
|
if (formulaCell) {
|
|
42513
42535
|
isExported = isExportableToExcel(formulaCell.compiledFormula.tokens);
|
|
42514
42536
|
isFormula = isExported;
|
|
42515
42537
|
if (!isExported) {
|
|
42516
|
-
|
|
42517
|
-
|
|
42538
|
+
// If the cell contains a non-exported formula and that is evaluates to
|
|
42539
|
+
// nothing* ,we don't export it.
|
|
42540
|
+
// * non-falsy value are relevant and so are 0 and FALSE, which only leaves
|
|
42541
|
+
// the empty string.
|
|
42542
|
+
if (value !== "") {
|
|
42543
|
+
newContent = value.toString();
|
|
42544
|
+
newFormat = evaluatedCell.format;
|
|
42545
|
+
}
|
|
42518
42546
|
}
|
|
42519
42547
|
}
|
|
42520
|
-
const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
|
|
42521
42548
|
const exportedCellData = exportedSheetData.cells[xc] || {};
|
|
42522
42549
|
const format = newFormat
|
|
42523
42550
|
? getItemId(newFormat, data.formats)
|
|
@@ -52014,9 +52041,11 @@
|
|
|
52014
52041
|
if (ev.key === "Enter") {
|
|
52015
52042
|
ev.preventDefault();
|
|
52016
52043
|
this.stopEdition();
|
|
52044
|
+
this.env.focusableElement.focus();
|
|
52017
52045
|
}
|
|
52018
52046
|
if (ev.key === "Escape") {
|
|
52019
52047
|
this.cancelEdition();
|
|
52048
|
+
this.env.focusableElement.focus();
|
|
52020
52049
|
}
|
|
52021
52050
|
}
|
|
52022
52051
|
onClickSheetName(ev) {
|
|
@@ -56711,7 +56740,11 @@
|
|
|
56711
56740
|
let cellNode = escapeXml ``;
|
|
56712
56741
|
// Either formula or static value inside the cell
|
|
56713
56742
|
if (cell.isFormula) {
|
|
56714
|
-
|
|
56743
|
+
const res = addFormula(cell);
|
|
56744
|
+
if (!res) {
|
|
56745
|
+
continue;
|
|
56746
|
+
}
|
|
56747
|
+
({ attrs: additionalAttrs, node: cellNode } = res);
|
|
56715
56748
|
}
|
|
56716
56749
|
else if (cell.content && isMarkdownLink(cell.content)) {
|
|
56717
56750
|
const { label } = parseMarkdownLink(cell.content);
|
|
@@ -57741,9 +57774,9 @@
|
|
|
57741
57774
|
exports.tokenize = tokenize;
|
|
57742
57775
|
|
|
57743
57776
|
|
|
57744
|
-
__info__.version = "17.1.
|
|
57745
|
-
__info__.date = "2024-
|
|
57746
|
-
__info__.hash = "
|
|
57777
|
+
__info__.version = "17.1.17";
|
|
57778
|
+
__info__.date = "2024-06-03T14:54:06.711Z";
|
|
57779
|
+
__info__.hash = "7dedb2f";
|
|
57747
57780
|
|
|
57748
57781
|
|
|
57749
57782
|
})(this.o_spreadsheet = this.o_spreadsheet || {}, owl);
|