@odoo/o-spreadsheet 18.2.32 → 18.2.34
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 +142 -110
- package/dist/o-spreadsheet.d.ts +10 -10
- package/dist/o-spreadsheet.esm.js +142 -110
- package/dist/o-spreadsheet.iife.js +142 -110
- package/dist/o-spreadsheet.iife.min.js +382 -381
- package/dist/o_spreadsheet.xml +7 -6
- package/package.json +2 -2
|
@@ -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.34
|
|
6
|
+
* @date 2025-11-12T14:15:32.431Z
|
|
7
|
+
* @hash 9ca0c4c
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
'use strict';
|
|
@@ -3916,7 +3916,17 @@ function toNumberMatrix(data, argName) {
|
|
|
3916
3916
|
return toMatrix(data).map((row) => {
|
|
3917
3917
|
return row.map((cell) => {
|
|
3918
3918
|
if (typeof cell.value !== "number") {
|
|
3919
|
-
|
|
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);
|
|
3920
3930
|
}
|
|
3921
3931
|
return cell.value;
|
|
3922
3932
|
});
|
|
@@ -8818,7 +8828,7 @@ class CellClipboardHandler extends AbstractCellClipboardHandler {
|
|
|
8818
8828
|
pasteCell(origin, target, clipboardOption) {
|
|
8819
8829
|
const { sheetId, col, row } = target;
|
|
8820
8830
|
const targetCell = this.getters.getEvaluatedCell(target);
|
|
8821
|
-
const originFormat = origin?.format
|
|
8831
|
+
const originFormat = origin?.format || origin.evaluatedCell.format;
|
|
8822
8832
|
if (clipboardOption?.pasteOption === "asValue") {
|
|
8823
8833
|
this.dispatch("UPDATE_CELL", {
|
|
8824
8834
|
...target,
|
|
@@ -10439,6 +10449,10 @@ const chartShowValuesPlugin = {
|
|
|
10439
10449
|
}
|
|
10440
10450
|
const ctx = chart.ctx;
|
|
10441
10451
|
ctx.save();
|
|
10452
|
+
const { left, top, height, width } = chart.chartArea;
|
|
10453
|
+
ctx.beginPath();
|
|
10454
|
+
ctx.rect(left, top, width, height);
|
|
10455
|
+
ctx.clip();
|
|
10442
10456
|
ctx.textAlign = "center";
|
|
10443
10457
|
ctx.textBaseline = "middle";
|
|
10444
10458
|
ctx.miterLimit = 1; // Avoid sharp artifacts on strokeText
|
|
@@ -10887,7 +10901,7 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
|
|
|
10887
10901
|
return {
|
|
10888
10902
|
background: context.background,
|
|
10889
10903
|
type: "scorecard",
|
|
10890
|
-
keyValue: context.range
|
|
10904
|
+
keyValue: context.range?.[0]?.dataRange,
|
|
10891
10905
|
title: context.title || { text: "" },
|
|
10892
10906
|
baselineMode: DEFAULT_SCORECARD_BASELINE_MODE,
|
|
10893
10907
|
baselineColorUp: DEFAULT_SCORECARD_BASELINE_COLOR_UP,
|
|
@@ -13644,7 +13658,7 @@ const GROWTH = {
|
|
|
13644
13658
|
],
|
|
13645
13659
|
compute: function (knownDataY, knownDataX = [[]], newDataX = [[]], b = { value: true }) {
|
|
13646
13660
|
assertNonEmptyMatrix(knownDataY, "known_data_y");
|
|
13647
|
-
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)));
|
|
13648
13662
|
},
|
|
13649
13663
|
};
|
|
13650
13664
|
// -----------------------------------------------------------------------------
|
|
@@ -13709,7 +13723,7 @@ const LINEST = {
|
|
|
13709
13723
|
],
|
|
13710
13724
|
compute: function (dataY, dataX = [[]], calculateB = { value: true }, verbose = { value: false }) {
|
|
13711
13725
|
assertNonEmptyMatrix(dataY, "data_y");
|
|
13712
|
-
return fullLinearRegression(toNumberMatrix(dataX, "
|
|
13726
|
+
return fullLinearRegression(toNumberMatrix(dataX, "data_x"), toNumberMatrix(dataY, "data_y"), toBoolean(calculateB), toBoolean(verbose));
|
|
13713
13727
|
},
|
|
13714
13728
|
isExported: true,
|
|
13715
13729
|
};
|
|
@@ -13726,7 +13740,7 @@ const LOGEST = {
|
|
|
13726
13740
|
],
|
|
13727
13741
|
compute: function (dataY, dataX = [[]], calculateB = { value: true }, verbose = { value: false }) {
|
|
13728
13742
|
assertNonEmptyMatrix(dataY, "data_y");
|
|
13729
|
-
const coeffs = fullLinearRegression(toNumberMatrix(dataX, "
|
|
13743
|
+
const coeffs = fullLinearRegression(toNumberMatrix(dataX, "data_x"), logM(toNumberMatrix(dataY, "data_y")), toBoolean(calculateB), toBoolean(verbose));
|
|
13730
13744
|
for (let i = 0; i < coeffs.length; i++) {
|
|
13731
13745
|
coeffs[i][0] = Math.exp(coeffs[i][0]);
|
|
13732
13746
|
}
|
|
@@ -14316,7 +14330,7 @@ const TREND = {
|
|
|
14316
14330
|
],
|
|
14317
14331
|
compute: function (knownDataY, knownDataX = [[]], newDataX = [[]], b = { value: true }) {
|
|
14318
14332
|
assertNonEmptyMatrix(knownDataY, "known_data_y");
|
|
14319
|
-
return predictLinearValues(toNumberMatrix(knownDataY, "
|
|
14333
|
+
return predictLinearValues(toNumberMatrix(knownDataY, "known_data_y"), toNumberMatrix(knownDataX, "known_data_x"), toNumberMatrix(newDataX, "new_data_y"), toBoolean(b));
|
|
14320
14334
|
},
|
|
14321
14335
|
};
|
|
14322
14336
|
// -----------------------------------------------------------------------------
|
|
@@ -18572,28 +18586,38 @@ function getTokenNextReferenceType(xc) {
|
|
|
18572
18586
|
return xc;
|
|
18573
18587
|
}
|
|
18574
18588
|
/**
|
|
18575
|
-
* Returns the given XC with the given reference type.
|
|
18589
|
+
* Returns the given XC with the given reference type.
|
|
18576
18590
|
*/
|
|
18577
18591
|
function setXcToFixedReferenceType(xc, referenceType) {
|
|
18578
|
-
|
|
18579
|
-
|
|
18580
|
-
|
|
18592
|
+
let sheetName;
|
|
18593
|
+
({ sheetName, xc } = splitReference(xc));
|
|
18594
|
+
sheetName = sheetName ? sheetName + "!" : "";
|
|
18581
18595
|
xc = xc.replace(/\$/g, "");
|
|
18582
|
-
|
|
18596
|
+
const splitIndex = xc.indexOf(":");
|
|
18597
|
+
if (splitIndex >= 0) {
|
|
18598
|
+
return `${sheetName}${_setXcToFixedReferenceType(xc.slice(0, splitIndex), referenceType)}:${_setXcToFixedReferenceType(xc.slice(splitIndex + 1), referenceType)}`;
|
|
18599
|
+
}
|
|
18600
|
+
else {
|
|
18601
|
+
return sheetName + _setXcToFixedReferenceType(xc, referenceType);
|
|
18602
|
+
}
|
|
18603
|
+
}
|
|
18604
|
+
function _setXcToFixedReferenceType(xc, referenceType) {
|
|
18605
|
+
const indexOfNumber = xc.search(/[0-9]/);
|
|
18606
|
+
const hasCol = indexOfNumber !== 0;
|
|
18607
|
+
const hasRow = indexOfNumber >= 0;
|
|
18583
18608
|
switch (referenceType) {
|
|
18584
18609
|
case "col":
|
|
18610
|
+
if (!hasCol)
|
|
18611
|
+
return xc;
|
|
18585
18612
|
return "$" + xc;
|
|
18586
18613
|
case "row":
|
|
18587
|
-
|
|
18614
|
+
if (!hasRow)
|
|
18615
|
+
return xc;
|
|
18588
18616
|
return xc.slice(0, indexOfNumber) + "$" + xc.slice(indexOfNumber);
|
|
18589
18617
|
case "colrow":
|
|
18590
|
-
|
|
18591
|
-
if (indexOfNumber === -1 || indexOfNumber === 0) {
|
|
18592
|
-
// no row number (eg. A) or no column (eg. 1)
|
|
18618
|
+
if (!hasRow || !hasCol)
|
|
18593
18619
|
return "$" + xc;
|
|
18594
|
-
|
|
18595
|
-
xc = xc.slice(0, indexOfNumber) + "$" + xc.slice(indexOfNumber);
|
|
18596
|
-
return "$" + xc;
|
|
18620
|
+
return "$" + xc.slice(0, indexOfNumber) + "$" + xc.slice(indexOfNumber);
|
|
18597
18621
|
case "none":
|
|
18598
18622
|
return xc;
|
|
18599
18623
|
}
|
|
@@ -21108,6 +21132,7 @@ class AbstractComposerStore extends SpreadsheetStore {
|
|
|
21108
21132
|
this.highlightStore.register(this);
|
|
21109
21133
|
this.onDispose(() => {
|
|
21110
21134
|
this.highlightStore.unRegister(this);
|
|
21135
|
+
this._cancelEdition();
|
|
21111
21136
|
});
|
|
21112
21137
|
}
|
|
21113
21138
|
handleEvent(event) {
|
|
@@ -23747,6 +23772,74 @@ iconsOnCellRegistry.add("conditional_formatting", (getters, position) => {
|
|
|
23747
23772
|
}
|
|
23748
23773
|
});
|
|
23749
23774
|
|
|
23775
|
+
/**
|
|
23776
|
+
* Get the relative path between two files
|
|
23777
|
+
*
|
|
23778
|
+
* Eg.:
|
|
23779
|
+
* from "folder1/file1.txt" to "folder2/file2.txt" => "../folder2/file2.txt"
|
|
23780
|
+
*/
|
|
23781
|
+
function getRelativePath(from, to) {
|
|
23782
|
+
const fromPathParts = from.split("/");
|
|
23783
|
+
const toPathParts = to.split("/");
|
|
23784
|
+
let relPath = "";
|
|
23785
|
+
let startIndex = 0;
|
|
23786
|
+
for (let i = 0; i < fromPathParts.length - 1; i++) {
|
|
23787
|
+
if (fromPathParts[i] === toPathParts[i]) {
|
|
23788
|
+
startIndex++;
|
|
23789
|
+
}
|
|
23790
|
+
else {
|
|
23791
|
+
relPath += "../";
|
|
23792
|
+
}
|
|
23793
|
+
}
|
|
23794
|
+
relPath += toPathParts.slice(startIndex).join("/");
|
|
23795
|
+
return relPath;
|
|
23796
|
+
}
|
|
23797
|
+
/**
|
|
23798
|
+
* Convert an array of element into an object where the objects keys were the elements position in the array.
|
|
23799
|
+
* Can give an offset as argument, and all the array indexes will we shifted by this offset in the returned object.
|
|
23800
|
+
*
|
|
23801
|
+
* eg. : ["a", "b"] => {0:"a", 1:"b"}
|
|
23802
|
+
*/
|
|
23803
|
+
function arrayToObject(array, indexOffset = 0) {
|
|
23804
|
+
const obj = {};
|
|
23805
|
+
for (let i = 0; i < array.length; i++) {
|
|
23806
|
+
if (array[i]) {
|
|
23807
|
+
obj[i + indexOffset] = array[i];
|
|
23808
|
+
}
|
|
23809
|
+
}
|
|
23810
|
+
return obj;
|
|
23811
|
+
}
|
|
23812
|
+
/**
|
|
23813
|
+
* In xlsx we can have string with unicode characters with the format _x00fa_.
|
|
23814
|
+
* Replace with characters understandable by JS
|
|
23815
|
+
*/
|
|
23816
|
+
function fixXlsxUnicode(str) {
|
|
23817
|
+
return str.replace(/_x([0-9a-zA-Z]{4})_/g, (match, code) => {
|
|
23818
|
+
return String.fromCharCode(parseInt(code, 16));
|
|
23819
|
+
});
|
|
23820
|
+
}
|
|
23821
|
+
/** Get a header in the SheetData. Create the header if it doesn't exist in the SheetData */
|
|
23822
|
+
function getSheetDataHeader(sheetData, dimension, index) {
|
|
23823
|
+
if (dimension === "COL") {
|
|
23824
|
+
if (!sheetData.cols[index]) {
|
|
23825
|
+
sheetData.cols[index] = {};
|
|
23826
|
+
}
|
|
23827
|
+
return sheetData.cols[index];
|
|
23828
|
+
}
|
|
23829
|
+
if (!sheetData.rows[index]) {
|
|
23830
|
+
sheetData.rows[index] = {};
|
|
23831
|
+
}
|
|
23832
|
+
return sheetData.rows[index];
|
|
23833
|
+
}
|
|
23834
|
+
/** Prefix the string by "=" if the string looks like a formula */
|
|
23835
|
+
function prefixFormulaWithEqual(formula) {
|
|
23836
|
+
if (formula[0] === "=") {
|
|
23837
|
+
return formula;
|
|
23838
|
+
}
|
|
23839
|
+
const tokens = tokenize(formula);
|
|
23840
|
+
return tokens.length === 1 && tokens[0].type !== "REFERENCE" ? formula : "=" + formula;
|
|
23841
|
+
}
|
|
23842
|
+
|
|
23750
23843
|
/**
|
|
23751
23844
|
* Map of the different types of conversions warnings and their name in error messages
|
|
23752
23845
|
*/
|
|
@@ -24254,66 +24347,6 @@ function hexaToInt(hex) {
|
|
|
24254
24347
|
*/
|
|
24255
24348
|
const DEFAULT_SYSTEM_COLOR = "FF000000";
|
|
24256
24349
|
|
|
24257
|
-
/**
|
|
24258
|
-
* Get the relative path between two files
|
|
24259
|
-
*
|
|
24260
|
-
* Eg.:
|
|
24261
|
-
* from "folder1/file1.txt" to "folder2/file2.txt" => "../folder2/file2.txt"
|
|
24262
|
-
*/
|
|
24263
|
-
function getRelativePath(from, to) {
|
|
24264
|
-
const fromPathParts = from.split("/");
|
|
24265
|
-
const toPathParts = to.split("/");
|
|
24266
|
-
let relPath = "";
|
|
24267
|
-
let startIndex = 0;
|
|
24268
|
-
for (let i = 0; i < fromPathParts.length - 1; i++) {
|
|
24269
|
-
if (fromPathParts[i] === toPathParts[i]) {
|
|
24270
|
-
startIndex++;
|
|
24271
|
-
}
|
|
24272
|
-
else {
|
|
24273
|
-
relPath += "../";
|
|
24274
|
-
}
|
|
24275
|
-
}
|
|
24276
|
-
relPath += toPathParts.slice(startIndex).join("/");
|
|
24277
|
-
return relPath;
|
|
24278
|
-
}
|
|
24279
|
-
/**
|
|
24280
|
-
* Convert an array of element into an object where the objects keys were the elements position in the array.
|
|
24281
|
-
* Can give an offset as argument, and all the array indexes will we shifted by this offset in the returned object.
|
|
24282
|
-
*
|
|
24283
|
-
* eg. : ["a", "b"] => {0:"a", 1:"b"}
|
|
24284
|
-
*/
|
|
24285
|
-
function arrayToObject(array, indexOffset = 0) {
|
|
24286
|
-
const obj = {};
|
|
24287
|
-
for (let i = 0; i < array.length; i++) {
|
|
24288
|
-
if (array[i]) {
|
|
24289
|
-
obj[i + indexOffset] = array[i];
|
|
24290
|
-
}
|
|
24291
|
-
}
|
|
24292
|
-
return obj;
|
|
24293
|
-
}
|
|
24294
|
-
/**
|
|
24295
|
-
* In xlsx we can have string with unicode characters with the format _x00fa_.
|
|
24296
|
-
* Replace with characters understandable by JS
|
|
24297
|
-
*/
|
|
24298
|
-
function fixXlsxUnicode(str) {
|
|
24299
|
-
return str.replace(/_x([0-9a-zA-Z]{4})_/g, (match, code) => {
|
|
24300
|
-
return String.fromCharCode(parseInt(code, 16));
|
|
24301
|
-
});
|
|
24302
|
-
}
|
|
24303
|
-
/** Get a header in the SheetData. Create the header if it doesn't exist in the SheetData */
|
|
24304
|
-
function getSheetDataHeader(sheetData, dimension, index) {
|
|
24305
|
-
if (dimension === "COL") {
|
|
24306
|
-
if (!sheetData.cols[index]) {
|
|
24307
|
-
sheetData.cols[index] = {};
|
|
24308
|
-
}
|
|
24309
|
-
return sheetData.cols[index];
|
|
24310
|
-
}
|
|
24311
|
-
if (!sheetData.rows[index]) {
|
|
24312
|
-
sheetData.rows[index] = {};
|
|
24313
|
-
}
|
|
24314
|
-
return sheetData.rows[index];
|
|
24315
|
-
}
|
|
24316
|
-
|
|
24317
24350
|
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;
|
|
24318
24351
|
/**
|
|
24319
24352
|
* Convert excel format to o_spreadsheet format
|
|
@@ -24523,9 +24556,9 @@ function convertConditionalFormats(xlsxCfs, dxfs, warningManager) {
|
|
|
24523
24556
|
if (!rule.operator || !rule.formula || rule.formula.length === 0)
|
|
24524
24557
|
continue;
|
|
24525
24558
|
operator = convertCFCellIsOperator(rule.operator);
|
|
24526
|
-
values.push(
|
|
24559
|
+
values.push(prefixFormulaWithEqual(rule.formula[0]));
|
|
24527
24560
|
if (rule.formula.length === 2) {
|
|
24528
|
-
values.push(
|
|
24561
|
+
values.push(prefixFormulaWithEqual(rule.formula[1]));
|
|
24529
24562
|
}
|
|
24530
24563
|
break;
|
|
24531
24564
|
}
|
|
@@ -24683,11 +24716,6 @@ function convertIcons(xlsxIconSet, index) {
|
|
|
24683
24716
|
? ICON_SETS[iconSet].neutral
|
|
24684
24717
|
: ICON_SETS[iconSet].good;
|
|
24685
24718
|
}
|
|
24686
|
-
/** Prefix the string by "=" if the string looks like a formula */
|
|
24687
|
-
function prefixFormula(formula) {
|
|
24688
|
-
const tokens = tokenize(formula);
|
|
24689
|
-
return tokens.length === 1 && tokens[0].type !== "REFERENCE" ? formula : "=" + formula;
|
|
24690
|
-
}
|
|
24691
24719
|
// ---------------------------------------------------------------------------
|
|
24692
24720
|
// Warnings
|
|
24693
24721
|
// ---------------------------------------------------------------------------
|
|
@@ -25108,7 +25136,7 @@ function convertDataValidationRules(xlsxDataValidations, warningManager) {
|
|
|
25108
25136
|
dvRules.push(decimalRule);
|
|
25109
25137
|
break;
|
|
25110
25138
|
case "list":
|
|
25111
|
-
const listRule =
|
|
25139
|
+
const listRule = convertListRule(dvId++, dv);
|
|
25112
25140
|
dvRules.push(listRule);
|
|
25113
25141
|
break;
|
|
25114
25142
|
case "date":
|
|
@@ -25128,9 +25156,9 @@ function convertDataValidationRules(xlsxDataValidations, warningManager) {
|
|
|
25128
25156
|
return dvRules;
|
|
25129
25157
|
}
|
|
25130
25158
|
function convertDecimalRule(id, dv) {
|
|
25131
|
-
const values = [dv.formula1.toString()];
|
|
25159
|
+
const values = [prefixFormulaWithEqual(dv.formula1.toString())];
|
|
25132
25160
|
if (dv.formula2) {
|
|
25133
|
-
values.push(dv.formula2.toString());
|
|
25161
|
+
values.push(prefixFormulaWithEqual(dv.formula2.toString()));
|
|
25134
25162
|
}
|
|
25135
25163
|
return {
|
|
25136
25164
|
id: id.toString(),
|
|
@@ -25142,7 +25170,7 @@ function convertDecimalRule(id, dv) {
|
|
|
25142
25170
|
},
|
|
25143
25171
|
};
|
|
25144
25172
|
}
|
|
25145
|
-
function
|
|
25173
|
+
function convertListRule(id, dv) {
|
|
25146
25174
|
const formula1 = dv.formula1.toString();
|
|
25147
25175
|
const isRangeRule = rangeReference.test(formula1);
|
|
25148
25176
|
return {
|
|
@@ -25158,9 +25186,9 @@ function convertListrule(id, dv) {
|
|
|
25158
25186
|
}
|
|
25159
25187
|
function convertDateRule(id, dv) {
|
|
25160
25188
|
let criterion;
|
|
25161
|
-
const values = [dv.formula1.toString()];
|
|
25189
|
+
const values = [prefixFormulaWithEqual(dv.formula1.toString())];
|
|
25162
25190
|
if (dv.formula2) {
|
|
25163
|
-
values.push(dv.formula2.toString());
|
|
25191
|
+
values.push(prefixFormulaWithEqual(dv.formula2.toString()));
|
|
25164
25192
|
criterion = {
|
|
25165
25193
|
type: XLSX_DV_DATE_OPERATOR_TO_DV_TYPE_MAPPING[dv.operator],
|
|
25166
25194
|
values: getDateCriterionFormattedValues(values, DEFAULT_LOCALE),
|
|
@@ -25187,7 +25215,7 @@ function convertCustomRule(id, dv) {
|
|
|
25187
25215
|
isBlocking: dv.errorStyle !== "warning",
|
|
25188
25216
|
criterion: {
|
|
25189
25217
|
type: "customFormula",
|
|
25190
|
-
values: [
|
|
25218
|
+
values: [prefixFormulaWithEqual(dv.formula1.toString())],
|
|
25191
25219
|
},
|
|
25192
25220
|
};
|
|
25193
25221
|
}
|
|
@@ -28919,6 +28947,7 @@ function getChartTimeOptions(labels, labelFormat, locale) {
|
|
|
28919
28947
|
parser: luxonFormat,
|
|
28920
28948
|
displayFormats,
|
|
28921
28949
|
unit: timeUnit ?? false,
|
|
28950
|
+
tooltipFormat: luxonFormat,
|
|
28922
28951
|
};
|
|
28923
28952
|
}
|
|
28924
28953
|
/**
|
|
@@ -30097,6 +30126,7 @@ function getLineChartScales(definition, args) {
|
|
|
30097
30126
|
};
|
|
30098
30127
|
Object.assign(scales.x, axis);
|
|
30099
30128
|
scales.x.ticks.maxTicksLimit = 15;
|
|
30129
|
+
delete scales?.x?.ticks?.callback;
|
|
30100
30130
|
}
|
|
30101
30131
|
else if (axisType === "linear") {
|
|
30102
30132
|
scales.x.type = "linear";
|
|
@@ -31125,7 +31155,7 @@ class GaugeChart extends AbstractChart {
|
|
|
31125
31155
|
background: context.background,
|
|
31126
31156
|
title: context.title || { text: "" },
|
|
31127
31157
|
type: "gauge",
|
|
31128
|
-
dataRange: context.range
|
|
31158
|
+
dataRange: context.range?.[0]?.dataRange,
|
|
31129
31159
|
sectionRule: {
|
|
31130
31160
|
colors: {
|
|
31131
31161
|
lowerColor: DEFAULT_GAUGE_LOWER_COLOR,
|
|
@@ -44208,6 +44238,7 @@ class DataValidationInput extends owl.Component {
|
|
|
44208
44238
|
placeholder: this.placeholder,
|
|
44209
44239
|
class: "o-sidePanel-composer",
|
|
44210
44240
|
defaultRangeSheetId: this.env.model.getters.getActiveSheetId(),
|
|
44241
|
+
defaultStatic: true,
|
|
44211
44242
|
};
|
|
44212
44243
|
}
|
|
44213
44244
|
get errorMessage() {
|
|
@@ -44552,12 +44583,13 @@ class DataValidationEditor extends owl.Component {
|
|
|
44552
44583
|
onCloseSidePanel: { type: Function, optional: true },
|
|
44553
44584
|
};
|
|
44554
44585
|
state = owl.useState({ rule: this.defaultDataValidationRule, errors: [] });
|
|
44586
|
+
editingSheetId;
|
|
44555
44587
|
setup() {
|
|
44588
|
+
this.editingSheetId = this.env.model.getters.getActiveSheetId();
|
|
44556
44589
|
if (this.props.rule) {
|
|
44557
|
-
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
44558
44590
|
this.state.rule = {
|
|
44559
44591
|
...this.props.rule,
|
|
44560
|
-
ranges: this.props.rule.ranges.map((range) => this.env.model.getters.getRangeString(range,
|
|
44592
|
+
ranges: this.props.rule.ranges.map((range) => this.env.model.getters.getRangeString(range, this.editingSheetId)),
|
|
44561
44593
|
};
|
|
44562
44594
|
this.state.rule.criterion.type = this.props.rule.criterion.type;
|
|
44563
44595
|
}
|
|
@@ -44591,7 +44623,6 @@ class DataValidationEditor extends owl.Component {
|
|
|
44591
44623
|
const locale = this.env.model.getters.getLocale();
|
|
44592
44624
|
const criterion = rule.criterion;
|
|
44593
44625
|
const criterionEvaluator = dataValidationEvaluatorRegistry.get(criterion.type);
|
|
44594
|
-
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
44595
44626
|
const values = criterion.values
|
|
44596
44627
|
.slice(0, criterionEvaluator.numberOfValues(criterion))
|
|
44597
44628
|
.map((value) => value?.trim())
|
|
@@ -44599,8 +44630,8 @@ class DataValidationEditor extends owl.Component {
|
|
|
44599
44630
|
.map((value) => canonicalizeContent(value, locale));
|
|
44600
44631
|
rule.criterion = { ...criterion, values };
|
|
44601
44632
|
return {
|
|
44602
|
-
sheetId,
|
|
44603
|
-
ranges: this.state.rule.ranges.map((xc) => this.env.model.getters.getRangeDataFromXc(
|
|
44633
|
+
sheetId: this.editingSheetId,
|
|
44634
|
+
ranges: this.state.rule.ranges.map((xc) => this.env.model.getters.getRangeDataFromXc(this.editingSheetId, xc)),
|
|
44604
44635
|
rule,
|
|
44605
44636
|
};
|
|
44606
44637
|
}
|
|
@@ -45130,6 +45161,7 @@ css /* scss */ `
|
|
|
45130
45161
|
.o-button {
|
|
45131
45162
|
height: 19px;
|
|
45132
45163
|
width: 19px;
|
|
45164
|
+
box-sizing: content-box;
|
|
45133
45165
|
.o-icon {
|
|
45134
45166
|
height: 14px;
|
|
45135
45167
|
width: 14px;
|
|
@@ -57834,7 +57866,7 @@ class RangeAdapter {
|
|
|
57834
57866
|
let sheetName = "";
|
|
57835
57867
|
if (prefixSheet) {
|
|
57836
57868
|
if (rangeImpl.invalidSheetName) {
|
|
57837
|
-
sheetName = rangeImpl.invalidSheetName;
|
|
57869
|
+
sheetName = getCanonicalSymbolName(rangeImpl.invalidSheetName);
|
|
57838
57870
|
}
|
|
57839
57871
|
else {
|
|
57840
57872
|
sheetName = getCanonicalSymbolName(this.getters.getSheetName(rangeImpl.sheetId));
|
|
@@ -61139,7 +61171,7 @@ class FormulaDependencyGraph {
|
|
|
61139
61171
|
* in the correct order they should be evaluated.
|
|
61140
61172
|
* This is called a topological ordering (excluding cycles)
|
|
61141
61173
|
*/
|
|
61142
|
-
getCellsDependingOn(ranges) {
|
|
61174
|
+
getCellsDependingOn(ranges, ignore) {
|
|
61143
61175
|
const visited = this.createEmptyPositionSet();
|
|
61144
61176
|
const queue = Array.from(ranges).reverse();
|
|
61145
61177
|
while (queue.length > 0) {
|
|
@@ -61154,7 +61186,7 @@ class FormulaDependencyGraph {
|
|
|
61154
61186
|
const impactedPositions = this.rTree.search(range).map((dep) => dep.data);
|
|
61155
61187
|
const nextInQueue = {};
|
|
61156
61188
|
for (const position of impactedPositions) {
|
|
61157
|
-
if (!visited.has(position)) {
|
|
61189
|
+
if (!visited.has(position) && !ignore.has(position)) {
|
|
61158
61190
|
if (!nextInQueue[position.sheetId]) {
|
|
61159
61191
|
nextInQueue[position.sheetId] = [];
|
|
61160
61192
|
}
|
|
@@ -61711,7 +61743,7 @@ class Evaluator {
|
|
|
61711
61743
|
}
|
|
61712
61744
|
invalidatePositionsDependingOnSpread(sheetId, resultZone) {
|
|
61713
61745
|
// 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 })));
|
|
61746
|
+
const invalidatedPositions = this.formulaDependencies().getCellsDependingOn(excludeTopLeft(resultZone).map((zone) => ({ sheetId, zone })), this.nextPositionsToUpdate);
|
|
61715
61747
|
invalidatedPositions.delete({ sheetId, col: resultZone.left, row: resultZone.top });
|
|
61716
61748
|
this.nextPositionsToUpdate.addMany(invalidatedPositions);
|
|
61717
61749
|
}
|
|
@@ -61829,7 +61861,7 @@ class Evaluator {
|
|
|
61829
61861
|
for (const sheetId in zonesBySheetIds) {
|
|
61830
61862
|
ranges.push(...zonesBySheetIds[sheetId].map((zone) => ({ sheetId, zone })));
|
|
61831
61863
|
}
|
|
61832
|
-
return this.formulaDependencies().getCellsDependingOn(ranges);
|
|
61864
|
+
return this.formulaDependencies().getCellsDependingOn(ranges, this.nextPositionsToUpdate);
|
|
61833
61865
|
}
|
|
61834
61866
|
}
|
|
61835
61867
|
function forEachSpreadPositionInMatrix(nbColumns, nbRows, callback) {
|
|
@@ -77353,6 +77385,6 @@ exports.tokenColors = tokenColors;
|
|
|
77353
77385
|
exports.tokenize = tokenize;
|
|
77354
77386
|
|
|
77355
77387
|
|
|
77356
|
-
__info__.version = "18.2.
|
|
77357
|
-
__info__.date = "2025-
|
|
77358
|
-
__info__.hash = "
|
|
77388
|
+
__info__.version = "18.2.34";
|
|
77389
|
+
__info__.date = "2025-11-12T14:15:32.431Z";
|
|
77390
|
+
__info__.hash = "9ca0c4c";
|