@odoo/o-spreadsheet 18.3.22 → 18.3.24
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 +128 -107
- package/dist/o-spreadsheet.esm.js +128 -107
- package/dist/o-spreadsheet.iife.js +128 -107
- package/dist/o-spreadsheet.iife.min.js +13 -12
- package/dist/o_spreadsheet.xml +4 -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 18.3.
|
|
6
|
-
* @date 2025-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 18.3.24
|
|
6
|
+
* @date 2025-10-16T06:38:12.942Z
|
|
7
|
+
* @hash f13dd1c
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
'use strict';
|
|
@@ -879,9 +879,7 @@ function removeIndexesFromArray(array, indexes) {
|
|
|
879
879
|
return newArray;
|
|
880
880
|
}
|
|
881
881
|
function insertItemsAtIndex(array, items, index) {
|
|
882
|
-
|
|
883
|
-
newArray.splice(index, 0, ...items);
|
|
884
|
-
return newArray;
|
|
882
|
+
return array.slice(0, index).concat(items).concat(array.slice(index));
|
|
885
883
|
}
|
|
886
884
|
function replaceItemAtIndex(array, newItem, index) {
|
|
887
885
|
const newArray = [...array];
|
|
@@ -3945,7 +3943,17 @@ function toNumberMatrix(data, argName) {
|
|
|
3945
3943
|
return toMatrix(data).map((row) => {
|
|
3946
3944
|
return row.map((cell) => {
|
|
3947
3945
|
if (typeof cell.value !== "number") {
|
|
3948
|
-
|
|
3946
|
+
let message = "";
|
|
3947
|
+
if (typeof cell === "object") {
|
|
3948
|
+
message = _t("Function [[FUNCTION_NAME]] expects number values for %s, but got an empty value.", argName);
|
|
3949
|
+
}
|
|
3950
|
+
else if (typeof cell === "string") {
|
|
3951
|
+
message = _t("Function [[FUNCTION_NAME]] expects number values for %s, but got a string.", argName);
|
|
3952
|
+
}
|
|
3953
|
+
else if (typeof cell === "boolean") {
|
|
3954
|
+
message = _t("Function [[FUNCTION_NAME]] expects number values for %s, but got a boolean.", argName);
|
|
3955
|
+
}
|
|
3956
|
+
throw new EvaluationError(message);
|
|
3949
3957
|
}
|
|
3950
3958
|
return cell.value;
|
|
3951
3959
|
});
|
|
@@ -5145,7 +5153,7 @@ function tokensToTextInternalFormat(tokens) {
|
|
|
5145
5153
|
* Replace in place tokens "mm" and "m" that denote minutes in date format with "MM" to avoid confusion with months.
|
|
5146
5154
|
*
|
|
5147
5155
|
* As per OpenXML specification, in date formats if a date token "m" or "mm" is followed by a date token "s" or
|
|
5148
|
-
* preceded by a data token "h", then it's not a month but
|
|
5156
|
+
* preceded by a data token "h", then it's not a month but a minute.
|
|
5149
5157
|
*/
|
|
5150
5158
|
function convertTokensToMinutesInDateFormat(tokens) {
|
|
5151
5159
|
const dateParts = tokens.filter((token) => token.type === "DATE_PART");
|
|
@@ -5188,6 +5196,9 @@ function internalFormatPartToFormat(internalFormat) {
|
|
|
5188
5196
|
case "REPEATED_CHAR":
|
|
5189
5197
|
format += "*" + token.value;
|
|
5190
5198
|
break;
|
|
5199
|
+
case "DATE_PART":
|
|
5200
|
+
format += token.value === "MM" ? "mm" : token.value; // Convert "MM" back to "mm" for minutes
|
|
5201
|
+
break;
|
|
5191
5202
|
default:
|
|
5192
5203
|
format += token.value;
|
|
5193
5204
|
}
|
|
@@ -9127,7 +9138,7 @@ class CellClipboardHandler extends AbstractCellClipboardHandler {
|
|
|
9127
9138
|
pasteCell(origin, target, clipboardOption) {
|
|
9128
9139
|
const { sheetId, col, row } = target;
|
|
9129
9140
|
const targetCell = this.getters.getEvaluatedCell(target);
|
|
9130
|
-
const originFormat = origin?.format
|
|
9141
|
+
const originFormat = origin?.format || origin.evaluatedCell.format;
|
|
9131
9142
|
if (clipboardOption?.pasteOption === "asValue") {
|
|
9132
9143
|
this.dispatch("UPDATE_CELL", {
|
|
9133
9144
|
...target,
|
|
@@ -12833,7 +12844,7 @@ const GROWTH = {
|
|
|
12833
12844
|
],
|
|
12834
12845
|
compute: function (knownDataY, knownDataX = [[]], newDataX = [[]], b = { value: true }) {
|
|
12835
12846
|
assertNonEmptyMatrix(knownDataY, "known_data_y");
|
|
12836
|
-
return expM(predictLinearValues(logM(toNumberMatrix(knownDataY, "
|
|
12847
|
+
return expM(predictLinearValues(logM(toNumberMatrix(knownDataY, "known_data_y")), toNumberMatrix(knownDataX, "known_data_x"), toNumberMatrix(newDataX, "new_data_y"), toBoolean(b)));
|
|
12837
12848
|
},
|
|
12838
12849
|
};
|
|
12839
12850
|
// -----------------------------------------------------------------------------
|
|
@@ -12898,7 +12909,7 @@ const LINEST = {
|
|
|
12898
12909
|
],
|
|
12899
12910
|
compute: function (dataY, dataX = [[]], calculateB = { value: true }, verbose = { value: false }) {
|
|
12900
12911
|
assertNonEmptyMatrix(dataY, "data_y");
|
|
12901
|
-
return fullLinearRegression(toNumberMatrix(dataX, "
|
|
12912
|
+
return fullLinearRegression(toNumberMatrix(dataX, "data_x"), toNumberMatrix(dataY, "data_y"), toBoolean(calculateB), toBoolean(verbose));
|
|
12902
12913
|
},
|
|
12903
12914
|
isExported: true,
|
|
12904
12915
|
};
|
|
@@ -12915,7 +12926,7 @@ const LOGEST = {
|
|
|
12915
12926
|
],
|
|
12916
12927
|
compute: function (dataY, dataX = [[]], calculateB = { value: true }, verbose = { value: false }) {
|
|
12917
12928
|
assertNonEmptyMatrix(dataY, "data_y");
|
|
12918
|
-
const coeffs = fullLinearRegression(toNumberMatrix(dataX, "
|
|
12929
|
+
const coeffs = fullLinearRegression(toNumberMatrix(dataX, "data_x"), logM(toNumberMatrix(dataY, "data_y")), toBoolean(calculateB), toBoolean(verbose));
|
|
12919
12930
|
for (let i = 0; i < coeffs.length; i++) {
|
|
12920
12931
|
coeffs[i][0] = Math.exp(coeffs[i][0]);
|
|
12921
12932
|
}
|
|
@@ -13505,7 +13516,7 @@ const TREND = {
|
|
|
13505
13516
|
],
|
|
13506
13517
|
compute: function (knownDataY, knownDataX = [[]], newDataX = [[]], b = { value: true }) {
|
|
13507
13518
|
assertNonEmptyMatrix(knownDataY, "known_data_y");
|
|
13508
|
-
return predictLinearValues(toNumberMatrix(knownDataY, "
|
|
13519
|
+
return predictLinearValues(toNumberMatrix(knownDataY, "known_data_y"), toNumberMatrix(knownDataX, "known_data_x"), toNumberMatrix(newDataX, "new_data_y"), toBoolean(b));
|
|
13509
13520
|
},
|
|
13510
13521
|
};
|
|
13511
13522
|
// -----------------------------------------------------------------------------
|
|
@@ -21047,6 +21058,10 @@ const chartShowValuesPlugin = {
|
|
|
21047
21058
|
}
|
|
21048
21059
|
const ctx = chart.ctx;
|
|
21049
21060
|
ctx.save();
|
|
21061
|
+
const { left, top, height, width } = chart.chartArea;
|
|
21062
|
+
ctx.beginPath();
|
|
21063
|
+
ctx.rect(left, top, width, height);
|
|
21064
|
+
ctx.clip();
|
|
21050
21065
|
ctx.textAlign = "center";
|
|
21051
21066
|
ctx.textBaseline = "middle";
|
|
21052
21067
|
ctx.miterLimit = 1; // Avoid sharp artifacts on strokeText
|
|
@@ -25175,6 +25190,7 @@ function getChartTimeOptions(labels, labelFormat, locale) {
|
|
|
25175
25190
|
parser: luxonFormat,
|
|
25176
25191
|
displayFormats,
|
|
25177
25192
|
unit: timeUnit ?? false,
|
|
25193
|
+
tooltipFormat: luxonFormat,
|
|
25178
25194
|
};
|
|
25179
25195
|
}
|
|
25180
25196
|
/**
|
|
@@ -26244,6 +26260,7 @@ function getLineChartScales(definition, args) {
|
|
|
26244
26260
|
};
|
|
26245
26261
|
Object.assign(scales.x, axis);
|
|
26246
26262
|
scales.x.ticks.maxTicksLimit = 15;
|
|
26263
|
+
delete scales?.x?.ticks?.callback;
|
|
26247
26264
|
}
|
|
26248
26265
|
else if (axisType === "linear") {
|
|
26249
26266
|
scales.x.type = "linear";
|
|
@@ -30837,6 +30854,74 @@ iconsOnCellRegistry.add("conditional_formatting", (getters, position) => {
|
|
|
30837
30854
|
return undefined;
|
|
30838
30855
|
});
|
|
30839
30856
|
|
|
30857
|
+
/**
|
|
30858
|
+
* Get the relative path between two files
|
|
30859
|
+
*
|
|
30860
|
+
* Eg.:
|
|
30861
|
+
* from "folder1/file1.txt" to "folder2/file2.txt" => "../folder2/file2.txt"
|
|
30862
|
+
*/
|
|
30863
|
+
function getRelativePath(from, to) {
|
|
30864
|
+
const fromPathParts = from.split("/");
|
|
30865
|
+
const toPathParts = to.split("/");
|
|
30866
|
+
let relPath = "";
|
|
30867
|
+
let startIndex = 0;
|
|
30868
|
+
for (let i = 0; i < fromPathParts.length - 1; i++) {
|
|
30869
|
+
if (fromPathParts[i] === toPathParts[i]) {
|
|
30870
|
+
startIndex++;
|
|
30871
|
+
}
|
|
30872
|
+
else {
|
|
30873
|
+
relPath += "../";
|
|
30874
|
+
}
|
|
30875
|
+
}
|
|
30876
|
+
relPath += toPathParts.slice(startIndex).join("/");
|
|
30877
|
+
return relPath;
|
|
30878
|
+
}
|
|
30879
|
+
/**
|
|
30880
|
+
* Convert an array of element into an object where the objects keys were the elements position in the array.
|
|
30881
|
+
* Can give an offset as argument, and all the array indexes will we shifted by this offset in the returned object.
|
|
30882
|
+
*
|
|
30883
|
+
* eg. : ["a", "b"] => {0:"a", 1:"b"}
|
|
30884
|
+
*/
|
|
30885
|
+
function arrayToObject(array, indexOffset = 0) {
|
|
30886
|
+
const obj = {};
|
|
30887
|
+
for (let i = 0; i < array.length; i++) {
|
|
30888
|
+
if (array[i]) {
|
|
30889
|
+
obj[i + indexOffset] = array[i];
|
|
30890
|
+
}
|
|
30891
|
+
}
|
|
30892
|
+
return obj;
|
|
30893
|
+
}
|
|
30894
|
+
/**
|
|
30895
|
+
* In xlsx we can have string with unicode characters with the format _x00fa_.
|
|
30896
|
+
* Replace with characters understandable by JS
|
|
30897
|
+
*/
|
|
30898
|
+
function fixXlsxUnicode(str) {
|
|
30899
|
+
return str.replace(/_x([0-9a-zA-Z]{4})_/g, (match, code) => {
|
|
30900
|
+
return String.fromCharCode(parseInt(code, 16));
|
|
30901
|
+
});
|
|
30902
|
+
}
|
|
30903
|
+
/** Get a header in the SheetData. Create the header if it doesn't exist in the SheetData */
|
|
30904
|
+
function getSheetDataHeader(sheetData, dimension, index) {
|
|
30905
|
+
if (dimension === "COL") {
|
|
30906
|
+
if (!sheetData.cols[index]) {
|
|
30907
|
+
sheetData.cols[index] = {};
|
|
30908
|
+
}
|
|
30909
|
+
return sheetData.cols[index];
|
|
30910
|
+
}
|
|
30911
|
+
if (!sheetData.rows[index]) {
|
|
30912
|
+
sheetData.rows[index] = {};
|
|
30913
|
+
}
|
|
30914
|
+
return sheetData.rows[index];
|
|
30915
|
+
}
|
|
30916
|
+
/** Prefix the string by "=" if the string looks like a formula */
|
|
30917
|
+
function prefixFormulaWithEqual(formula) {
|
|
30918
|
+
if (formula[0] === "=") {
|
|
30919
|
+
return formula;
|
|
30920
|
+
}
|
|
30921
|
+
const tokens = tokenize(formula);
|
|
30922
|
+
return tokens.length === 1 && tokens[0].type !== "REFERENCE" ? formula : "=" + formula;
|
|
30923
|
+
}
|
|
30924
|
+
|
|
30840
30925
|
/**
|
|
30841
30926
|
* Map of the different types of conversions warnings and their name in error messages
|
|
30842
30927
|
*/
|
|
@@ -31344,66 +31429,6 @@ function hexaToInt(hex) {
|
|
|
31344
31429
|
*/
|
|
31345
31430
|
const DEFAULT_SYSTEM_COLOR = "FF000000";
|
|
31346
31431
|
|
|
31347
|
-
/**
|
|
31348
|
-
* Get the relative path between two files
|
|
31349
|
-
*
|
|
31350
|
-
* Eg.:
|
|
31351
|
-
* from "folder1/file1.txt" to "folder2/file2.txt" => "../folder2/file2.txt"
|
|
31352
|
-
*/
|
|
31353
|
-
function getRelativePath(from, to) {
|
|
31354
|
-
const fromPathParts = from.split("/");
|
|
31355
|
-
const toPathParts = to.split("/");
|
|
31356
|
-
let relPath = "";
|
|
31357
|
-
let startIndex = 0;
|
|
31358
|
-
for (let i = 0; i < fromPathParts.length - 1; i++) {
|
|
31359
|
-
if (fromPathParts[i] === toPathParts[i]) {
|
|
31360
|
-
startIndex++;
|
|
31361
|
-
}
|
|
31362
|
-
else {
|
|
31363
|
-
relPath += "../";
|
|
31364
|
-
}
|
|
31365
|
-
}
|
|
31366
|
-
relPath += toPathParts.slice(startIndex).join("/");
|
|
31367
|
-
return relPath;
|
|
31368
|
-
}
|
|
31369
|
-
/**
|
|
31370
|
-
* Convert an array of element into an object where the objects keys were the elements position in the array.
|
|
31371
|
-
* Can give an offset as argument, and all the array indexes will we shifted by this offset in the returned object.
|
|
31372
|
-
*
|
|
31373
|
-
* eg. : ["a", "b"] => {0:"a", 1:"b"}
|
|
31374
|
-
*/
|
|
31375
|
-
function arrayToObject(array, indexOffset = 0) {
|
|
31376
|
-
const obj = {};
|
|
31377
|
-
for (let i = 0; i < array.length; i++) {
|
|
31378
|
-
if (array[i]) {
|
|
31379
|
-
obj[i + indexOffset] = array[i];
|
|
31380
|
-
}
|
|
31381
|
-
}
|
|
31382
|
-
return obj;
|
|
31383
|
-
}
|
|
31384
|
-
/**
|
|
31385
|
-
* In xlsx we can have string with unicode characters with the format _x00fa_.
|
|
31386
|
-
* Replace with characters understandable by JS
|
|
31387
|
-
*/
|
|
31388
|
-
function fixXlsxUnicode(str) {
|
|
31389
|
-
return str.replace(/_x([0-9a-zA-Z]{4})_/g, (match, code) => {
|
|
31390
|
-
return String.fromCharCode(parseInt(code, 16));
|
|
31391
|
-
});
|
|
31392
|
-
}
|
|
31393
|
-
/** Get a header in the SheetData. Create the header if it doesn't exist in the SheetData */
|
|
31394
|
-
function getSheetDataHeader(sheetData, dimension, index) {
|
|
31395
|
-
if (dimension === "COL") {
|
|
31396
|
-
if (!sheetData.cols[index]) {
|
|
31397
|
-
sheetData.cols[index] = {};
|
|
31398
|
-
}
|
|
31399
|
-
return sheetData.cols[index];
|
|
31400
|
-
}
|
|
31401
|
-
if (!sheetData.rows[index]) {
|
|
31402
|
-
sheetData.rows[index] = {};
|
|
31403
|
-
}
|
|
31404
|
-
return sheetData.rows[index];
|
|
31405
|
-
}
|
|
31406
|
-
|
|
31407
31432
|
const XLSX_DATE_FORMAT_REGEX = /^(yy|yyyy|m{1,5}|d{1,4}|h{1,2}|s{1,2}|am\/pm|a\/m|\s|-|\/|\.|:)+$/i;
|
|
31408
31433
|
/**
|
|
31409
31434
|
* Convert excel format to o_spreadsheet format
|
|
@@ -31613,9 +31638,9 @@ function convertConditionalFormats(xlsxCfs, dxfs, warningManager) {
|
|
|
31613
31638
|
if (!rule.operator || !rule.formula || rule.formula.length === 0)
|
|
31614
31639
|
continue;
|
|
31615
31640
|
operator = convertCFCellIsOperator(rule.operator);
|
|
31616
|
-
values.push(
|
|
31641
|
+
values.push(prefixFormulaWithEqual(rule.formula[0]));
|
|
31617
31642
|
if (rule.formula.length === 2) {
|
|
31618
|
-
values.push(
|
|
31643
|
+
values.push(prefixFormulaWithEqual(rule.formula[1]));
|
|
31619
31644
|
}
|
|
31620
31645
|
break;
|
|
31621
31646
|
}
|
|
@@ -31773,11 +31798,6 @@ function convertIcons(xlsxIconSet, index) {
|
|
|
31773
31798
|
? ICON_SETS[iconSet].neutral
|
|
31774
31799
|
: ICON_SETS[iconSet].good;
|
|
31775
31800
|
}
|
|
31776
|
-
/** Prefix the string by "=" if the string looks like a formula */
|
|
31777
|
-
function prefixFormula(formula) {
|
|
31778
|
-
const tokens = tokenize(formula);
|
|
31779
|
-
return tokens.length === 1 && tokens[0].type !== "REFERENCE" ? formula : "=" + formula;
|
|
31780
|
-
}
|
|
31781
31801
|
// ---------------------------------------------------------------------------
|
|
31782
31802
|
// Warnings
|
|
31783
31803
|
// ---------------------------------------------------------------------------
|
|
@@ -32214,7 +32234,7 @@ function convertDataValidationRules(xlsxDataValidations, warningManager) {
|
|
|
32214
32234
|
dvRules.push(decimalRule);
|
|
32215
32235
|
break;
|
|
32216
32236
|
case "list":
|
|
32217
|
-
const listRule =
|
|
32237
|
+
const listRule = convertListRule(dvId++, dv);
|
|
32218
32238
|
dvRules.push(listRule);
|
|
32219
32239
|
break;
|
|
32220
32240
|
case "date":
|
|
@@ -32234,9 +32254,9 @@ function convertDataValidationRules(xlsxDataValidations, warningManager) {
|
|
|
32234
32254
|
return dvRules;
|
|
32235
32255
|
}
|
|
32236
32256
|
function convertDecimalRule(id, dv) {
|
|
32237
|
-
const values = [dv.formula1.toString()];
|
|
32257
|
+
const values = [prefixFormulaWithEqual(dv.formula1.toString())];
|
|
32238
32258
|
if (dv.formula2) {
|
|
32239
|
-
values.push(dv.formula2.toString());
|
|
32259
|
+
values.push(prefixFormulaWithEqual(dv.formula2.toString()));
|
|
32240
32260
|
}
|
|
32241
32261
|
return {
|
|
32242
32262
|
id: id.toString(),
|
|
@@ -32248,7 +32268,7 @@ function convertDecimalRule(id, dv) {
|
|
|
32248
32268
|
},
|
|
32249
32269
|
};
|
|
32250
32270
|
}
|
|
32251
|
-
function
|
|
32271
|
+
function convertListRule(id, dv) {
|
|
32252
32272
|
const formula1 = dv.formula1.toString();
|
|
32253
32273
|
const isRangeRule = rangeReference.test(formula1);
|
|
32254
32274
|
return {
|
|
@@ -32264,9 +32284,9 @@ function convertListrule(id, dv) {
|
|
|
32264
32284
|
}
|
|
32265
32285
|
function convertDateRule(id, dv) {
|
|
32266
32286
|
let criterion;
|
|
32267
|
-
const values = [dv.formula1.toString()];
|
|
32287
|
+
const values = [prefixFormulaWithEqual(dv.formula1.toString())];
|
|
32268
32288
|
if (dv.formula2) {
|
|
32269
|
-
values.push(dv.formula2.toString());
|
|
32289
|
+
values.push(prefixFormulaWithEqual(dv.formula2.toString()));
|
|
32270
32290
|
criterion = {
|
|
32271
32291
|
type: XLSX_DV_DATE_OPERATOR_TO_DV_TYPE_MAPPING[dv.operator],
|
|
32272
32292
|
values: getDateCriterionFormattedValues(values, DEFAULT_LOCALE),
|
|
@@ -32293,7 +32313,7 @@ function convertCustomRule(id, dv) {
|
|
|
32293
32313
|
isBlocking: dv.errorStyle !== "warning",
|
|
32294
32314
|
criterion: {
|
|
32295
32315
|
type: "customFormula",
|
|
32296
|
-
values: [
|
|
32316
|
+
values: [prefixFormulaWithEqual(dv.formula1.toString())],
|
|
32297
32317
|
},
|
|
32298
32318
|
};
|
|
32299
32319
|
}
|
|
@@ -47292,12 +47312,13 @@ class DataValidationEditor extends owl.Component {
|
|
|
47292
47312
|
onCloseSidePanel: { type: Function, optional: true },
|
|
47293
47313
|
};
|
|
47294
47314
|
state = owl.useState({ rule: this.defaultDataValidationRule, errors: [] });
|
|
47315
|
+
editingSheetId;
|
|
47295
47316
|
setup() {
|
|
47317
|
+
this.editingSheetId = this.env.model.getters.getActiveSheetId();
|
|
47296
47318
|
if (this.props.rule) {
|
|
47297
|
-
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
47298
47319
|
this.state.rule = {
|
|
47299
47320
|
...this.props.rule,
|
|
47300
|
-
ranges: this.props.rule.ranges.map((range) => this.env.model.getters.getRangeString(range,
|
|
47321
|
+
ranges: this.props.rule.ranges.map((range) => this.env.model.getters.getRangeString(range, this.editingSheetId)),
|
|
47301
47322
|
};
|
|
47302
47323
|
this.state.rule.criterion.type = this.props.rule.criterion.type;
|
|
47303
47324
|
}
|
|
@@ -47331,7 +47352,6 @@ class DataValidationEditor extends owl.Component {
|
|
|
47331
47352
|
const locale = this.env.model.getters.getLocale();
|
|
47332
47353
|
const criterion = rule.criterion;
|
|
47333
47354
|
const criterionEvaluator = dataValidationEvaluatorRegistry.get(criterion.type);
|
|
47334
|
-
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
47335
47355
|
const values = criterion.values
|
|
47336
47356
|
.slice(0, criterionEvaluator.numberOfValues(criterion))
|
|
47337
47357
|
.map((value) => value?.trim())
|
|
@@ -47339,8 +47359,8 @@ class DataValidationEditor extends owl.Component {
|
|
|
47339
47359
|
.map((value) => canonicalizeContent(value, locale));
|
|
47340
47360
|
rule.criterion = { ...criterion, values };
|
|
47341
47361
|
return {
|
|
47342
|
-
sheetId,
|
|
47343
|
-
ranges: this.state.rule.ranges.map((xc) => this.env.model.getters.getRangeDataFromXc(
|
|
47362
|
+
sheetId: this.editingSheetId,
|
|
47363
|
+
ranges: this.state.rule.ranges.map((xc) => this.env.model.getters.getRangeDataFromXc(this.editingSheetId, xc)),
|
|
47344
47364
|
rule,
|
|
47345
47365
|
};
|
|
47346
47366
|
}
|
|
@@ -47870,6 +47890,7 @@ css /* scss */ `
|
|
|
47870
47890
|
.o-button {
|
|
47871
47891
|
height: 19px;
|
|
47872
47892
|
width: 19px;
|
|
47893
|
+
box-sizing: content-box;
|
|
47873
47894
|
.o-icon {
|
|
47874
47895
|
height: 14px;
|
|
47875
47896
|
width: 14px;
|
|
@@ -48633,7 +48654,7 @@ class PivotMeasureEditor extends owl.Component {
|
|
|
48633
48654
|
return undefined;
|
|
48634
48655
|
}
|
|
48635
48656
|
get isCalculatedMeasureInvalid() {
|
|
48636
|
-
return
|
|
48657
|
+
return compile(this.props.measure.computedBy?.formula ?? "").isBadExpression;
|
|
48637
48658
|
}
|
|
48638
48659
|
}
|
|
48639
48660
|
|
|
@@ -59765,7 +59786,7 @@ class HeaderSizePlugin extends CorePlugin {
|
|
|
59765
59786
|
let sizes = [...this.sizes[cmd.sheetId][cmd.dimension]];
|
|
59766
59787
|
const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
|
|
59767
59788
|
const baseSize = sizes[cmd.base];
|
|
59768
|
-
sizes
|
|
59789
|
+
sizes = insertItemsAtIndex(sizes, Array(cmd.quantity).fill(baseSize), addIndex);
|
|
59769
59790
|
this.history.update("sizes", cmd.sheetId, cmd.dimension, sizes);
|
|
59770
59791
|
break;
|
|
59771
59792
|
}
|
|
@@ -59917,9 +59938,8 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
59917
59938
|
break;
|
|
59918
59939
|
}
|
|
59919
59940
|
case "ADD_COLUMNS_ROWS": {
|
|
59920
|
-
const hiddenHeaders = [...this.hiddenHeaders[cmd.sheetId][cmd.dimension]];
|
|
59921
59941
|
const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
|
|
59922
|
-
hiddenHeaders.
|
|
59942
|
+
const hiddenHeaders = insertItemsAtIndex([...this.hiddenHeaders[cmd.sheetId][cmd.dimension]], Array(cmd.quantity).fill(false), addIndex);
|
|
59923
59943
|
this.history.update("hiddenHeaders", cmd.sheetId, cmd.dimension, hiddenHeaders);
|
|
59924
59944
|
break;
|
|
59925
59945
|
}
|
|
@@ -63983,12 +64003,12 @@ class SpreadsheetRTree {
|
|
|
63983
64003
|
this.rTrees[sheetId].remove(item, this.rtreeItemComparer);
|
|
63984
64004
|
}
|
|
63985
64005
|
rtreeItemComparer(left, right) {
|
|
63986
|
-
return (left.
|
|
63987
|
-
left.boundingBox.sheetId === right.boundingBox.sheetId &&
|
|
64006
|
+
return (left.boundingBox.sheetId === right.boundingBox.sheetId &&
|
|
63988
64007
|
left.boundingBox?.zone.left === right.boundingBox.zone.left &&
|
|
63989
64008
|
left.boundingBox?.zone.top === right.boundingBox.zone.top &&
|
|
63990
64009
|
left.boundingBox?.zone.right === right.boundingBox.zone.right &&
|
|
63991
|
-
left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom
|
|
64010
|
+
left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom &&
|
|
64011
|
+
deepEquals(left.data, right.data));
|
|
63992
64012
|
}
|
|
63993
64013
|
}
|
|
63994
64014
|
/**
|
|
@@ -64061,7 +64081,7 @@ class FormulaDependencyGraph {
|
|
|
64061
64081
|
* in the correct order they should be evaluated.
|
|
64062
64082
|
* This is called a topological ordering (excluding cycles)
|
|
64063
64083
|
*/
|
|
64064
|
-
getCellsDependingOn(ranges) {
|
|
64084
|
+
getCellsDependingOn(ranges, ignore) {
|
|
64065
64085
|
const visited = this.createEmptyPositionSet();
|
|
64066
64086
|
const queue = Array.from(ranges).reverse();
|
|
64067
64087
|
while (queue.length > 0) {
|
|
@@ -64076,7 +64096,7 @@ class FormulaDependencyGraph {
|
|
|
64076
64096
|
const impactedPositions = this.rTree.search(range).map((dep) => dep.data);
|
|
64077
64097
|
const nextInQueue = {};
|
|
64078
64098
|
for (const position of impactedPositions) {
|
|
64079
|
-
if (!visited.has(position)) {
|
|
64099
|
+
if (!visited.has(position) && !ignore.has(position)) {
|
|
64080
64100
|
if (!nextInQueue[position.sheetId]) {
|
|
64081
64101
|
nextInQueue[position.sheetId] = [];
|
|
64082
64102
|
}
|
|
@@ -64633,7 +64653,7 @@ class Evaluator {
|
|
|
64633
64653
|
}
|
|
64634
64654
|
invalidatePositionsDependingOnSpread(sheetId, resultZone) {
|
|
64635
64655
|
// the result matrix is split in 2 zones to exclude the array formula position
|
|
64636
|
-
const invalidatedPositions = this.formulaDependencies().getCellsDependingOn(excludeTopLeft(resultZone).map((zone) => ({ sheetId, zone })));
|
|
64656
|
+
const invalidatedPositions = this.formulaDependencies().getCellsDependingOn(excludeTopLeft(resultZone).map((zone) => ({ sheetId, zone })), this.nextPositionsToUpdate);
|
|
64637
64657
|
invalidatedPositions.delete({ sheetId, col: resultZone.left, row: resultZone.top });
|
|
64638
64658
|
this.nextPositionsToUpdate.addMany(invalidatedPositions);
|
|
64639
64659
|
}
|
|
@@ -64751,7 +64771,7 @@ class Evaluator {
|
|
|
64751
64771
|
for (const sheetId in zonesBySheetIds) {
|
|
64752
64772
|
ranges.push(...zonesBySheetIds[sheetId].map((zone) => ({ sheetId, zone })));
|
|
64753
64773
|
}
|
|
64754
|
-
return this.formulaDependencies().getCellsDependingOn(ranges);
|
|
64774
|
+
return this.formulaDependencies().getCellsDependingOn(ranges, this.nextPositionsToUpdate);
|
|
64755
64775
|
}
|
|
64756
64776
|
}
|
|
64757
64777
|
function forEachSpreadPositionInMatrix(nbColumns, nbRows, callback) {
|
|
@@ -65963,7 +65983,8 @@ class DynamicTablesPlugin extends CoreViewPlugin {
|
|
|
65963
65983
|
const topLeft = { col: unionZone.left, row: unionZone.top, sheetId };
|
|
65964
65984
|
const parentSpreadingCell = this.getters.getArrayFormulaSpreadingOn(topLeft);
|
|
65965
65985
|
if (!parentSpreadingCell) {
|
|
65966
|
-
|
|
65986
|
+
const evaluatedCell = this.getters.getEvaluatedCell(topLeft);
|
|
65987
|
+
return (evaluatedCell.value === CellErrorType.SpilledBlocked && !evaluatedCell.errorOriginPosition);
|
|
65967
65988
|
}
|
|
65968
65989
|
else if (deepEquals(parentSpreadingCell, topLeft) && getZoneArea(unionZone) === 1) {
|
|
65969
65990
|
return true;
|
|
@@ -81034,6 +81055,6 @@ exports.tokenColors = tokenColors;
|
|
|
81034
81055
|
exports.tokenize = tokenize;
|
|
81035
81056
|
|
|
81036
81057
|
|
|
81037
|
-
__info__.version = "18.3.
|
|
81038
|
-
__info__.date = "2025-
|
|
81039
|
-
__info__.hash = "
|
|
81058
|
+
__info__.version = "18.3.24";
|
|
81059
|
+
__info__.date = "2025-10-16T06:38:12.942Z";
|
|
81060
|
+
__info__.hash = "f13dd1c";
|