@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
|
import { useEnv, useSubEnv, onWillUnmount, useComponent, status, Component, useRef, onMounted, useEffect, App, blockDom, useState, onPatched, onWillPatch, onWillUpdateProps, useExternalListener, onWillStart, xml, useChildSubEnv, markRaw, toRaw } from '@odoo/owl';
|
|
@@ -877,9 +877,7 @@ function removeIndexesFromArray(array, indexes) {
|
|
|
877
877
|
return newArray;
|
|
878
878
|
}
|
|
879
879
|
function insertItemsAtIndex(array, items, index) {
|
|
880
|
-
|
|
881
|
-
newArray.splice(index, 0, ...items);
|
|
882
|
-
return newArray;
|
|
880
|
+
return array.slice(0, index).concat(items).concat(array.slice(index));
|
|
883
881
|
}
|
|
884
882
|
function replaceItemAtIndex(array, newItem, index) {
|
|
885
883
|
const newArray = [...array];
|
|
@@ -3943,7 +3941,17 @@ function toNumberMatrix(data, argName) {
|
|
|
3943
3941
|
return toMatrix(data).map((row) => {
|
|
3944
3942
|
return row.map((cell) => {
|
|
3945
3943
|
if (typeof cell.value !== "number") {
|
|
3946
|
-
|
|
3944
|
+
let message = "";
|
|
3945
|
+
if (typeof cell === "object") {
|
|
3946
|
+
message = _t("Function [[FUNCTION_NAME]] expects number values for %s, but got an empty value.", argName);
|
|
3947
|
+
}
|
|
3948
|
+
else if (typeof cell === "string") {
|
|
3949
|
+
message = _t("Function [[FUNCTION_NAME]] expects number values for %s, but got a string.", argName);
|
|
3950
|
+
}
|
|
3951
|
+
else if (typeof cell === "boolean") {
|
|
3952
|
+
message = _t("Function [[FUNCTION_NAME]] expects number values for %s, but got a boolean.", argName);
|
|
3953
|
+
}
|
|
3954
|
+
throw new EvaluationError(message);
|
|
3947
3955
|
}
|
|
3948
3956
|
return cell.value;
|
|
3949
3957
|
});
|
|
@@ -5143,7 +5151,7 @@ function tokensToTextInternalFormat(tokens) {
|
|
|
5143
5151
|
* Replace in place tokens "mm" and "m" that denote minutes in date format with "MM" to avoid confusion with months.
|
|
5144
5152
|
*
|
|
5145
5153
|
* As per OpenXML specification, in date formats if a date token "m" or "mm" is followed by a date token "s" or
|
|
5146
|
-
* preceded by a data token "h", then it's not a month but
|
|
5154
|
+
* preceded by a data token "h", then it's not a month but a minute.
|
|
5147
5155
|
*/
|
|
5148
5156
|
function convertTokensToMinutesInDateFormat(tokens) {
|
|
5149
5157
|
const dateParts = tokens.filter((token) => token.type === "DATE_PART");
|
|
@@ -5186,6 +5194,9 @@ function internalFormatPartToFormat(internalFormat) {
|
|
|
5186
5194
|
case "REPEATED_CHAR":
|
|
5187
5195
|
format += "*" + token.value;
|
|
5188
5196
|
break;
|
|
5197
|
+
case "DATE_PART":
|
|
5198
|
+
format += token.value === "MM" ? "mm" : token.value; // Convert "MM" back to "mm" for minutes
|
|
5199
|
+
break;
|
|
5189
5200
|
default:
|
|
5190
5201
|
format += token.value;
|
|
5191
5202
|
}
|
|
@@ -9125,7 +9136,7 @@ class CellClipboardHandler extends AbstractCellClipboardHandler {
|
|
|
9125
9136
|
pasteCell(origin, target, clipboardOption) {
|
|
9126
9137
|
const { sheetId, col, row } = target;
|
|
9127
9138
|
const targetCell = this.getters.getEvaluatedCell(target);
|
|
9128
|
-
const originFormat = origin?.format
|
|
9139
|
+
const originFormat = origin?.format || origin.evaluatedCell.format;
|
|
9129
9140
|
if (clipboardOption?.pasteOption === "asValue") {
|
|
9130
9141
|
this.dispatch("UPDATE_CELL", {
|
|
9131
9142
|
...target,
|
|
@@ -12831,7 +12842,7 @@ const GROWTH = {
|
|
|
12831
12842
|
],
|
|
12832
12843
|
compute: function (knownDataY, knownDataX = [[]], newDataX = [[]], b = { value: true }) {
|
|
12833
12844
|
assertNonEmptyMatrix(knownDataY, "known_data_y");
|
|
12834
|
-
return expM(predictLinearValues(logM(toNumberMatrix(knownDataY, "
|
|
12845
|
+
return expM(predictLinearValues(logM(toNumberMatrix(knownDataY, "known_data_y")), toNumberMatrix(knownDataX, "known_data_x"), toNumberMatrix(newDataX, "new_data_y"), toBoolean(b)));
|
|
12835
12846
|
},
|
|
12836
12847
|
};
|
|
12837
12848
|
// -----------------------------------------------------------------------------
|
|
@@ -12896,7 +12907,7 @@ const LINEST = {
|
|
|
12896
12907
|
],
|
|
12897
12908
|
compute: function (dataY, dataX = [[]], calculateB = { value: true }, verbose = { value: false }) {
|
|
12898
12909
|
assertNonEmptyMatrix(dataY, "data_y");
|
|
12899
|
-
return fullLinearRegression(toNumberMatrix(dataX, "
|
|
12910
|
+
return fullLinearRegression(toNumberMatrix(dataX, "data_x"), toNumberMatrix(dataY, "data_y"), toBoolean(calculateB), toBoolean(verbose));
|
|
12900
12911
|
},
|
|
12901
12912
|
isExported: true,
|
|
12902
12913
|
};
|
|
@@ -12913,7 +12924,7 @@ const LOGEST = {
|
|
|
12913
12924
|
],
|
|
12914
12925
|
compute: function (dataY, dataX = [[]], calculateB = { value: true }, verbose = { value: false }) {
|
|
12915
12926
|
assertNonEmptyMatrix(dataY, "data_y");
|
|
12916
|
-
const coeffs = fullLinearRegression(toNumberMatrix(dataX, "
|
|
12927
|
+
const coeffs = fullLinearRegression(toNumberMatrix(dataX, "data_x"), logM(toNumberMatrix(dataY, "data_y")), toBoolean(calculateB), toBoolean(verbose));
|
|
12917
12928
|
for (let i = 0; i < coeffs.length; i++) {
|
|
12918
12929
|
coeffs[i][0] = Math.exp(coeffs[i][0]);
|
|
12919
12930
|
}
|
|
@@ -13503,7 +13514,7 @@ const TREND = {
|
|
|
13503
13514
|
],
|
|
13504
13515
|
compute: function (knownDataY, knownDataX = [[]], newDataX = [[]], b = { value: true }) {
|
|
13505
13516
|
assertNonEmptyMatrix(knownDataY, "known_data_y");
|
|
13506
|
-
return predictLinearValues(toNumberMatrix(knownDataY, "
|
|
13517
|
+
return predictLinearValues(toNumberMatrix(knownDataY, "known_data_y"), toNumberMatrix(knownDataX, "known_data_x"), toNumberMatrix(newDataX, "new_data_y"), toBoolean(b));
|
|
13507
13518
|
},
|
|
13508
13519
|
};
|
|
13509
13520
|
// -----------------------------------------------------------------------------
|
|
@@ -21045,6 +21056,10 @@ const chartShowValuesPlugin = {
|
|
|
21045
21056
|
}
|
|
21046
21057
|
const ctx = chart.ctx;
|
|
21047
21058
|
ctx.save();
|
|
21059
|
+
const { left, top, height, width } = chart.chartArea;
|
|
21060
|
+
ctx.beginPath();
|
|
21061
|
+
ctx.rect(left, top, width, height);
|
|
21062
|
+
ctx.clip();
|
|
21048
21063
|
ctx.textAlign = "center";
|
|
21049
21064
|
ctx.textBaseline = "middle";
|
|
21050
21065
|
ctx.miterLimit = 1; // Avoid sharp artifacts on strokeText
|
|
@@ -25173,6 +25188,7 @@ function getChartTimeOptions(labels, labelFormat, locale) {
|
|
|
25173
25188
|
parser: luxonFormat,
|
|
25174
25189
|
displayFormats,
|
|
25175
25190
|
unit: timeUnit ?? false,
|
|
25191
|
+
tooltipFormat: luxonFormat,
|
|
25176
25192
|
};
|
|
25177
25193
|
}
|
|
25178
25194
|
/**
|
|
@@ -26242,6 +26258,7 @@ function getLineChartScales(definition, args) {
|
|
|
26242
26258
|
};
|
|
26243
26259
|
Object.assign(scales.x, axis);
|
|
26244
26260
|
scales.x.ticks.maxTicksLimit = 15;
|
|
26261
|
+
delete scales?.x?.ticks?.callback;
|
|
26245
26262
|
}
|
|
26246
26263
|
else if (axisType === "linear") {
|
|
26247
26264
|
scales.x.type = "linear";
|
|
@@ -30835,6 +30852,74 @@ iconsOnCellRegistry.add("conditional_formatting", (getters, position) => {
|
|
|
30835
30852
|
return undefined;
|
|
30836
30853
|
});
|
|
30837
30854
|
|
|
30855
|
+
/**
|
|
30856
|
+
* Get the relative path between two files
|
|
30857
|
+
*
|
|
30858
|
+
* Eg.:
|
|
30859
|
+
* from "folder1/file1.txt" to "folder2/file2.txt" => "../folder2/file2.txt"
|
|
30860
|
+
*/
|
|
30861
|
+
function getRelativePath(from, to) {
|
|
30862
|
+
const fromPathParts = from.split("/");
|
|
30863
|
+
const toPathParts = to.split("/");
|
|
30864
|
+
let relPath = "";
|
|
30865
|
+
let startIndex = 0;
|
|
30866
|
+
for (let i = 0; i < fromPathParts.length - 1; i++) {
|
|
30867
|
+
if (fromPathParts[i] === toPathParts[i]) {
|
|
30868
|
+
startIndex++;
|
|
30869
|
+
}
|
|
30870
|
+
else {
|
|
30871
|
+
relPath += "../";
|
|
30872
|
+
}
|
|
30873
|
+
}
|
|
30874
|
+
relPath += toPathParts.slice(startIndex).join("/");
|
|
30875
|
+
return relPath;
|
|
30876
|
+
}
|
|
30877
|
+
/**
|
|
30878
|
+
* Convert an array of element into an object where the objects keys were the elements position in the array.
|
|
30879
|
+
* Can give an offset as argument, and all the array indexes will we shifted by this offset in the returned object.
|
|
30880
|
+
*
|
|
30881
|
+
* eg. : ["a", "b"] => {0:"a", 1:"b"}
|
|
30882
|
+
*/
|
|
30883
|
+
function arrayToObject(array, indexOffset = 0) {
|
|
30884
|
+
const obj = {};
|
|
30885
|
+
for (let i = 0; i < array.length; i++) {
|
|
30886
|
+
if (array[i]) {
|
|
30887
|
+
obj[i + indexOffset] = array[i];
|
|
30888
|
+
}
|
|
30889
|
+
}
|
|
30890
|
+
return obj;
|
|
30891
|
+
}
|
|
30892
|
+
/**
|
|
30893
|
+
* In xlsx we can have string with unicode characters with the format _x00fa_.
|
|
30894
|
+
* Replace with characters understandable by JS
|
|
30895
|
+
*/
|
|
30896
|
+
function fixXlsxUnicode(str) {
|
|
30897
|
+
return str.replace(/_x([0-9a-zA-Z]{4})_/g, (match, code) => {
|
|
30898
|
+
return String.fromCharCode(parseInt(code, 16));
|
|
30899
|
+
});
|
|
30900
|
+
}
|
|
30901
|
+
/** Get a header in the SheetData. Create the header if it doesn't exist in the SheetData */
|
|
30902
|
+
function getSheetDataHeader(sheetData, dimension, index) {
|
|
30903
|
+
if (dimension === "COL") {
|
|
30904
|
+
if (!sheetData.cols[index]) {
|
|
30905
|
+
sheetData.cols[index] = {};
|
|
30906
|
+
}
|
|
30907
|
+
return sheetData.cols[index];
|
|
30908
|
+
}
|
|
30909
|
+
if (!sheetData.rows[index]) {
|
|
30910
|
+
sheetData.rows[index] = {};
|
|
30911
|
+
}
|
|
30912
|
+
return sheetData.rows[index];
|
|
30913
|
+
}
|
|
30914
|
+
/** Prefix the string by "=" if the string looks like a formula */
|
|
30915
|
+
function prefixFormulaWithEqual(formula) {
|
|
30916
|
+
if (formula[0] === "=") {
|
|
30917
|
+
return formula;
|
|
30918
|
+
}
|
|
30919
|
+
const tokens = tokenize(formula);
|
|
30920
|
+
return tokens.length === 1 && tokens[0].type !== "REFERENCE" ? formula : "=" + formula;
|
|
30921
|
+
}
|
|
30922
|
+
|
|
30838
30923
|
/**
|
|
30839
30924
|
* Map of the different types of conversions warnings and their name in error messages
|
|
30840
30925
|
*/
|
|
@@ -31342,66 +31427,6 @@ function hexaToInt(hex) {
|
|
|
31342
31427
|
*/
|
|
31343
31428
|
const DEFAULT_SYSTEM_COLOR = "FF000000";
|
|
31344
31429
|
|
|
31345
|
-
/**
|
|
31346
|
-
* Get the relative path between two files
|
|
31347
|
-
*
|
|
31348
|
-
* Eg.:
|
|
31349
|
-
* from "folder1/file1.txt" to "folder2/file2.txt" => "../folder2/file2.txt"
|
|
31350
|
-
*/
|
|
31351
|
-
function getRelativePath(from, to) {
|
|
31352
|
-
const fromPathParts = from.split("/");
|
|
31353
|
-
const toPathParts = to.split("/");
|
|
31354
|
-
let relPath = "";
|
|
31355
|
-
let startIndex = 0;
|
|
31356
|
-
for (let i = 0; i < fromPathParts.length - 1; i++) {
|
|
31357
|
-
if (fromPathParts[i] === toPathParts[i]) {
|
|
31358
|
-
startIndex++;
|
|
31359
|
-
}
|
|
31360
|
-
else {
|
|
31361
|
-
relPath += "../";
|
|
31362
|
-
}
|
|
31363
|
-
}
|
|
31364
|
-
relPath += toPathParts.slice(startIndex).join("/");
|
|
31365
|
-
return relPath;
|
|
31366
|
-
}
|
|
31367
|
-
/**
|
|
31368
|
-
* Convert an array of element into an object where the objects keys were the elements position in the array.
|
|
31369
|
-
* Can give an offset as argument, and all the array indexes will we shifted by this offset in the returned object.
|
|
31370
|
-
*
|
|
31371
|
-
* eg. : ["a", "b"] => {0:"a", 1:"b"}
|
|
31372
|
-
*/
|
|
31373
|
-
function arrayToObject(array, indexOffset = 0) {
|
|
31374
|
-
const obj = {};
|
|
31375
|
-
for (let i = 0; i < array.length; i++) {
|
|
31376
|
-
if (array[i]) {
|
|
31377
|
-
obj[i + indexOffset] = array[i];
|
|
31378
|
-
}
|
|
31379
|
-
}
|
|
31380
|
-
return obj;
|
|
31381
|
-
}
|
|
31382
|
-
/**
|
|
31383
|
-
* In xlsx we can have string with unicode characters with the format _x00fa_.
|
|
31384
|
-
* Replace with characters understandable by JS
|
|
31385
|
-
*/
|
|
31386
|
-
function fixXlsxUnicode(str) {
|
|
31387
|
-
return str.replace(/_x([0-9a-zA-Z]{4})_/g, (match, code) => {
|
|
31388
|
-
return String.fromCharCode(parseInt(code, 16));
|
|
31389
|
-
});
|
|
31390
|
-
}
|
|
31391
|
-
/** Get a header in the SheetData. Create the header if it doesn't exist in the SheetData */
|
|
31392
|
-
function getSheetDataHeader(sheetData, dimension, index) {
|
|
31393
|
-
if (dimension === "COL") {
|
|
31394
|
-
if (!sheetData.cols[index]) {
|
|
31395
|
-
sheetData.cols[index] = {};
|
|
31396
|
-
}
|
|
31397
|
-
return sheetData.cols[index];
|
|
31398
|
-
}
|
|
31399
|
-
if (!sheetData.rows[index]) {
|
|
31400
|
-
sheetData.rows[index] = {};
|
|
31401
|
-
}
|
|
31402
|
-
return sheetData.rows[index];
|
|
31403
|
-
}
|
|
31404
|
-
|
|
31405
31430
|
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;
|
|
31406
31431
|
/**
|
|
31407
31432
|
* Convert excel format to o_spreadsheet format
|
|
@@ -31611,9 +31636,9 @@ function convertConditionalFormats(xlsxCfs, dxfs, warningManager) {
|
|
|
31611
31636
|
if (!rule.operator || !rule.formula || rule.formula.length === 0)
|
|
31612
31637
|
continue;
|
|
31613
31638
|
operator = convertCFCellIsOperator(rule.operator);
|
|
31614
|
-
values.push(
|
|
31639
|
+
values.push(prefixFormulaWithEqual(rule.formula[0]));
|
|
31615
31640
|
if (rule.formula.length === 2) {
|
|
31616
|
-
values.push(
|
|
31641
|
+
values.push(prefixFormulaWithEqual(rule.formula[1]));
|
|
31617
31642
|
}
|
|
31618
31643
|
break;
|
|
31619
31644
|
}
|
|
@@ -31771,11 +31796,6 @@ function convertIcons(xlsxIconSet, index) {
|
|
|
31771
31796
|
? ICON_SETS[iconSet].neutral
|
|
31772
31797
|
: ICON_SETS[iconSet].good;
|
|
31773
31798
|
}
|
|
31774
|
-
/** Prefix the string by "=" if the string looks like a formula */
|
|
31775
|
-
function prefixFormula(formula) {
|
|
31776
|
-
const tokens = tokenize(formula);
|
|
31777
|
-
return tokens.length === 1 && tokens[0].type !== "REFERENCE" ? formula : "=" + formula;
|
|
31778
|
-
}
|
|
31779
31799
|
// ---------------------------------------------------------------------------
|
|
31780
31800
|
// Warnings
|
|
31781
31801
|
// ---------------------------------------------------------------------------
|
|
@@ -32212,7 +32232,7 @@ function convertDataValidationRules(xlsxDataValidations, warningManager) {
|
|
|
32212
32232
|
dvRules.push(decimalRule);
|
|
32213
32233
|
break;
|
|
32214
32234
|
case "list":
|
|
32215
|
-
const listRule =
|
|
32235
|
+
const listRule = convertListRule(dvId++, dv);
|
|
32216
32236
|
dvRules.push(listRule);
|
|
32217
32237
|
break;
|
|
32218
32238
|
case "date":
|
|
@@ -32232,9 +32252,9 @@ function convertDataValidationRules(xlsxDataValidations, warningManager) {
|
|
|
32232
32252
|
return dvRules;
|
|
32233
32253
|
}
|
|
32234
32254
|
function convertDecimalRule(id, dv) {
|
|
32235
|
-
const values = [dv.formula1.toString()];
|
|
32255
|
+
const values = [prefixFormulaWithEqual(dv.formula1.toString())];
|
|
32236
32256
|
if (dv.formula2) {
|
|
32237
|
-
values.push(dv.formula2.toString());
|
|
32257
|
+
values.push(prefixFormulaWithEqual(dv.formula2.toString()));
|
|
32238
32258
|
}
|
|
32239
32259
|
return {
|
|
32240
32260
|
id: id.toString(),
|
|
@@ -32246,7 +32266,7 @@ function convertDecimalRule(id, dv) {
|
|
|
32246
32266
|
},
|
|
32247
32267
|
};
|
|
32248
32268
|
}
|
|
32249
|
-
function
|
|
32269
|
+
function convertListRule(id, dv) {
|
|
32250
32270
|
const formula1 = dv.formula1.toString();
|
|
32251
32271
|
const isRangeRule = rangeReference.test(formula1);
|
|
32252
32272
|
return {
|
|
@@ -32262,9 +32282,9 @@ function convertListrule(id, dv) {
|
|
|
32262
32282
|
}
|
|
32263
32283
|
function convertDateRule(id, dv) {
|
|
32264
32284
|
let criterion;
|
|
32265
|
-
const values = [dv.formula1.toString()];
|
|
32285
|
+
const values = [prefixFormulaWithEqual(dv.formula1.toString())];
|
|
32266
32286
|
if (dv.formula2) {
|
|
32267
|
-
values.push(dv.formula2.toString());
|
|
32287
|
+
values.push(prefixFormulaWithEqual(dv.formula2.toString()));
|
|
32268
32288
|
criterion = {
|
|
32269
32289
|
type: XLSX_DV_DATE_OPERATOR_TO_DV_TYPE_MAPPING[dv.operator],
|
|
32270
32290
|
values: getDateCriterionFormattedValues(values, DEFAULT_LOCALE),
|
|
@@ -32291,7 +32311,7 @@ function convertCustomRule(id, dv) {
|
|
|
32291
32311
|
isBlocking: dv.errorStyle !== "warning",
|
|
32292
32312
|
criterion: {
|
|
32293
32313
|
type: "customFormula",
|
|
32294
|
-
values: [
|
|
32314
|
+
values: [prefixFormulaWithEqual(dv.formula1.toString())],
|
|
32295
32315
|
},
|
|
32296
32316
|
};
|
|
32297
32317
|
}
|
|
@@ -47290,12 +47310,13 @@ class DataValidationEditor extends Component {
|
|
|
47290
47310
|
onCloseSidePanel: { type: Function, optional: true },
|
|
47291
47311
|
};
|
|
47292
47312
|
state = useState({ rule: this.defaultDataValidationRule, errors: [] });
|
|
47313
|
+
editingSheetId;
|
|
47293
47314
|
setup() {
|
|
47315
|
+
this.editingSheetId = this.env.model.getters.getActiveSheetId();
|
|
47294
47316
|
if (this.props.rule) {
|
|
47295
|
-
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
47296
47317
|
this.state.rule = {
|
|
47297
47318
|
...this.props.rule,
|
|
47298
|
-
ranges: this.props.rule.ranges.map((range) => this.env.model.getters.getRangeString(range,
|
|
47319
|
+
ranges: this.props.rule.ranges.map((range) => this.env.model.getters.getRangeString(range, this.editingSheetId)),
|
|
47299
47320
|
};
|
|
47300
47321
|
this.state.rule.criterion.type = this.props.rule.criterion.type;
|
|
47301
47322
|
}
|
|
@@ -47329,7 +47350,6 @@ class DataValidationEditor extends Component {
|
|
|
47329
47350
|
const locale = this.env.model.getters.getLocale();
|
|
47330
47351
|
const criterion = rule.criterion;
|
|
47331
47352
|
const criterionEvaluator = dataValidationEvaluatorRegistry.get(criterion.type);
|
|
47332
|
-
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
47333
47353
|
const values = criterion.values
|
|
47334
47354
|
.slice(0, criterionEvaluator.numberOfValues(criterion))
|
|
47335
47355
|
.map((value) => value?.trim())
|
|
@@ -47337,8 +47357,8 @@ class DataValidationEditor extends Component {
|
|
|
47337
47357
|
.map((value) => canonicalizeContent(value, locale));
|
|
47338
47358
|
rule.criterion = { ...criterion, values };
|
|
47339
47359
|
return {
|
|
47340
|
-
sheetId,
|
|
47341
|
-
ranges: this.state.rule.ranges.map((xc) => this.env.model.getters.getRangeDataFromXc(
|
|
47360
|
+
sheetId: this.editingSheetId,
|
|
47361
|
+
ranges: this.state.rule.ranges.map((xc) => this.env.model.getters.getRangeDataFromXc(this.editingSheetId, xc)),
|
|
47342
47362
|
rule,
|
|
47343
47363
|
};
|
|
47344
47364
|
}
|
|
@@ -47868,6 +47888,7 @@ css /* scss */ `
|
|
|
47868
47888
|
.o-button {
|
|
47869
47889
|
height: 19px;
|
|
47870
47890
|
width: 19px;
|
|
47891
|
+
box-sizing: content-box;
|
|
47871
47892
|
.o-icon {
|
|
47872
47893
|
height: 14px;
|
|
47873
47894
|
width: 14px;
|
|
@@ -48631,7 +48652,7 @@ class PivotMeasureEditor extends Component {
|
|
|
48631
48652
|
return undefined;
|
|
48632
48653
|
}
|
|
48633
48654
|
get isCalculatedMeasureInvalid() {
|
|
48634
|
-
return
|
|
48655
|
+
return compile(this.props.measure.computedBy?.formula ?? "").isBadExpression;
|
|
48635
48656
|
}
|
|
48636
48657
|
}
|
|
48637
48658
|
|
|
@@ -59763,7 +59784,7 @@ class HeaderSizePlugin extends CorePlugin {
|
|
|
59763
59784
|
let sizes = [...this.sizes[cmd.sheetId][cmd.dimension]];
|
|
59764
59785
|
const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
|
|
59765
59786
|
const baseSize = sizes[cmd.base];
|
|
59766
|
-
sizes
|
|
59787
|
+
sizes = insertItemsAtIndex(sizes, Array(cmd.quantity).fill(baseSize), addIndex);
|
|
59767
59788
|
this.history.update("sizes", cmd.sheetId, cmd.dimension, sizes);
|
|
59768
59789
|
break;
|
|
59769
59790
|
}
|
|
@@ -59915,9 +59936,8 @@ class HeaderVisibilityPlugin extends CorePlugin {
|
|
|
59915
59936
|
break;
|
|
59916
59937
|
}
|
|
59917
59938
|
case "ADD_COLUMNS_ROWS": {
|
|
59918
|
-
const hiddenHeaders = [...this.hiddenHeaders[cmd.sheetId][cmd.dimension]];
|
|
59919
59939
|
const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
|
|
59920
|
-
hiddenHeaders.
|
|
59940
|
+
const hiddenHeaders = insertItemsAtIndex([...this.hiddenHeaders[cmd.sheetId][cmd.dimension]], Array(cmd.quantity).fill(false), addIndex);
|
|
59921
59941
|
this.history.update("hiddenHeaders", cmd.sheetId, cmd.dimension, hiddenHeaders);
|
|
59922
59942
|
break;
|
|
59923
59943
|
}
|
|
@@ -63981,12 +64001,12 @@ class SpreadsheetRTree {
|
|
|
63981
64001
|
this.rTrees[sheetId].remove(item, this.rtreeItemComparer);
|
|
63982
64002
|
}
|
|
63983
64003
|
rtreeItemComparer(left, right) {
|
|
63984
|
-
return (left.
|
|
63985
|
-
left.boundingBox.sheetId === right.boundingBox.sheetId &&
|
|
64004
|
+
return (left.boundingBox.sheetId === right.boundingBox.sheetId &&
|
|
63986
64005
|
left.boundingBox?.zone.left === right.boundingBox.zone.left &&
|
|
63987
64006
|
left.boundingBox?.zone.top === right.boundingBox.zone.top &&
|
|
63988
64007
|
left.boundingBox?.zone.right === right.boundingBox.zone.right &&
|
|
63989
|
-
left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom
|
|
64008
|
+
left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom &&
|
|
64009
|
+
deepEquals(left.data, right.data));
|
|
63990
64010
|
}
|
|
63991
64011
|
}
|
|
63992
64012
|
/**
|
|
@@ -64059,7 +64079,7 @@ class FormulaDependencyGraph {
|
|
|
64059
64079
|
* in the correct order they should be evaluated.
|
|
64060
64080
|
* This is called a topological ordering (excluding cycles)
|
|
64061
64081
|
*/
|
|
64062
|
-
getCellsDependingOn(ranges) {
|
|
64082
|
+
getCellsDependingOn(ranges, ignore) {
|
|
64063
64083
|
const visited = this.createEmptyPositionSet();
|
|
64064
64084
|
const queue = Array.from(ranges).reverse();
|
|
64065
64085
|
while (queue.length > 0) {
|
|
@@ -64074,7 +64094,7 @@ class FormulaDependencyGraph {
|
|
|
64074
64094
|
const impactedPositions = this.rTree.search(range).map((dep) => dep.data);
|
|
64075
64095
|
const nextInQueue = {};
|
|
64076
64096
|
for (const position of impactedPositions) {
|
|
64077
|
-
if (!visited.has(position)) {
|
|
64097
|
+
if (!visited.has(position) && !ignore.has(position)) {
|
|
64078
64098
|
if (!nextInQueue[position.sheetId]) {
|
|
64079
64099
|
nextInQueue[position.sheetId] = [];
|
|
64080
64100
|
}
|
|
@@ -64631,7 +64651,7 @@ class Evaluator {
|
|
|
64631
64651
|
}
|
|
64632
64652
|
invalidatePositionsDependingOnSpread(sheetId, resultZone) {
|
|
64633
64653
|
// the result matrix is split in 2 zones to exclude the array formula position
|
|
64634
|
-
const invalidatedPositions = this.formulaDependencies().getCellsDependingOn(excludeTopLeft(resultZone).map((zone) => ({ sheetId, zone })));
|
|
64654
|
+
const invalidatedPositions = this.formulaDependencies().getCellsDependingOn(excludeTopLeft(resultZone).map((zone) => ({ sheetId, zone })), this.nextPositionsToUpdate);
|
|
64635
64655
|
invalidatedPositions.delete({ sheetId, col: resultZone.left, row: resultZone.top });
|
|
64636
64656
|
this.nextPositionsToUpdate.addMany(invalidatedPositions);
|
|
64637
64657
|
}
|
|
@@ -64749,7 +64769,7 @@ class Evaluator {
|
|
|
64749
64769
|
for (const sheetId in zonesBySheetIds) {
|
|
64750
64770
|
ranges.push(...zonesBySheetIds[sheetId].map((zone) => ({ sheetId, zone })));
|
|
64751
64771
|
}
|
|
64752
|
-
return this.formulaDependencies().getCellsDependingOn(ranges);
|
|
64772
|
+
return this.formulaDependencies().getCellsDependingOn(ranges, this.nextPositionsToUpdate);
|
|
64753
64773
|
}
|
|
64754
64774
|
}
|
|
64755
64775
|
function forEachSpreadPositionInMatrix(nbColumns, nbRows, callback) {
|
|
@@ -65961,7 +65981,8 @@ class DynamicTablesPlugin extends CoreViewPlugin {
|
|
|
65961
65981
|
const topLeft = { col: unionZone.left, row: unionZone.top, sheetId };
|
|
65962
65982
|
const parentSpreadingCell = this.getters.getArrayFormulaSpreadingOn(topLeft);
|
|
65963
65983
|
if (!parentSpreadingCell) {
|
|
65964
|
-
|
|
65984
|
+
const evaluatedCell = this.getters.getEvaluatedCell(topLeft);
|
|
65985
|
+
return (evaluatedCell.value === CellErrorType.SpilledBlocked && !evaluatedCell.errorOriginPosition);
|
|
65965
65986
|
}
|
|
65966
65987
|
else if (deepEquals(parentSpreadingCell, topLeft) && getZoneArea(unionZone) === 1) {
|
|
65967
65988
|
return true;
|
|
@@ -80986,6 +81007,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
|
|
|
80986
81007
|
export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, CommandResult, CorePlugin, CoreViewPlugin, DispatchResult, EvaluationError, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, chartHelpers, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
|
|
80987
81008
|
|
|
80988
81009
|
|
|
80989
|
-
__info__.version = "18.3.
|
|
80990
|
-
__info__.date = "2025-
|
|
80991
|
-
__info__.hash = "
|
|
81010
|
+
__info__.version = "18.3.24";
|
|
81011
|
+
__info__.date = "2025-10-16T06:38:12.942Z";
|
|
81012
|
+
__info__.hash = "f13dd1c";
|