@odoo/o-spreadsheet 18.2.31 → 18.2.33
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 +126 -106
- package/dist/o-spreadsheet.d.ts +10 -10
- package/dist/o-spreadsheet.esm.js +126 -106
- package/dist/o-spreadsheet.iife.js +126 -106
- package/dist/o-spreadsheet.iife.min.js +237 -236
- 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.2.
|
|
6
|
-
* @date 2025-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 18.2.33
|
|
6
|
+
* @date 2025-10-16T06:39:40.421Z
|
|
7
|
+
* @hash 280596c
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
'use strict';
|
|
@@ -875,9 +875,7 @@ function removeIndexesFromArray(array, indexes) {
|
|
|
875
875
|
return newArray;
|
|
876
876
|
}
|
|
877
877
|
function insertItemsAtIndex(array, items, index) {
|
|
878
|
-
|
|
879
|
-
newArray.splice(index, 0, ...items);
|
|
880
|
-
return newArray;
|
|
878
|
+
return array.slice(0, index).concat(items).concat(array.slice(index));
|
|
881
879
|
}
|
|
882
880
|
function replaceItemAtIndex(array, newItem, index) {
|
|
883
881
|
const newArray = [...array];
|
|
@@ -3918,7 +3916,17 @@ function toNumberMatrix(data, argName) {
|
|
|
3918
3916
|
return toMatrix(data).map((row) => {
|
|
3919
3917
|
return row.map((cell) => {
|
|
3920
3918
|
if (typeof cell.value !== "number") {
|
|
3921
|
-
|
|
3919
|
+
let message = "";
|
|
3920
|
+
if (typeof cell === "object") {
|
|
3921
|
+
message = _t("Function [[FUNCTION_NAME]] expects number values for %s, but got an empty value.", argName);
|
|
3922
|
+
}
|
|
3923
|
+
else if (typeof cell === "string") {
|
|
3924
|
+
message = _t("Function [[FUNCTION_NAME]] expects number values for %s, but got a string.", argName);
|
|
3925
|
+
}
|
|
3926
|
+
else if (typeof cell === "boolean") {
|
|
3927
|
+
message = _t("Function [[FUNCTION_NAME]] expects number values for %s, but got a boolean.", argName);
|
|
3928
|
+
}
|
|
3929
|
+
throw new EvaluationError(message);
|
|
3922
3930
|
}
|
|
3923
3931
|
return cell.value;
|
|
3924
3932
|
});
|
|
@@ -5118,7 +5126,7 @@ function tokensToTextInternalFormat(tokens) {
|
|
|
5118
5126
|
* Replace in place tokens "mm" and "m" that denote minutes in date format with "MM" to avoid confusion with months.
|
|
5119
5127
|
*
|
|
5120
5128
|
* As per OpenXML specification, in date formats if a date token "m" or "mm" is followed by a date token "s" or
|
|
5121
|
-
* preceded by a data token "h", then it's not a month but
|
|
5129
|
+
* preceded by a data token "h", then it's not a month but a minute.
|
|
5122
5130
|
*/
|
|
5123
5131
|
function convertTokensToMinutesInDateFormat(tokens) {
|
|
5124
5132
|
const dateParts = tokens.filter((token) => token.type === "DATE_PART");
|
|
@@ -5161,6 +5169,9 @@ function internalFormatPartToFormat(internalFormat) {
|
|
|
5161
5169
|
case "REPEATED_CHAR":
|
|
5162
5170
|
format += "*" + token.value;
|
|
5163
5171
|
break;
|
|
5172
|
+
case "DATE_PART":
|
|
5173
|
+
format += token.value === "MM" ? "mm" : token.value; // Convert "MM" back to "mm" for minutes
|
|
5174
|
+
break;
|
|
5164
5175
|
default:
|
|
5165
5176
|
format += token.value;
|
|
5166
5177
|
}
|
|
@@ -8817,7 +8828,7 @@ class CellClipboardHandler extends AbstractCellClipboardHandler {
|
|
|
8817
8828
|
pasteCell(origin, target, clipboardOption) {
|
|
8818
8829
|
const { sheetId, col, row } = target;
|
|
8819
8830
|
const targetCell = this.getters.getEvaluatedCell(target);
|
|
8820
|
-
const originFormat = origin?.format
|
|
8831
|
+
const originFormat = origin?.format || origin.evaluatedCell.format;
|
|
8821
8832
|
if (clipboardOption?.pasteOption === "asValue") {
|
|
8822
8833
|
this.dispatch("UPDATE_CELL", {
|
|
8823
8834
|
...target,
|
|
@@ -10438,6 +10449,10 @@ const chartShowValuesPlugin = {
|
|
|
10438
10449
|
}
|
|
10439
10450
|
const ctx = chart.ctx;
|
|
10440
10451
|
ctx.save();
|
|
10452
|
+
const { left, top, height, width } = chart.chartArea;
|
|
10453
|
+
ctx.beginPath();
|
|
10454
|
+
ctx.rect(left, top, width, height);
|
|
10455
|
+
ctx.clip();
|
|
10441
10456
|
ctx.textAlign = "center";
|
|
10442
10457
|
ctx.textBaseline = "middle";
|
|
10443
10458
|
ctx.miterLimit = 1; // Avoid sharp artifacts on strokeText
|
|
@@ -13643,7 +13658,7 @@ const GROWTH = {
|
|
|
13643
13658
|
],
|
|
13644
13659
|
compute: function (knownDataY, knownDataX = [[]], newDataX = [[]], b = { value: true }) {
|
|
13645
13660
|
assertNonEmptyMatrix(knownDataY, "known_data_y");
|
|
13646
|
-
return expM(predictLinearValues(logM(toNumberMatrix(knownDataY, "
|
|
13661
|
+
return expM(predictLinearValues(logM(toNumberMatrix(knownDataY, "known_data_y")), toNumberMatrix(knownDataX, "known_data_x"), toNumberMatrix(newDataX, "new_data_y"), toBoolean(b)));
|
|
13647
13662
|
},
|
|
13648
13663
|
};
|
|
13649
13664
|
// -----------------------------------------------------------------------------
|
|
@@ -13708,7 +13723,7 @@ const LINEST = {
|
|
|
13708
13723
|
],
|
|
13709
13724
|
compute: function (dataY, dataX = [[]], calculateB = { value: true }, verbose = { value: false }) {
|
|
13710
13725
|
assertNonEmptyMatrix(dataY, "data_y");
|
|
13711
|
-
return fullLinearRegression(toNumberMatrix(dataX, "
|
|
13726
|
+
return fullLinearRegression(toNumberMatrix(dataX, "data_x"), toNumberMatrix(dataY, "data_y"), toBoolean(calculateB), toBoolean(verbose));
|
|
13712
13727
|
},
|
|
13713
13728
|
isExported: true,
|
|
13714
13729
|
};
|
|
@@ -13725,7 +13740,7 @@ const LOGEST = {
|
|
|
13725
13740
|
],
|
|
13726
13741
|
compute: function (dataY, dataX = [[]], calculateB = { value: true }, verbose = { value: false }) {
|
|
13727
13742
|
assertNonEmptyMatrix(dataY, "data_y");
|
|
13728
|
-
const coeffs = fullLinearRegression(toNumberMatrix(dataX, "
|
|
13743
|
+
const coeffs = fullLinearRegression(toNumberMatrix(dataX, "data_x"), logM(toNumberMatrix(dataY, "data_y")), toBoolean(calculateB), toBoolean(verbose));
|
|
13729
13744
|
for (let i = 0; i < coeffs.length; i++) {
|
|
13730
13745
|
coeffs[i][0] = Math.exp(coeffs[i][0]);
|
|
13731
13746
|
}
|
|
@@ -14315,7 +14330,7 @@ const TREND = {
|
|
|
14315
14330
|
],
|
|
14316
14331
|
compute: function (knownDataY, knownDataX = [[]], newDataX = [[]], b = { value: true }) {
|
|
14317
14332
|
assertNonEmptyMatrix(knownDataY, "known_data_y");
|
|
14318
|
-
return predictLinearValues(toNumberMatrix(knownDataY, "
|
|
14333
|
+
return predictLinearValues(toNumberMatrix(knownDataY, "known_data_y"), toNumberMatrix(knownDataX, "known_data_x"), toNumberMatrix(newDataX, "new_data_y"), toBoolean(b));
|
|
14319
14334
|
},
|
|
14320
14335
|
};
|
|
14321
14336
|
// -----------------------------------------------------------------------------
|
|
@@ -23746,6 +23761,74 @@ iconsOnCellRegistry.add("conditional_formatting", (getters, position) => {
|
|
|
23746
23761
|
}
|
|
23747
23762
|
});
|
|
23748
23763
|
|
|
23764
|
+
/**
|
|
23765
|
+
* Get the relative path between two files
|
|
23766
|
+
*
|
|
23767
|
+
* Eg.:
|
|
23768
|
+
* from "folder1/file1.txt" to "folder2/file2.txt" => "../folder2/file2.txt"
|
|
23769
|
+
*/
|
|
23770
|
+
function getRelativePath(from, to) {
|
|
23771
|
+
const fromPathParts = from.split("/");
|
|
23772
|
+
const toPathParts = to.split("/");
|
|
23773
|
+
let relPath = "";
|
|
23774
|
+
let startIndex = 0;
|
|
23775
|
+
for (let i = 0; i < fromPathParts.length - 1; i++) {
|
|
23776
|
+
if (fromPathParts[i] === toPathParts[i]) {
|
|
23777
|
+
startIndex++;
|
|
23778
|
+
}
|
|
23779
|
+
else {
|
|
23780
|
+
relPath += "../";
|
|
23781
|
+
}
|
|
23782
|
+
}
|
|
23783
|
+
relPath += toPathParts.slice(startIndex).join("/");
|
|
23784
|
+
return relPath;
|
|
23785
|
+
}
|
|
23786
|
+
/**
|
|
23787
|
+
* Convert an array of element into an object where the objects keys were the elements position in the array.
|
|
23788
|
+
* Can give an offset as argument, and all the array indexes will we shifted by this offset in the returned object.
|
|
23789
|
+
*
|
|
23790
|
+
* eg. : ["a", "b"] => {0:"a", 1:"b"}
|
|
23791
|
+
*/
|
|
23792
|
+
function arrayToObject(array, indexOffset = 0) {
|
|
23793
|
+
const obj = {};
|
|
23794
|
+
for (let i = 0; i < array.length; i++) {
|
|
23795
|
+
if (array[i]) {
|
|
23796
|
+
obj[i + indexOffset] = array[i];
|
|
23797
|
+
}
|
|
23798
|
+
}
|
|
23799
|
+
return obj;
|
|
23800
|
+
}
|
|
23801
|
+
/**
|
|
23802
|
+
* In xlsx we can have string with unicode characters with the format _x00fa_.
|
|
23803
|
+
* Replace with characters understandable by JS
|
|
23804
|
+
*/
|
|
23805
|
+
function fixXlsxUnicode(str) {
|
|
23806
|
+
return str.replace(/_x([0-9a-zA-Z]{4})_/g, (match, code) => {
|
|
23807
|
+
return String.fromCharCode(parseInt(code, 16));
|
|
23808
|
+
});
|
|
23809
|
+
}
|
|
23810
|
+
/** Get a header in the SheetData. Create the header if it doesn't exist in the SheetData */
|
|
23811
|
+
function getSheetDataHeader(sheetData, dimension, index) {
|
|
23812
|
+
if (dimension === "COL") {
|
|
23813
|
+
if (!sheetData.cols[index]) {
|
|
23814
|
+
sheetData.cols[index] = {};
|
|
23815
|
+
}
|
|
23816
|
+
return sheetData.cols[index];
|
|
23817
|
+
}
|
|
23818
|
+
if (!sheetData.rows[index]) {
|
|
23819
|
+
sheetData.rows[index] = {};
|
|
23820
|
+
}
|
|
23821
|
+
return sheetData.rows[index];
|
|
23822
|
+
}
|
|
23823
|
+
/** Prefix the string by "=" if the string looks like a formula */
|
|
23824
|
+
function prefixFormulaWithEqual(formula) {
|
|
23825
|
+
if (formula[0] === "=") {
|
|
23826
|
+
return formula;
|
|
23827
|
+
}
|
|
23828
|
+
const tokens = tokenize(formula);
|
|
23829
|
+
return tokens.length === 1 && tokens[0].type !== "REFERENCE" ? formula : "=" + formula;
|
|
23830
|
+
}
|
|
23831
|
+
|
|
23749
23832
|
/**
|
|
23750
23833
|
* Map of the different types of conversions warnings and their name in error messages
|
|
23751
23834
|
*/
|
|
@@ -24253,66 +24336,6 @@ function hexaToInt(hex) {
|
|
|
24253
24336
|
*/
|
|
24254
24337
|
const DEFAULT_SYSTEM_COLOR = "FF000000";
|
|
24255
24338
|
|
|
24256
|
-
/**
|
|
24257
|
-
* Get the relative path between two files
|
|
24258
|
-
*
|
|
24259
|
-
* Eg.:
|
|
24260
|
-
* from "folder1/file1.txt" to "folder2/file2.txt" => "../folder2/file2.txt"
|
|
24261
|
-
*/
|
|
24262
|
-
function getRelativePath(from, to) {
|
|
24263
|
-
const fromPathParts = from.split("/");
|
|
24264
|
-
const toPathParts = to.split("/");
|
|
24265
|
-
let relPath = "";
|
|
24266
|
-
let startIndex = 0;
|
|
24267
|
-
for (let i = 0; i < fromPathParts.length - 1; i++) {
|
|
24268
|
-
if (fromPathParts[i] === toPathParts[i]) {
|
|
24269
|
-
startIndex++;
|
|
24270
|
-
}
|
|
24271
|
-
else {
|
|
24272
|
-
relPath += "../";
|
|
24273
|
-
}
|
|
24274
|
-
}
|
|
24275
|
-
relPath += toPathParts.slice(startIndex).join("/");
|
|
24276
|
-
return relPath;
|
|
24277
|
-
}
|
|
24278
|
-
/**
|
|
24279
|
-
* Convert an array of element into an object where the objects keys were the elements position in the array.
|
|
24280
|
-
* Can give an offset as argument, and all the array indexes will we shifted by this offset in the returned object.
|
|
24281
|
-
*
|
|
24282
|
-
* eg. : ["a", "b"] => {0:"a", 1:"b"}
|
|
24283
|
-
*/
|
|
24284
|
-
function arrayToObject(array, indexOffset = 0) {
|
|
24285
|
-
const obj = {};
|
|
24286
|
-
for (let i = 0; i < array.length; i++) {
|
|
24287
|
-
if (array[i]) {
|
|
24288
|
-
obj[i + indexOffset] = array[i];
|
|
24289
|
-
}
|
|
24290
|
-
}
|
|
24291
|
-
return obj;
|
|
24292
|
-
}
|
|
24293
|
-
/**
|
|
24294
|
-
* In xlsx we can have string with unicode characters with the format _x00fa_.
|
|
24295
|
-
* Replace with characters understandable by JS
|
|
24296
|
-
*/
|
|
24297
|
-
function fixXlsxUnicode(str) {
|
|
24298
|
-
return str.replace(/_x([0-9a-zA-Z]{4})_/g, (match, code) => {
|
|
24299
|
-
return String.fromCharCode(parseInt(code, 16));
|
|
24300
|
-
});
|
|
24301
|
-
}
|
|
24302
|
-
/** Get a header in the SheetData. Create the header if it doesn't exist in the SheetData */
|
|
24303
|
-
function getSheetDataHeader(sheetData, dimension, index) {
|
|
24304
|
-
if (dimension === "COL") {
|
|
24305
|
-
if (!sheetData.cols[index]) {
|
|
24306
|
-
sheetData.cols[index] = {};
|
|
24307
|
-
}
|
|
24308
|
-
return sheetData.cols[index];
|
|
24309
|
-
}
|
|
24310
|
-
if (!sheetData.rows[index]) {
|
|
24311
|
-
sheetData.rows[index] = {};
|
|
24312
|
-
}
|
|
24313
|
-
return sheetData.rows[index];
|
|
24314
|
-
}
|
|
24315
|
-
|
|
24316
24339
|
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;
|
|
24317
24340
|
/**
|
|
24318
24341
|
* Convert excel format to o_spreadsheet format
|
|
@@ -24522,9 +24545,9 @@ function convertConditionalFormats(xlsxCfs, dxfs, warningManager) {
|
|
|
24522
24545
|
if (!rule.operator || !rule.formula || rule.formula.length === 0)
|
|
24523
24546
|
continue;
|
|
24524
24547
|
operator = convertCFCellIsOperator(rule.operator);
|
|
24525
|
-
values.push(
|
|
24548
|
+
values.push(prefixFormulaWithEqual(rule.formula[0]));
|
|
24526
24549
|
if (rule.formula.length === 2) {
|
|
24527
|
-
values.push(
|
|
24550
|
+
values.push(prefixFormulaWithEqual(rule.formula[1]));
|
|
24528
24551
|
}
|
|
24529
24552
|
break;
|
|
24530
24553
|
}
|
|
@@ -24682,11 +24705,6 @@ function convertIcons(xlsxIconSet, index) {
|
|
|
24682
24705
|
? ICON_SETS[iconSet].neutral
|
|
24683
24706
|
: ICON_SETS[iconSet].good;
|
|
24684
24707
|
}
|
|
24685
|
-
/** Prefix the string by "=" if the string looks like a formula */
|
|
24686
|
-
function prefixFormula(formula) {
|
|
24687
|
-
const tokens = tokenize(formula);
|
|
24688
|
-
return tokens.length === 1 && tokens[0].type !== "REFERENCE" ? formula : "=" + formula;
|
|
24689
|
-
}
|
|
24690
24708
|
// ---------------------------------------------------------------------------
|
|
24691
24709
|
// Warnings
|
|
24692
24710
|
// ---------------------------------------------------------------------------
|
|
@@ -25107,7 +25125,7 @@ function convertDataValidationRules(xlsxDataValidations, warningManager) {
|
|
|
25107
25125
|
dvRules.push(decimalRule);
|
|
25108
25126
|
break;
|
|
25109
25127
|
case "list":
|
|
25110
|
-
const listRule =
|
|
25128
|
+
const listRule = convertListRule(dvId++, dv);
|
|
25111
25129
|
dvRules.push(listRule);
|
|
25112
25130
|
break;
|
|
25113
25131
|
case "date":
|
|
@@ -25127,9 +25145,9 @@ function convertDataValidationRules(xlsxDataValidations, warningManager) {
|
|
|
25127
25145
|
return dvRules;
|
|
25128
25146
|
}
|
|
25129
25147
|
function convertDecimalRule(id, dv) {
|
|
25130
|
-
const values = [dv.formula1.toString()];
|
|
25148
|
+
const values = [prefixFormulaWithEqual(dv.formula1.toString())];
|
|
25131
25149
|
if (dv.formula2) {
|
|
25132
|
-
values.push(dv.formula2.toString());
|
|
25150
|
+
values.push(prefixFormulaWithEqual(dv.formula2.toString()));
|
|
25133
25151
|
}
|
|
25134
25152
|
return {
|
|
25135
25153
|
id: id.toString(),
|
|
@@ -25141,7 +25159,7 @@ function convertDecimalRule(id, dv) {
|
|
|
25141
25159
|
},
|
|
25142
25160
|
};
|
|
25143
25161
|
}
|
|
25144
|
-
function
|
|
25162
|
+
function convertListRule(id, dv) {
|
|
25145
25163
|
const formula1 = dv.formula1.toString();
|
|
25146
25164
|
const isRangeRule = rangeReference.test(formula1);
|
|
25147
25165
|
return {
|
|
@@ -25157,9 +25175,9 @@ function convertListrule(id, dv) {
|
|
|
25157
25175
|
}
|
|
25158
25176
|
function convertDateRule(id, dv) {
|
|
25159
25177
|
let criterion;
|
|
25160
|
-
const values = [dv.formula1.toString()];
|
|
25178
|
+
const values = [prefixFormulaWithEqual(dv.formula1.toString())];
|
|
25161
25179
|
if (dv.formula2) {
|
|
25162
|
-
values.push(dv.formula2.toString());
|
|
25180
|
+
values.push(prefixFormulaWithEqual(dv.formula2.toString()));
|
|
25163
25181
|
criterion = {
|
|
25164
25182
|
type: XLSX_DV_DATE_OPERATOR_TO_DV_TYPE_MAPPING[dv.operator],
|
|
25165
25183
|
values: getDateCriterionFormattedValues(values, DEFAULT_LOCALE),
|
|
@@ -25186,7 +25204,7 @@ function convertCustomRule(id, dv) {
|
|
|
25186
25204
|
isBlocking: dv.errorStyle !== "warning",
|
|
25187
25205
|
criterion: {
|
|
25188
25206
|
type: "customFormula",
|
|
25189
|
-
values: [
|
|
25207
|
+
values: [prefixFormulaWithEqual(dv.formula1.toString())],
|
|
25190
25208
|
},
|
|
25191
25209
|
};
|
|
25192
25210
|
}
|
|
@@ -28918,6 +28936,7 @@ function getChartTimeOptions(labels, labelFormat, locale) {
|
|
|
28918
28936
|
parser: luxonFormat,
|
|
28919
28937
|
displayFormats,
|
|
28920
28938
|
unit: timeUnit ?? false,
|
|
28939
|
+
tooltipFormat: luxonFormat,
|
|
28921
28940
|
};
|
|
28922
28941
|
}
|
|
28923
28942
|
/**
|
|
@@ -30096,6 +30115,7 @@ function getLineChartScales(definition, args) {
|
|
|
30096
30115
|
};
|
|
30097
30116
|
Object.assign(scales.x, axis);
|
|
30098
30117
|
scales.x.ticks.maxTicksLimit = 15;
|
|
30118
|
+
delete scales?.x?.ticks?.callback;
|
|
30099
30119
|
}
|
|
30100
30120
|
else if (axisType === "linear") {
|
|
30101
30121
|
scales.x.type = "linear";
|
|
@@ -44551,12 +44571,13 @@ class DataValidationEditor extends owl.Component {
|
|
|
44551
44571
|
onCloseSidePanel: { type: Function, optional: true },
|
|
44552
44572
|
};
|
|
44553
44573
|
state = owl.useState({ rule: this.defaultDataValidationRule, errors: [] });
|
|
44574
|
+
editingSheetId;
|
|
44554
44575
|
setup() {
|
|
44576
|
+
this.editingSheetId = this.env.model.getters.getActiveSheetId();
|
|
44555
44577
|
if (this.props.rule) {
|
|
44556
|
-
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
44557
44578
|
this.state.rule = {
|
|
44558
44579
|
...this.props.rule,
|
|
44559
|
-
ranges: this.props.rule.ranges.map((range) => this.env.model.getters.getRangeString(range,
|
|
44580
|
+
ranges: this.props.rule.ranges.map((range) => this.env.model.getters.getRangeString(range, this.editingSheetId)),
|
|
44560
44581
|
};
|
|
44561
44582
|
this.state.rule.criterion.type = this.props.rule.criterion.type;
|
|
44562
44583
|
}
|
|
@@ -44590,7 +44611,6 @@ class DataValidationEditor extends owl.Component {
|
|
|
44590
44611
|
const locale = this.env.model.getters.getLocale();
|
|
44591
44612
|
const criterion = rule.criterion;
|
|
44592
44613
|
const criterionEvaluator = dataValidationEvaluatorRegistry.get(criterion.type);
|
|
44593
|
-
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
44594
44614
|
const values = criterion.values
|
|
44595
44615
|
.slice(0, criterionEvaluator.numberOfValues(criterion))
|
|
44596
44616
|
.map((value) => value?.trim())
|
|
@@ -44598,8 +44618,8 @@ class DataValidationEditor extends owl.Component {
|
|
|
44598
44618
|
.map((value) => canonicalizeContent(value, locale));
|
|
44599
44619
|
rule.criterion = { ...criterion, values };
|
|
44600
44620
|
return {
|
|
44601
|
-
sheetId,
|
|
44602
|
-
ranges: this.state.rule.ranges.map((xc) => this.env.model.getters.getRangeDataFromXc(
|
|
44621
|
+
sheetId: this.editingSheetId,
|
|
44622
|
+
ranges: this.state.rule.ranges.map((xc) => this.env.model.getters.getRangeDataFromXc(this.editingSheetId, xc)),
|
|
44603
44623
|
rule,
|
|
44604
44624
|
};
|
|
44605
44625
|
}
|
|
@@ -45129,6 +45149,7 @@ css /* scss */ `
|
|
|
45129
45149
|
.o-button {
|
|
45130
45150
|
height: 19px;
|
|
45131
45151
|
width: 19px;
|
|
45152
|
+
box-sizing: content-box;
|
|
45132
45153
|
.o-icon {
|
|
45133
45154
|
height: 14px;
|
|
45134
45155
|
width: 14px;
|
|
@@ -45886,7 +45907,7 @@ class PivotMeasureEditor extends owl.Component {
|
|
|
45886
45907
|
return undefined;
|
|
45887
45908
|
}
|
|
45888
45909
|
get isCalculatedMeasureInvalid() {
|
|
45889
|
-
return
|
|
45910
|
+
return compile(this.props.measure.computedBy?.formula ?? "").isBadExpression;
|
|
45890
45911
|
}
|
|
45891
45912
|
}
|
|
45892
45913
|
|
|
@@ -56624,7 +56645,7 @@ class HeaderSizePlugin extends CorePlugin {
|
|
|
56624
56645
|
let sizes = [...this.sizes[cmd.sheetId][cmd.dimension]];
|
|
56625
56646
|
const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
|
|
56626
56647
|
const baseSize = sizes[cmd.base];
|
|
56627
|
-
sizes
|
|
56648
|
+
sizes = insertItemsAtIndex(sizes, Array(cmd.quantity).fill(baseSize), addIndex);
|
|
56628
56649
|
this.history.update("sizes", cmd.sheetId, cmd.dimension, sizes);
|
|
56629
56650
|
break;
|
|
56630
56651
|
}
|
|
@@ -56776,9 +56797,8 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
56776
56797
|
break;
|
|
56777
56798
|
}
|
|
56778
56799
|
case "ADD_COLUMNS_ROWS": {
|
|
56779
|
-
const hiddenHeaders = [...this.hiddenHeaders[cmd.sheetId][cmd.dimension]];
|
|
56780
56800
|
const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
|
|
56781
|
-
hiddenHeaders.
|
|
56801
|
+
const hiddenHeaders = insertItemsAtIndex([...this.hiddenHeaders[cmd.sheetId][cmd.dimension]], Array(cmd.quantity).fill(false), addIndex);
|
|
56782
56802
|
this.history.update("hiddenHeaders", cmd.sheetId, cmd.dimension, hiddenHeaders);
|
|
56783
56803
|
break;
|
|
56784
56804
|
}
|
|
@@ -61061,12 +61081,12 @@ class SpreadsheetRTree {
|
|
|
61061
61081
|
this.rTrees[sheetId].remove(item, this.rtreeItemComparer);
|
|
61062
61082
|
}
|
|
61063
61083
|
rtreeItemComparer(left, right) {
|
|
61064
|
-
return (left.
|
|
61065
|
-
left.boundingBox.sheetId === right.boundingBox.sheetId &&
|
|
61084
|
+
return (left.boundingBox.sheetId === right.boundingBox.sheetId &&
|
|
61066
61085
|
left.boundingBox?.zone.left === right.boundingBox.zone.left &&
|
|
61067
61086
|
left.boundingBox?.zone.top === right.boundingBox.zone.top &&
|
|
61068
61087
|
left.boundingBox?.zone.right === right.boundingBox.zone.right &&
|
|
61069
|
-
left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom
|
|
61088
|
+
left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom &&
|
|
61089
|
+
deepEquals(left.data, right.data));
|
|
61070
61090
|
}
|
|
61071
61091
|
}
|
|
61072
61092
|
/**
|
|
@@ -61139,7 +61159,7 @@ class FormulaDependencyGraph {
|
|
|
61139
61159
|
* in the correct order they should be evaluated.
|
|
61140
61160
|
* This is called a topological ordering (excluding cycles)
|
|
61141
61161
|
*/
|
|
61142
|
-
getCellsDependingOn(ranges) {
|
|
61162
|
+
getCellsDependingOn(ranges, ignore) {
|
|
61143
61163
|
const visited = this.createEmptyPositionSet();
|
|
61144
61164
|
const queue = Array.from(ranges).reverse();
|
|
61145
61165
|
while (queue.length > 0) {
|
|
@@ -61154,7 +61174,7 @@ class FormulaDependencyGraph {
|
|
|
61154
61174
|
const impactedPositions = this.rTree.search(range).map((dep) => dep.data);
|
|
61155
61175
|
const nextInQueue = {};
|
|
61156
61176
|
for (const position of impactedPositions) {
|
|
61157
|
-
if (!visited.has(position)) {
|
|
61177
|
+
if (!visited.has(position) && !ignore.has(position)) {
|
|
61158
61178
|
if (!nextInQueue[position.sheetId]) {
|
|
61159
61179
|
nextInQueue[position.sheetId] = [];
|
|
61160
61180
|
}
|
|
@@ -61711,7 +61731,7 @@ class Evaluator {
|
|
|
61711
61731
|
}
|
|
61712
61732
|
invalidatePositionsDependingOnSpread(sheetId, resultZone) {
|
|
61713
61733
|
// the result matrix is split in 2 zones to exclude the array formula position
|
|
61714
|
-
const invalidatedPositions = this.formulaDependencies().getCellsDependingOn(excludeTopLeft(resultZone).map((zone) => ({ sheetId, zone })));
|
|
61734
|
+
const invalidatedPositions = this.formulaDependencies().getCellsDependingOn(excludeTopLeft(resultZone).map((zone) => ({ sheetId, zone })), this.nextPositionsToUpdate);
|
|
61715
61735
|
invalidatedPositions.delete({ sheetId, col: resultZone.left, row: resultZone.top });
|
|
61716
61736
|
this.nextPositionsToUpdate.addMany(invalidatedPositions);
|
|
61717
61737
|
}
|
|
@@ -61829,7 +61849,7 @@ class Evaluator {
|
|
|
61829
61849
|
for (const sheetId in zonesBySheetIds) {
|
|
61830
61850
|
ranges.push(...zonesBySheetIds[sheetId].map((zone) => ({ sheetId, zone })));
|
|
61831
61851
|
}
|
|
61832
|
-
return this.formulaDependencies().getCellsDependingOn(ranges);
|
|
61852
|
+
return this.formulaDependencies().getCellsDependingOn(ranges, this.nextPositionsToUpdate);
|
|
61833
61853
|
}
|
|
61834
61854
|
}
|
|
61835
61855
|
function forEachSpreadPositionInMatrix(nbColumns, nbRows, callback) {
|
|
@@ -77353,6 +77373,6 @@ exports.tokenColors = tokenColors;
|
|
|
77353
77373
|
exports.tokenize = tokenize;
|
|
77354
77374
|
|
|
77355
77375
|
|
|
77356
|
-
__info__.version = "18.2.
|
|
77357
|
-
__info__.date = "2025-
|
|
77358
|
-
__info__.hash = "
|
|
77376
|
+
__info__.version = "18.2.33";
|
|
77377
|
+
__info__.date = "2025-10-16T06:39:40.421Z";
|
|
77378
|
+
__info__.hash = "280596c";
|