@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.
@@ -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.32
6
- * @date 2025-10-07T09:59:52.165Z
7
- * @hash a42c448
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
- 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);
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 ?? origin.evaluatedCell.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 ? context.range[0].dataRange : undefined,
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, "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)));
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, "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));
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, "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));
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, "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));
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. The XC string should not contain a sheet name.
18589
+ * Returns the given XC with the given reference type.
18576
18590
  */
18577
18591
  function setXcToFixedReferenceType(xc, referenceType) {
18578
- if (xc.includes("!")) {
18579
- throw new Error("The given XC should not contain a sheet name");
18580
- }
18592
+ let sheetName;
18593
+ ({ sheetName, xc } = splitReference(xc));
18594
+ sheetName = sheetName ? sheetName + "!" : "";
18581
18595
  xc = xc.replace(/\$/g, "");
18582
- let indexOfNumber;
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
- indexOfNumber = xc.search(/[0-9]/);
18614
+ if (!hasRow)
18615
+ return xc;
18588
18616
  return xc.slice(0, indexOfNumber) + "$" + xc.slice(indexOfNumber);
18589
18617
  case "colrow":
18590
- indexOfNumber = xc.search(/[0-9]/);
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(prefixFormula(rule.formula[0]));
24559
+ values.push(prefixFormulaWithEqual(rule.formula[0]));
24527
24560
  if (rule.formula.length === 2) {
24528
- values.push(prefixFormula(rule.formula[1]));
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 = convertListrule(dvId++, dv);
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 convertListrule(id, dv) {
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: [`=${dv.formula1.toString()}`],
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 ? context.range[0].dataRange : undefined,
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, sheetId)),
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(sheetId, xc)),
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.32";
77357
- __info__.date = "2025-10-07T09:59:52.165Z";
77358
- __info__.hash = "a42c448";
77388
+ __info__.version = "18.2.34";
77389
+ __info__.date = "2025-11-12T14:15:32.431Z";
77390
+ __info__.hash = "9ca0c4c";