@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.
@@ -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.31
6
- * @date 2025-09-23T12:31:15.573Z
7
- * @hash 839667e
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
- const newArray = [...array];
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
- throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects number values for %s, but got a %s.", argName, typeof cell.value));
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 an minute.
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 ?? origin.evaluatedCell.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, "the first argument (known_data_y)")), toNumberMatrix(knownDataX, "the second argument (known_data_x)"), toNumberMatrix(newDataX, "the third argument (new_data_y)"), toBoolean(b)));
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, "the first argument (data_y)"), toNumberMatrix(dataY, "the second argument (data_x)"), toBoolean(calculateB), toBoolean(verbose));
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, "the second argument (data_x)"), logM(toNumberMatrix(dataY, "the first argument (data_y)")), toBoolean(calculateB), toBoolean(verbose));
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, "the first argument (known_data_y)"), toNumberMatrix(knownDataX, "the second argument (known_data_x)"), toNumberMatrix(newDataX, "the third argument (new_data_y)"), toBoolean(b));
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(prefixFormula(rule.formula[0]));
24548
+ values.push(prefixFormulaWithEqual(rule.formula[0]));
24526
24549
  if (rule.formula.length === 2) {
24527
- values.push(prefixFormula(rule.formula[1]));
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 = convertListrule(dvId++, dv);
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 convertListrule(id, dv) {
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: [`=${dv.formula1.toString()}`],
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, sheetId)),
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(sheetId, xc)),
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 this.env.model.getters.getMeasureCompiledFormula(this.props.measure).isBadExpression;
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.splice(addIndex, 0, ...Array(cmd.quantity).fill(baseSize));
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.splice(addIndex, 0, ...Array(cmd.quantity).fill(false));
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.data == right.data &&
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.31";
77357
- __info__.date = "2025-09-23T12:31:15.573Z";
77358
- __info__.hash = "839667e";
77376
+ __info__.version = "18.2.33";
77377
+ __info__.date = "2025-10-16T06:39:40.421Z";
77378
+ __info__.hash = "280596c";