@odoo/o-spreadsheet 17.1.16 → 17.1.18
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 +104 -69
- package/dist/o-spreadsheet.d.ts +1 -0
- package/dist/o-spreadsheet.esm.js +104 -69
- package/dist/o-spreadsheet.iife.js +104 -69
- package/dist/o-spreadsheet.iife.min.js +226 -226
- 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.18
|
|
6
|
+
* @date 2024-06-10T09:34:55.045Z
|
|
7
|
+
* @hash 0e756ce
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
'use strict';
|
|
@@ -295,7 +295,10 @@ function deepCopy(obj) {
|
|
|
295
295
|
* Check if the object is a plain old javascript object.
|
|
296
296
|
*/
|
|
297
297
|
function isPlainObject(obj) {
|
|
298
|
-
return typeof obj === "object" &&
|
|
298
|
+
return (typeof obj === "object" &&
|
|
299
|
+
obj !== null &&
|
|
300
|
+
// obj.constructor can be undefined when there's no prototype (`Object.create(null, {})`)
|
|
301
|
+
(obj?.constructor === Object || obj?.constructor === undefined));
|
|
299
302
|
}
|
|
300
303
|
/**
|
|
301
304
|
* Sanitize the name of a sheet, by eventually removing quotes
|
|
@@ -2607,7 +2610,7 @@ function evaluatePredicate(value, criterion) {
|
|
|
2607
2610
|
return false;
|
|
2608
2611
|
}
|
|
2609
2612
|
if (typeof operand === "number" && operator === "=") {
|
|
2610
|
-
return toString(
|
|
2613
|
+
return value.toString() === operand.toString();
|
|
2611
2614
|
}
|
|
2612
2615
|
if (operator === "<>" || operator === "=") {
|
|
2613
2616
|
let result;
|
|
@@ -2667,14 +2670,13 @@ function visitMatchingRanges(args, cb, locale, isQuery = false) {
|
|
|
2667
2670
|
if (countArg % 2 === 1) {
|
|
2668
2671
|
throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects criteria_range and criterion to be in pairs."));
|
|
2669
2672
|
}
|
|
2670
|
-
const
|
|
2671
|
-
const
|
|
2673
|
+
const firstArg = toMatrix(args[0]);
|
|
2674
|
+
const dimRow = firstArg.length;
|
|
2675
|
+
const dimCol = firstArg[0].length;
|
|
2672
2676
|
let predicates = [];
|
|
2673
2677
|
for (let i = 0; i < countArg - 1; i += 2) {
|
|
2674
|
-
const criteriaRange = args[i];
|
|
2675
|
-
if (
|
|
2676
|
-
criteriaRange.length !== dimRow ||
|
|
2677
|
-
criteriaRange[0].length !== dimCol) {
|
|
2678
|
+
const criteriaRange = toMatrix(args[i]);
|
|
2679
|
+
if (criteriaRange.length !== dimRow || criteriaRange[0].length !== dimCol) {
|
|
2678
2680
|
throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects criteria_range to have the same dimension"));
|
|
2679
2681
|
}
|
|
2680
2682
|
const description = toString(args[i + 1]);
|
|
@@ -2684,7 +2686,7 @@ function visitMatchingRanges(args, cb, locale, isQuery = false) {
|
|
|
2684
2686
|
for (let j = 0; j < dimCol; j++) {
|
|
2685
2687
|
let validatedPredicates = true;
|
|
2686
2688
|
for (let k = 0; k < countArg - 1; k += 2) {
|
|
2687
|
-
const criteriaValue = args[k][i][j].value;
|
|
2689
|
+
const criteriaValue = toMatrix(args[k])[i][j].value;
|
|
2688
2690
|
const criterion = predicates[k / 2];
|
|
2689
2691
|
validatedPredicates = evaluatePredicate(criteriaValue ?? undefined, criterion);
|
|
2690
2692
|
if (!validatedPredicates) {
|
|
@@ -4372,8 +4374,11 @@ function copyRangeWithNewSheetId(sheetIdFrom, sheetIdTo, range) {
|
|
|
4372
4374
|
/**
|
|
4373
4375
|
* Create a range from a xc. If the xc is empty, this function returns undefined.
|
|
4374
4376
|
*/
|
|
4375
|
-
function
|
|
4376
|
-
|
|
4377
|
+
function createValidRange(getters, sheetId, xc) {
|
|
4378
|
+
if (!xc)
|
|
4379
|
+
return;
|
|
4380
|
+
const range = getters.getRangeFromSheetXC(sheetId, xc);
|
|
4381
|
+
return !(range.invalidSheetName || range.invalidXc) ? range : undefined;
|
|
4377
4382
|
}
|
|
4378
4383
|
/**
|
|
4379
4384
|
* Spread multiple colrows zone to one row/col zone and add a many new input range as needed.
|
|
@@ -5304,8 +5309,8 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
|
|
|
5304
5309
|
type = "scorecard";
|
|
5305
5310
|
constructor(definition, sheetId, getters) {
|
|
5306
5311
|
super(definition, sheetId, getters);
|
|
5307
|
-
this.keyValue =
|
|
5308
|
-
this.baseline =
|
|
5312
|
+
this.keyValue = createValidRange(getters, sheetId, definition.keyValue);
|
|
5313
|
+
this.baseline = createValidRange(getters, sheetId, definition.baseline);
|
|
5309
5314
|
this.baselineMode = definition.baselineMode;
|
|
5310
5315
|
this.baselineDescr = definition.baselineDescr;
|
|
5311
5316
|
this.background = definition.background;
|
|
@@ -6839,8 +6844,7 @@ function isCtrlKey(ev) {
|
|
|
6839
6844
|
*/
|
|
6840
6845
|
function useSpreadsheetRect() {
|
|
6841
6846
|
const position = owl.useState({ x: 0, y: 0, width: 0, height: 0 });
|
|
6842
|
-
let spreadsheetElement =
|
|
6843
|
-
updatePosition();
|
|
6847
|
+
let spreadsheetElement = null;
|
|
6844
6848
|
function updatePosition() {
|
|
6845
6849
|
if (!spreadsheetElement) {
|
|
6846
6850
|
spreadsheetElement = document.querySelector(".o-spreadsheet");
|
|
@@ -8604,7 +8608,7 @@ function chartToImage(runtime, figure, type) {
|
|
|
8604
8608
|
if ("chartJsConfig" in runtime) {
|
|
8605
8609
|
runtime.chartJsConfig.plugins = [backgroundColorChartJSPlugin];
|
|
8606
8610
|
// @ts-ignore
|
|
8607
|
-
const chart = new window.Chart(canvas, runtime.chartJsConfig);
|
|
8611
|
+
const chart = new window.Chart(canvas, deepCopy(runtime.chartJsConfig));
|
|
8608
8612
|
const imgContent = chart.toBase64Image();
|
|
8609
8613
|
chart.destroy();
|
|
8610
8614
|
div.remove();
|
|
@@ -8648,7 +8652,7 @@ class BarChart extends AbstractChart {
|
|
|
8648
8652
|
constructor(definition, sheetId, getters) {
|
|
8649
8653
|
super(definition, sheetId, getters);
|
|
8650
8654
|
this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
|
|
8651
|
-
this.labelRange =
|
|
8655
|
+
this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
|
|
8652
8656
|
this.background = definition.background;
|
|
8653
8657
|
this.verticalAxisPosition = definition.verticalAxisPosition;
|
|
8654
8658
|
this.legendPosition = definition.legendPosition;
|
|
@@ -8891,7 +8895,7 @@ class GaugeChart extends AbstractChart {
|
|
|
8891
8895
|
type = "gauge";
|
|
8892
8896
|
constructor(definition, sheetId, getters) {
|
|
8893
8897
|
super(definition, sheetId, getters);
|
|
8894
|
-
this.dataRange =
|
|
8898
|
+
this.dataRange = createValidRange(this.getters, this.sheetId, definition.dataRange);
|
|
8895
8899
|
this.sectionRule = definition.sectionRule;
|
|
8896
8900
|
this.background = definition.background;
|
|
8897
8901
|
}
|
|
@@ -9225,7 +9229,7 @@ class LineChart extends AbstractChart {
|
|
|
9225
9229
|
constructor(definition, sheetId, getters) {
|
|
9226
9230
|
super(definition, sheetId, getters);
|
|
9227
9231
|
this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
|
|
9228
|
-
this.labelRange =
|
|
9232
|
+
this.labelRange = createValidRange(this.getters, sheetId, definition.labelRange);
|
|
9229
9233
|
this.background = definition.background;
|
|
9230
9234
|
this.verticalAxisPosition = definition.verticalAxisPosition;
|
|
9231
9235
|
this.legendPosition = definition.legendPosition;
|
|
@@ -9545,7 +9549,7 @@ class PieChart extends AbstractChart {
|
|
|
9545
9549
|
constructor(definition, sheetId, getters) {
|
|
9546
9550
|
super(definition, sheetId, getters);
|
|
9547
9551
|
this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
|
|
9548
|
-
this.labelRange =
|
|
9552
|
+
this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
|
|
9549
9553
|
this.background = definition.background;
|
|
9550
9554
|
this.legendPosition = definition.legendPosition;
|
|
9551
9555
|
this.aggregated = definition.aggregated;
|
|
@@ -11189,6 +11193,9 @@ function makeArg(str, description) {
|
|
|
11189
11193
|
if (types.some((t) => t.startsWith("RANGE"))) {
|
|
11190
11194
|
result.acceptMatrix = true;
|
|
11191
11195
|
}
|
|
11196
|
+
if (types.every((t) => t.startsWith("RANGE"))) {
|
|
11197
|
+
result.acceptMatrixOnly = true;
|
|
11198
|
+
}
|
|
11192
11199
|
return result;
|
|
11193
11200
|
}
|
|
11194
11201
|
/**
|
|
@@ -11470,11 +11477,16 @@ const CHOOSECOLS = {
|
|
|
11470
11477
|
compute: function (array, ...columns) {
|
|
11471
11478
|
const _array = toMatrix(array);
|
|
11472
11479
|
const _columns = flattenRowFirst(columns, (item) => toInteger(item?.value, this.locale));
|
|
11473
|
-
|
|
11480
|
+
const argOutOfRange = _columns.filter((col) => col === 0 || _array.length < Math.abs(col));
|
|
11481
|
+
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(",")));
|
|
11474
11482
|
const result = Array(_columns.length);
|
|
11475
11483
|
for (let col = 0; col < _columns.length; col++) {
|
|
11476
|
-
|
|
11477
|
-
|
|
11484
|
+
if (_columns[col] > 0) {
|
|
11485
|
+
result[col] = _array[_columns[col] - 1]; // -1 because columns arguments are 1-indexed
|
|
11486
|
+
}
|
|
11487
|
+
else {
|
|
11488
|
+
result[col] = _array[_array.length + _columns[col]];
|
|
11489
|
+
}
|
|
11478
11490
|
}
|
|
11479
11491
|
return result;
|
|
11480
11492
|
},
|
|
@@ -11495,8 +11507,14 @@ const CHOOSEROWS = {
|
|
|
11495
11507
|
const _array = toMatrix(array);
|
|
11496
11508
|
const _rows = flattenRowFirst(rows, (item) => toInteger(item?.value, this.locale));
|
|
11497
11509
|
const _nbColumns = _array.length;
|
|
11498
|
-
|
|
11499
|
-
|
|
11510
|
+
const argOutOfRange = _rows.filter((row) => row === 0 || _array[0].length < Math.abs(row));
|
|
11511
|
+
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(",")));
|
|
11512
|
+
return generateMatrix(_nbColumns, _rows.length, (col, row) => {
|
|
11513
|
+
if (_rows[row] > 0) {
|
|
11514
|
+
return _array[col][_rows[row] - 1]; // -1 because columns arguments are 1-indexed
|
|
11515
|
+
}
|
|
11516
|
+
return _array[col][_array[col].length + _rows[row]];
|
|
11517
|
+
});
|
|
11500
11518
|
},
|
|
11501
11519
|
isExported: true,
|
|
11502
11520
|
};
|
|
@@ -12404,7 +12422,7 @@ const COUNTUNIQUEIFS = {
|
|
|
12404
12422
|
compute: function (range, ...args) {
|
|
12405
12423
|
let uniqueValues = new Set();
|
|
12406
12424
|
visitMatchingRanges(args, (i, j) => {
|
|
12407
|
-
const data = range[i][j];
|
|
12425
|
+
const data = range[i]?.[j];
|
|
12408
12426
|
if (isDefined(data)) {
|
|
12409
12427
|
uniqueValues.add(data.value);
|
|
12410
12428
|
}
|
|
@@ -13034,7 +13052,7 @@ const SUMIF = {
|
|
|
13034
13052
|
}
|
|
13035
13053
|
let sum = 0;
|
|
13036
13054
|
visitMatchingRanges([criteriaRange, criterion], (i, j) => {
|
|
13037
|
-
const value = sumRange[i][j]
|
|
13055
|
+
const value = sumRange[i]?.[j]?.value;
|
|
13038
13056
|
if (typeof value === "number") {
|
|
13039
13057
|
sum += value;
|
|
13040
13058
|
}
|
|
@@ -13059,7 +13077,7 @@ const SUMIFS = {
|
|
|
13059
13077
|
compute: function (sumRange, ...criters) {
|
|
13060
13078
|
let sum = 0;
|
|
13061
13079
|
visitMatchingRanges(criters, (i, j) => {
|
|
13062
|
-
const value = sumRange[i][j]
|
|
13080
|
+
const value = sumRange[i]?.[j]?.value;
|
|
13063
13081
|
if (typeof value === "number") {
|
|
13064
13082
|
sum += value;
|
|
13065
13083
|
}
|
|
@@ -13606,7 +13624,7 @@ const AVERAGEIF = {
|
|
|
13606
13624
|
let count = 0;
|
|
13607
13625
|
let sum = 0;
|
|
13608
13626
|
visitMatchingRanges([criteriaRange, criterion], (i, j) => {
|
|
13609
|
-
const value = _averageRange[i][j]
|
|
13627
|
+
const value = _averageRange[i]?.[j]?.value;
|
|
13610
13628
|
if (typeof value === "number") {
|
|
13611
13629
|
count += 1;
|
|
13612
13630
|
sum += value;
|
|
@@ -13635,7 +13653,7 @@ const AVERAGEIFS = {
|
|
|
13635
13653
|
let count = 0;
|
|
13636
13654
|
let sum = 0;
|
|
13637
13655
|
visitMatchingRanges(args, (i, j) => {
|
|
13638
|
-
const value = _averageRange[i][j]
|
|
13656
|
+
const value = _averageRange[i]?.[j]?.value;
|
|
13639
13657
|
if (typeof value === "number") {
|
|
13640
13658
|
count += 1;
|
|
13641
13659
|
sum += value;
|
|
@@ -13940,7 +13958,7 @@ const MAXIFS = {
|
|
|
13940
13958
|
compute: function (range, ...args) {
|
|
13941
13959
|
let result = -Infinity;
|
|
13942
13960
|
visitMatchingRanges(args, (i, j) => {
|
|
13943
|
-
const value = range[i][j]
|
|
13961
|
+
const value = range[i]?.[j]?.value;
|
|
13944
13962
|
if (typeof value === "number") {
|
|
13945
13963
|
result = result < value ? value : result;
|
|
13946
13964
|
}
|
|
@@ -14023,7 +14041,7 @@ const MINIFS = {
|
|
|
14023
14041
|
compute: function (range, ...args) {
|
|
14024
14042
|
let result = Infinity;
|
|
14025
14043
|
visitMatchingRanges(args, (i, j) => {
|
|
14026
|
-
const value = range[i][j]
|
|
14044
|
+
const value = range[i]?.[j]?.value;
|
|
14027
14045
|
if (typeof value === "number") {
|
|
14028
14046
|
result = result > value ? value : result;
|
|
14029
14047
|
}
|
|
@@ -19800,6 +19818,9 @@ function addInputHandling(descr) {
|
|
|
19800
19818
|
}
|
|
19801
19819
|
args[i] = arg[0][0];
|
|
19802
19820
|
}
|
|
19821
|
+
if (!isMatrix(arg) && argDefinition.acceptMatrixOnly) {
|
|
19822
|
+
throw new BadExpressionError(_t("Function [[FUNCTION_NAME]] expects the parameter '%s' to be reference to a cell or range.", (i + 1).toString()));
|
|
19823
|
+
}
|
|
19803
19824
|
}
|
|
19804
19825
|
return descr.compute.apply(this, args);
|
|
19805
19826
|
}
|
|
@@ -22152,7 +22173,7 @@ class LineBarPieConfigPanel extends owl.Component {
|
|
|
22152
22173
|
}
|
|
22153
22174
|
const getters = this.env.model.getters;
|
|
22154
22175
|
const sheetId = getters.getActiveSheetId();
|
|
22155
|
-
const labelRange =
|
|
22176
|
+
const labelRange = createValidRange(getters, sheetId, this.labelRange);
|
|
22156
22177
|
const dataSets = createDataSets(getters, this.dataSeriesRanges, sheetId, this.props.definition.dataSetsHaveTitle);
|
|
22157
22178
|
if (dataSets.length) {
|
|
22158
22179
|
return dataSets[0].dataRange.zone.top + 1;
|
|
@@ -26275,14 +26296,14 @@ class FigureComponent extends owl.Component {
|
|
|
26275
26296
|
}
|
|
26276
26297
|
onKeyDown(ev) {
|
|
26277
26298
|
const figure = this.props.figure;
|
|
26278
|
-
|
|
26299
|
+
const keyDownShortcut = keyboardEventToShortcutString(ev);
|
|
26300
|
+
switch (keyDownShortcut) {
|
|
26279
26301
|
case "Delete":
|
|
26280
26302
|
this.env.model.dispatch("DELETE_FIGURE", {
|
|
26281
26303
|
sheetId: this.env.model.getters.getActiveSheetId(),
|
|
26282
26304
|
id: figure.id,
|
|
26283
26305
|
});
|
|
26284
26306
|
this.props.onFigureDeleted();
|
|
26285
|
-
ev.stopPropagation();
|
|
26286
26307
|
ev.preventDefault();
|
|
26287
26308
|
ev.stopPropagation();
|
|
26288
26309
|
break;
|
|
@@ -26303,7 +26324,22 @@ class FigureComponent extends owl.Component {
|
|
|
26303
26324
|
x: figure.x + delta[0],
|
|
26304
26325
|
y: figure.y + delta[1],
|
|
26305
26326
|
});
|
|
26327
|
+
ev.preventDefault();
|
|
26306
26328
|
ev.stopPropagation();
|
|
26329
|
+
break;
|
|
26330
|
+
case "Ctrl+A":
|
|
26331
|
+
// Maybe in the future we will implement a way to select all figures
|
|
26332
|
+
ev.preventDefault();
|
|
26333
|
+
ev.stopPropagation();
|
|
26334
|
+
break;
|
|
26335
|
+
case "Ctrl+Y":
|
|
26336
|
+
case "Ctrl+Z":
|
|
26337
|
+
if (keyDownShortcut === "Ctrl+Y") {
|
|
26338
|
+
this.env.model.dispatch("REQUEST_REDO");
|
|
26339
|
+
}
|
|
26340
|
+
else if (keyDownShortcut === "Ctrl+Z") {
|
|
26341
|
+
this.env.model.dispatch("REQUEST_UNDO");
|
|
26342
|
+
}
|
|
26307
26343
|
ev.preventDefault();
|
|
26308
26344
|
ev.stopPropagation();
|
|
26309
26345
|
break;
|
|
@@ -27341,8 +27377,15 @@ class Composer extends owl.Component {
|
|
|
27341
27377
|
}
|
|
27342
27378
|
onPaste(ev) {
|
|
27343
27379
|
if (this.env.model.getters.getEditionMode() !== "inactive") {
|
|
27380
|
+
// let the browser clipboard work
|
|
27344
27381
|
ev.stopPropagation();
|
|
27345
27382
|
}
|
|
27383
|
+
else {
|
|
27384
|
+
// the user meant to paste in the sheet, not open the composer with the pasted content
|
|
27385
|
+
// While we're not editing, we still have the focus and should therefore prevent
|
|
27386
|
+
// the native "paste" to occur.
|
|
27387
|
+
ev.preventDefault();
|
|
27388
|
+
}
|
|
27346
27389
|
}
|
|
27347
27390
|
/*
|
|
27348
27391
|
* Triggered automatically by the content-editable between the keydown and key up
|
|
@@ -27351,10 +27394,6 @@ class Composer extends owl.Component {
|
|
|
27351
27394
|
if (!this.shouldProcessInputEvents) {
|
|
27352
27395
|
return;
|
|
27353
27396
|
}
|
|
27354
|
-
if (ev.inputType === "insertFromPaste" &&
|
|
27355
|
-
this.env.model.getters.getEditionMode() === "inactive") {
|
|
27356
|
-
return;
|
|
27357
|
-
}
|
|
27358
27397
|
ev.stopPropagation();
|
|
27359
27398
|
let content;
|
|
27360
27399
|
if (this.env.model.getters.getEditionMode() === "inactive") {
|
|
@@ -27795,10 +27834,7 @@ class GridComposer extends owl.Component {
|
|
|
27795
27834
|
}
|
|
27796
27835
|
get containerStyle() {
|
|
27797
27836
|
if (this.env.model.getters.getEditionMode() === "inactive" || !this.rect) {
|
|
27798
|
-
return `
|
|
27799
|
-
position: absolute;
|
|
27800
|
-
z-index: -1000;
|
|
27801
|
-
`;
|
|
27837
|
+
return `z-index: -1000;`;
|
|
27802
27838
|
}
|
|
27803
27839
|
const isFormula = this.env.model.getters.getCurrentContent().startsWith("=");
|
|
27804
27840
|
const cell = this.env.model.getters.getActiveCell();
|
|
@@ -35764,12 +35800,6 @@ function compileTokens(tokens) {
|
|
|
35764
35800
|
// detect when an argument need to be evaluated as a meta argument
|
|
35765
35801
|
const isMeta = argTypes.includes("META");
|
|
35766
35802
|
const hasRange = argTypes.some((t) => isRangeType(t));
|
|
35767
|
-
const isRangeOnly = argTypes.every((t) => isRangeType(t));
|
|
35768
|
-
if (isRangeOnly) {
|
|
35769
|
-
if (!isRangeInput(currentArg)) {
|
|
35770
|
-
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()));
|
|
35771
|
-
}
|
|
35772
|
-
}
|
|
35773
35803
|
compiledArgs.push(compileAST(currentArg, isMeta, hasRange, {
|
|
35774
35804
|
functionName,
|
|
35775
35805
|
paramIndex: i + 1,
|
|
@@ -35940,16 +35970,6 @@ function assertEnoughArgs(ast) {
|
|
|
35940
35970
|
function isRangeType(type) {
|
|
35941
35971
|
return type.startsWith("RANGE");
|
|
35942
35972
|
}
|
|
35943
|
-
function isRangeInput(arg) {
|
|
35944
|
-
if (arg.type === "REFERENCE") {
|
|
35945
|
-
return true;
|
|
35946
|
-
}
|
|
35947
|
-
if (arg.type === "FUNCALL") {
|
|
35948
|
-
const fnDef = functions$1[arg.value.toUpperCase()];
|
|
35949
|
-
return fnDef && isRangeType(fnDef.returns[0]);
|
|
35950
|
-
}
|
|
35951
|
-
return false;
|
|
35952
|
-
}
|
|
35953
35973
|
|
|
35954
35974
|
/**
|
|
35955
35975
|
* Add the following information on tokens:
|
|
@@ -39062,6 +39082,9 @@ class RangeAdapter {
|
|
|
39062
39082
|
if (range.invalidXc) {
|
|
39063
39083
|
return range.invalidXc;
|
|
39064
39084
|
}
|
|
39085
|
+
if (!this.getters.tryGetSheet(range.sheetId)) {
|
|
39086
|
+
return CellErrorType.InvalidReference;
|
|
39087
|
+
}
|
|
39065
39088
|
if (range.zone.bottom - range.zone.top < 0 || range.zone.right - range.zone.left < 0) {
|
|
39066
39089
|
return CellErrorType.InvalidReference;
|
|
39067
39090
|
}
|
|
@@ -42509,16 +42532,22 @@ class EvaluationPlugin extends UIPlugin {
|
|
|
42509
42532
|
let newContent = undefined;
|
|
42510
42533
|
let newFormat = undefined;
|
|
42511
42534
|
let isExported = true;
|
|
42535
|
+
const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
|
|
42512
42536
|
const formulaCell = this.getCorrespondingFormulaCell(position);
|
|
42513
42537
|
if (formulaCell) {
|
|
42514
42538
|
isExported = isExportableToExcel(formulaCell.compiledFormula.tokens);
|
|
42515
42539
|
isFormula = isExported;
|
|
42516
42540
|
if (!isExported) {
|
|
42517
|
-
|
|
42518
|
-
|
|
42541
|
+
// If the cell contains a non-exported formula and that is evaluates to
|
|
42542
|
+
// nothing* ,we don't export it.
|
|
42543
|
+
// * non-falsy value are relevant and so are 0 and FALSE, which only leaves
|
|
42544
|
+
// the empty string.
|
|
42545
|
+
if (value !== "") {
|
|
42546
|
+
newContent = value.toString();
|
|
42547
|
+
newFormat = evaluatedCell.format;
|
|
42548
|
+
}
|
|
42519
42549
|
}
|
|
42520
42550
|
}
|
|
42521
|
-
const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
|
|
42522
42551
|
const exportedCellData = exportedSheetData.cells[xc] || {};
|
|
42523
42552
|
const format = newFormat
|
|
42524
42553
|
? getItemId(newFormat, data.formats)
|
|
@@ -52015,9 +52044,11 @@ class BottomBarSheet extends owl.Component {
|
|
|
52015
52044
|
if (ev.key === "Enter") {
|
|
52016
52045
|
ev.preventDefault();
|
|
52017
52046
|
this.stopEdition();
|
|
52047
|
+
this.env.focusableElement.focus();
|
|
52018
52048
|
}
|
|
52019
52049
|
if (ev.key === "Escape") {
|
|
52020
52050
|
this.cancelEdition();
|
|
52051
|
+
this.env.focusableElement.focus();
|
|
52021
52052
|
}
|
|
52022
52053
|
}
|
|
52023
52054
|
onClickSheetName(ev) {
|
|
@@ -56712,7 +56743,11 @@ function addRows(construct, data, sheet) {
|
|
|
56712
56743
|
let cellNode = escapeXml ``;
|
|
56713
56744
|
// Either formula or static value inside the cell
|
|
56714
56745
|
if (cell.isFormula) {
|
|
56715
|
-
|
|
56746
|
+
const res = addFormula(cell);
|
|
56747
|
+
if (!res) {
|
|
56748
|
+
continue;
|
|
56749
|
+
}
|
|
56750
|
+
({ attrs: additionalAttrs, node: cellNode } = res);
|
|
56716
56751
|
}
|
|
56717
56752
|
else if (cell.content && isMarkdownLink(cell.content)) {
|
|
56718
56753
|
const { label } = parseMarkdownLink(cell.content);
|
|
@@ -57742,6 +57777,6 @@ exports.setTranslationMethod = setTranslationMethod;
|
|
|
57742
57777
|
exports.tokenize = tokenize;
|
|
57743
57778
|
|
|
57744
57779
|
|
|
57745
|
-
__info__.version = "17.1.
|
|
57746
|
-
__info__.date = "2024-
|
|
57747
|
-
__info__.hash = "
|
|
57780
|
+
__info__.version = "17.1.18";
|
|
57781
|
+
__info__.date = "2024-06-10T09:34:55.045Z";
|
|
57782
|
+
__info__.hash = "0e756ce";
|
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;
|