@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
  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';
@@ -3914,7 +3914,17 @@ function toNumberMatrix(data, argName) {
3914
3914
  return toMatrix(data).map((row) => {
3915
3915
  return row.map((cell) => {
3916
3916
  if (typeof cell.value !== "number") {
3917
- throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects number values for %s, but got a %s.", argName, typeof cell.value));
3917
+ let message = "";
3918
+ if (typeof cell === "object") {
3919
+ message = _t("Function [[FUNCTION_NAME]] expects number values for %s, but got an empty value.", argName);
3920
+ }
3921
+ else if (typeof cell === "string") {
3922
+ message = _t("Function [[FUNCTION_NAME]] expects number values for %s, but got a string.", argName);
3923
+ }
3924
+ else if (typeof cell === "boolean") {
3925
+ message = _t("Function [[FUNCTION_NAME]] expects number values for %s, but got a boolean.", argName);
3926
+ }
3927
+ throw new EvaluationError(message);
3918
3928
  }
3919
3929
  return cell.value;
3920
3930
  });
@@ -8816,7 +8826,7 @@ class CellClipboardHandler extends AbstractCellClipboardHandler {
8816
8826
  pasteCell(origin, target, clipboardOption) {
8817
8827
  const { sheetId, col, row } = target;
8818
8828
  const targetCell = this.getters.getEvaluatedCell(target);
8819
- const originFormat = origin?.format ?? origin.evaluatedCell.format;
8829
+ const originFormat = origin?.format || origin.evaluatedCell.format;
8820
8830
  if (clipboardOption?.pasteOption === "asValue") {
8821
8831
  this.dispatch("UPDATE_CELL", {
8822
8832
  ...target,
@@ -10437,6 +10447,10 @@ const chartShowValuesPlugin = {
10437
10447
  }
10438
10448
  const ctx = chart.ctx;
10439
10449
  ctx.save();
10450
+ const { left, top, height, width } = chart.chartArea;
10451
+ ctx.beginPath();
10452
+ ctx.rect(left, top, width, height);
10453
+ ctx.clip();
10440
10454
  ctx.textAlign = "center";
10441
10455
  ctx.textBaseline = "middle";
10442
10456
  ctx.miterLimit = 1; // Avoid sharp artifacts on strokeText
@@ -10885,7 +10899,7 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
10885
10899
  return {
10886
10900
  background: context.background,
10887
10901
  type: "scorecard",
10888
- keyValue: context.range ? context.range[0].dataRange : undefined,
10902
+ keyValue: context.range?.[0]?.dataRange,
10889
10903
  title: context.title || { text: "" },
10890
10904
  baselineMode: DEFAULT_SCORECARD_BASELINE_MODE,
10891
10905
  baselineColorUp: DEFAULT_SCORECARD_BASELINE_COLOR_UP,
@@ -13642,7 +13656,7 @@ const GROWTH = {
13642
13656
  ],
13643
13657
  compute: function (knownDataY, knownDataX = [[]], newDataX = [[]], b = { value: true }) {
13644
13658
  assertNonEmptyMatrix(knownDataY, "known_data_y");
13645
- 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)));
13659
+ return expM(predictLinearValues(logM(toNumberMatrix(knownDataY, "known_data_y")), toNumberMatrix(knownDataX, "known_data_x"), toNumberMatrix(newDataX, "new_data_y"), toBoolean(b)));
13646
13660
  },
13647
13661
  };
13648
13662
  // -----------------------------------------------------------------------------
@@ -13707,7 +13721,7 @@ const LINEST = {
13707
13721
  ],
13708
13722
  compute: function (dataY, dataX = [[]], calculateB = { value: true }, verbose = { value: false }) {
13709
13723
  assertNonEmptyMatrix(dataY, "data_y");
13710
- return fullLinearRegression(toNumberMatrix(dataX, "the first argument (data_y)"), toNumberMatrix(dataY, "the second argument (data_x)"), toBoolean(calculateB), toBoolean(verbose));
13724
+ return fullLinearRegression(toNumberMatrix(dataX, "data_x"), toNumberMatrix(dataY, "data_y"), toBoolean(calculateB), toBoolean(verbose));
13711
13725
  },
13712
13726
  isExported: true,
13713
13727
  };
@@ -13724,7 +13738,7 @@ const LOGEST = {
13724
13738
  ],
13725
13739
  compute: function (dataY, dataX = [[]], calculateB = { value: true }, verbose = { value: false }) {
13726
13740
  assertNonEmptyMatrix(dataY, "data_y");
13727
- const coeffs = fullLinearRegression(toNumberMatrix(dataX, "the second argument (data_x)"), logM(toNumberMatrix(dataY, "the first argument (data_y)")), toBoolean(calculateB), toBoolean(verbose));
13741
+ const coeffs = fullLinearRegression(toNumberMatrix(dataX, "data_x"), logM(toNumberMatrix(dataY, "data_y")), toBoolean(calculateB), toBoolean(verbose));
13728
13742
  for (let i = 0; i < coeffs.length; i++) {
13729
13743
  coeffs[i][0] = Math.exp(coeffs[i][0]);
13730
13744
  }
@@ -14314,7 +14328,7 @@ const TREND = {
14314
14328
  ],
14315
14329
  compute: function (knownDataY, knownDataX = [[]], newDataX = [[]], b = { value: true }) {
14316
14330
  assertNonEmptyMatrix(knownDataY, "known_data_y");
14317
- 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));
14331
+ return predictLinearValues(toNumberMatrix(knownDataY, "known_data_y"), toNumberMatrix(knownDataX, "known_data_x"), toNumberMatrix(newDataX, "new_data_y"), toBoolean(b));
14318
14332
  },
14319
14333
  };
14320
14334
  // -----------------------------------------------------------------------------
@@ -18570,28 +18584,38 @@ function getTokenNextReferenceType(xc) {
18570
18584
  return xc;
18571
18585
  }
18572
18586
  /**
18573
- * Returns the given XC with the given reference type. The XC string should not contain a sheet name.
18587
+ * Returns the given XC with the given reference type.
18574
18588
  */
18575
18589
  function setXcToFixedReferenceType(xc, referenceType) {
18576
- if (xc.includes("!")) {
18577
- throw new Error("The given XC should not contain a sheet name");
18578
- }
18590
+ let sheetName;
18591
+ ({ sheetName, xc } = splitReference(xc));
18592
+ sheetName = sheetName ? sheetName + "!" : "";
18579
18593
  xc = xc.replace(/\$/g, "");
18580
- let indexOfNumber;
18594
+ const splitIndex = xc.indexOf(":");
18595
+ if (splitIndex >= 0) {
18596
+ return `${sheetName}${_setXcToFixedReferenceType(xc.slice(0, splitIndex), referenceType)}:${_setXcToFixedReferenceType(xc.slice(splitIndex + 1), referenceType)}`;
18597
+ }
18598
+ else {
18599
+ return sheetName + _setXcToFixedReferenceType(xc, referenceType);
18600
+ }
18601
+ }
18602
+ function _setXcToFixedReferenceType(xc, referenceType) {
18603
+ const indexOfNumber = xc.search(/[0-9]/);
18604
+ const hasCol = indexOfNumber !== 0;
18605
+ const hasRow = indexOfNumber >= 0;
18581
18606
  switch (referenceType) {
18582
18607
  case "col":
18608
+ if (!hasCol)
18609
+ return xc;
18583
18610
  return "$" + xc;
18584
18611
  case "row":
18585
- indexOfNumber = xc.search(/[0-9]/);
18612
+ if (!hasRow)
18613
+ return xc;
18586
18614
  return xc.slice(0, indexOfNumber) + "$" + xc.slice(indexOfNumber);
18587
18615
  case "colrow":
18588
- indexOfNumber = xc.search(/[0-9]/);
18589
- if (indexOfNumber === -1 || indexOfNumber === 0) {
18590
- // no row number (eg. A) or no column (eg. 1)
18616
+ if (!hasRow || !hasCol)
18591
18617
  return "$" + xc;
18592
- }
18593
- xc = xc.slice(0, indexOfNumber) + "$" + xc.slice(indexOfNumber);
18594
- return "$" + xc;
18618
+ return "$" + xc.slice(0, indexOfNumber) + "$" + xc.slice(indexOfNumber);
18595
18619
  case "none":
18596
18620
  return xc;
18597
18621
  }
@@ -21106,6 +21130,7 @@ class AbstractComposerStore extends SpreadsheetStore {
21106
21130
  this.highlightStore.register(this);
21107
21131
  this.onDispose(() => {
21108
21132
  this.highlightStore.unRegister(this);
21133
+ this._cancelEdition();
21109
21134
  });
21110
21135
  }
21111
21136
  handleEvent(event) {
@@ -23745,6 +23770,74 @@ iconsOnCellRegistry.add("conditional_formatting", (getters, position) => {
23745
23770
  }
23746
23771
  });
23747
23772
 
23773
+ /**
23774
+ * Get the relative path between two files
23775
+ *
23776
+ * Eg.:
23777
+ * from "folder1/file1.txt" to "folder2/file2.txt" => "../folder2/file2.txt"
23778
+ */
23779
+ function getRelativePath(from, to) {
23780
+ const fromPathParts = from.split("/");
23781
+ const toPathParts = to.split("/");
23782
+ let relPath = "";
23783
+ let startIndex = 0;
23784
+ for (let i = 0; i < fromPathParts.length - 1; i++) {
23785
+ if (fromPathParts[i] === toPathParts[i]) {
23786
+ startIndex++;
23787
+ }
23788
+ else {
23789
+ relPath += "../";
23790
+ }
23791
+ }
23792
+ relPath += toPathParts.slice(startIndex).join("/");
23793
+ return relPath;
23794
+ }
23795
+ /**
23796
+ * Convert an array of element into an object where the objects keys were the elements position in the array.
23797
+ * Can give an offset as argument, and all the array indexes will we shifted by this offset in the returned object.
23798
+ *
23799
+ * eg. : ["a", "b"] => {0:"a", 1:"b"}
23800
+ */
23801
+ function arrayToObject(array, indexOffset = 0) {
23802
+ const obj = {};
23803
+ for (let i = 0; i < array.length; i++) {
23804
+ if (array[i]) {
23805
+ obj[i + indexOffset] = array[i];
23806
+ }
23807
+ }
23808
+ return obj;
23809
+ }
23810
+ /**
23811
+ * In xlsx we can have string with unicode characters with the format _x00fa_.
23812
+ * Replace with characters understandable by JS
23813
+ */
23814
+ function fixXlsxUnicode(str) {
23815
+ return str.replace(/_x([0-9a-zA-Z]{4})_/g, (match, code) => {
23816
+ return String.fromCharCode(parseInt(code, 16));
23817
+ });
23818
+ }
23819
+ /** Get a header in the SheetData. Create the header if it doesn't exist in the SheetData */
23820
+ function getSheetDataHeader(sheetData, dimension, index) {
23821
+ if (dimension === "COL") {
23822
+ if (!sheetData.cols[index]) {
23823
+ sheetData.cols[index] = {};
23824
+ }
23825
+ return sheetData.cols[index];
23826
+ }
23827
+ if (!sheetData.rows[index]) {
23828
+ sheetData.rows[index] = {};
23829
+ }
23830
+ return sheetData.rows[index];
23831
+ }
23832
+ /** Prefix the string by "=" if the string looks like a formula */
23833
+ function prefixFormulaWithEqual(formula) {
23834
+ if (formula[0] === "=") {
23835
+ return formula;
23836
+ }
23837
+ const tokens = tokenize(formula);
23838
+ return tokens.length === 1 && tokens[0].type !== "REFERENCE" ? formula : "=" + formula;
23839
+ }
23840
+
23748
23841
  /**
23749
23842
  * Map of the different types of conversions warnings and their name in error messages
23750
23843
  */
@@ -24252,66 +24345,6 @@ function hexaToInt(hex) {
24252
24345
  */
24253
24346
  const DEFAULT_SYSTEM_COLOR = "FF000000";
24254
24347
 
24255
- /**
24256
- * Get the relative path between two files
24257
- *
24258
- * Eg.:
24259
- * from "folder1/file1.txt" to "folder2/file2.txt" => "../folder2/file2.txt"
24260
- */
24261
- function getRelativePath(from, to) {
24262
- const fromPathParts = from.split("/");
24263
- const toPathParts = to.split("/");
24264
- let relPath = "";
24265
- let startIndex = 0;
24266
- for (let i = 0; i < fromPathParts.length - 1; i++) {
24267
- if (fromPathParts[i] === toPathParts[i]) {
24268
- startIndex++;
24269
- }
24270
- else {
24271
- relPath += "../";
24272
- }
24273
- }
24274
- relPath += toPathParts.slice(startIndex).join("/");
24275
- return relPath;
24276
- }
24277
- /**
24278
- * Convert an array of element into an object where the objects keys were the elements position in the array.
24279
- * Can give an offset as argument, and all the array indexes will we shifted by this offset in the returned object.
24280
- *
24281
- * eg. : ["a", "b"] => {0:"a", 1:"b"}
24282
- */
24283
- function arrayToObject(array, indexOffset = 0) {
24284
- const obj = {};
24285
- for (let i = 0; i < array.length; i++) {
24286
- if (array[i]) {
24287
- obj[i + indexOffset] = array[i];
24288
- }
24289
- }
24290
- return obj;
24291
- }
24292
- /**
24293
- * In xlsx we can have string with unicode characters with the format _x00fa_.
24294
- * Replace with characters understandable by JS
24295
- */
24296
- function fixXlsxUnicode(str) {
24297
- return str.replace(/_x([0-9a-zA-Z]{4})_/g, (match, code) => {
24298
- return String.fromCharCode(parseInt(code, 16));
24299
- });
24300
- }
24301
- /** Get a header in the SheetData. Create the header if it doesn't exist in the SheetData */
24302
- function getSheetDataHeader(sheetData, dimension, index) {
24303
- if (dimension === "COL") {
24304
- if (!sheetData.cols[index]) {
24305
- sheetData.cols[index] = {};
24306
- }
24307
- return sheetData.cols[index];
24308
- }
24309
- if (!sheetData.rows[index]) {
24310
- sheetData.rows[index] = {};
24311
- }
24312
- return sheetData.rows[index];
24313
- }
24314
-
24315
24348
  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;
24316
24349
  /**
24317
24350
  * Convert excel format to o_spreadsheet format
@@ -24521,9 +24554,9 @@ function convertConditionalFormats(xlsxCfs, dxfs, warningManager) {
24521
24554
  if (!rule.operator || !rule.formula || rule.formula.length === 0)
24522
24555
  continue;
24523
24556
  operator = convertCFCellIsOperator(rule.operator);
24524
- values.push(prefixFormula(rule.formula[0]));
24557
+ values.push(prefixFormulaWithEqual(rule.formula[0]));
24525
24558
  if (rule.formula.length === 2) {
24526
- values.push(prefixFormula(rule.formula[1]));
24559
+ values.push(prefixFormulaWithEqual(rule.formula[1]));
24527
24560
  }
24528
24561
  break;
24529
24562
  }
@@ -24681,11 +24714,6 @@ function convertIcons(xlsxIconSet, index) {
24681
24714
  ? ICON_SETS[iconSet].neutral
24682
24715
  : ICON_SETS[iconSet].good;
24683
24716
  }
24684
- /** Prefix the string by "=" if the string looks like a formula */
24685
- function prefixFormula(formula) {
24686
- const tokens = tokenize(formula);
24687
- return tokens.length === 1 && tokens[0].type !== "REFERENCE" ? formula : "=" + formula;
24688
- }
24689
24717
  // ---------------------------------------------------------------------------
24690
24718
  // Warnings
24691
24719
  // ---------------------------------------------------------------------------
@@ -25106,7 +25134,7 @@ function convertDataValidationRules(xlsxDataValidations, warningManager) {
25106
25134
  dvRules.push(decimalRule);
25107
25135
  break;
25108
25136
  case "list":
25109
- const listRule = convertListrule(dvId++, dv);
25137
+ const listRule = convertListRule(dvId++, dv);
25110
25138
  dvRules.push(listRule);
25111
25139
  break;
25112
25140
  case "date":
@@ -25126,9 +25154,9 @@ function convertDataValidationRules(xlsxDataValidations, warningManager) {
25126
25154
  return dvRules;
25127
25155
  }
25128
25156
  function convertDecimalRule(id, dv) {
25129
- const values = [dv.formula1.toString()];
25157
+ const values = [prefixFormulaWithEqual(dv.formula1.toString())];
25130
25158
  if (dv.formula2) {
25131
- values.push(dv.formula2.toString());
25159
+ values.push(prefixFormulaWithEqual(dv.formula2.toString()));
25132
25160
  }
25133
25161
  return {
25134
25162
  id: id.toString(),
@@ -25140,7 +25168,7 @@ function convertDecimalRule(id, dv) {
25140
25168
  },
25141
25169
  };
25142
25170
  }
25143
- function convertListrule(id, dv) {
25171
+ function convertListRule(id, dv) {
25144
25172
  const formula1 = dv.formula1.toString();
25145
25173
  const isRangeRule = rangeReference.test(formula1);
25146
25174
  return {
@@ -25156,9 +25184,9 @@ function convertListrule(id, dv) {
25156
25184
  }
25157
25185
  function convertDateRule(id, dv) {
25158
25186
  let criterion;
25159
- const values = [dv.formula1.toString()];
25187
+ const values = [prefixFormulaWithEqual(dv.formula1.toString())];
25160
25188
  if (dv.formula2) {
25161
- values.push(dv.formula2.toString());
25189
+ values.push(prefixFormulaWithEqual(dv.formula2.toString()));
25162
25190
  criterion = {
25163
25191
  type: XLSX_DV_DATE_OPERATOR_TO_DV_TYPE_MAPPING[dv.operator],
25164
25192
  values: getDateCriterionFormattedValues(values, DEFAULT_LOCALE),
@@ -25185,7 +25213,7 @@ function convertCustomRule(id, dv) {
25185
25213
  isBlocking: dv.errorStyle !== "warning",
25186
25214
  criterion: {
25187
25215
  type: "customFormula",
25188
- values: [`=${dv.formula1.toString()}`],
25216
+ values: [prefixFormulaWithEqual(dv.formula1.toString())],
25189
25217
  },
25190
25218
  };
25191
25219
  }
@@ -28917,6 +28945,7 @@ function getChartTimeOptions(labels, labelFormat, locale) {
28917
28945
  parser: luxonFormat,
28918
28946
  displayFormats,
28919
28947
  unit: timeUnit ?? false,
28948
+ tooltipFormat: luxonFormat,
28920
28949
  };
28921
28950
  }
28922
28951
  /**
@@ -30095,6 +30124,7 @@ function getLineChartScales(definition, args) {
30095
30124
  };
30096
30125
  Object.assign(scales.x, axis);
30097
30126
  scales.x.ticks.maxTicksLimit = 15;
30127
+ delete scales?.x?.ticks?.callback;
30098
30128
  }
30099
30129
  else if (axisType === "linear") {
30100
30130
  scales.x.type = "linear";
@@ -31123,7 +31153,7 @@ class GaugeChart extends AbstractChart {
31123
31153
  background: context.background,
31124
31154
  title: context.title || { text: "" },
31125
31155
  type: "gauge",
31126
- dataRange: context.range ? context.range[0].dataRange : undefined,
31156
+ dataRange: context.range?.[0]?.dataRange,
31127
31157
  sectionRule: {
31128
31158
  colors: {
31129
31159
  lowerColor: DEFAULT_GAUGE_LOWER_COLOR,
@@ -44206,6 +44236,7 @@ class DataValidationInput extends Component {
44206
44236
  placeholder: this.placeholder,
44207
44237
  class: "o-sidePanel-composer",
44208
44238
  defaultRangeSheetId: this.env.model.getters.getActiveSheetId(),
44239
+ defaultStatic: true,
44209
44240
  };
44210
44241
  }
44211
44242
  get errorMessage() {
@@ -44550,12 +44581,13 @@ class DataValidationEditor extends Component {
44550
44581
  onCloseSidePanel: { type: Function, optional: true },
44551
44582
  };
44552
44583
  state = useState({ rule: this.defaultDataValidationRule, errors: [] });
44584
+ editingSheetId;
44553
44585
  setup() {
44586
+ this.editingSheetId = this.env.model.getters.getActiveSheetId();
44554
44587
  if (this.props.rule) {
44555
- const sheetId = this.env.model.getters.getActiveSheetId();
44556
44588
  this.state.rule = {
44557
44589
  ...this.props.rule,
44558
- ranges: this.props.rule.ranges.map((range) => this.env.model.getters.getRangeString(range, sheetId)),
44590
+ ranges: this.props.rule.ranges.map((range) => this.env.model.getters.getRangeString(range, this.editingSheetId)),
44559
44591
  };
44560
44592
  this.state.rule.criterion.type = this.props.rule.criterion.type;
44561
44593
  }
@@ -44589,7 +44621,6 @@ class DataValidationEditor extends Component {
44589
44621
  const locale = this.env.model.getters.getLocale();
44590
44622
  const criterion = rule.criterion;
44591
44623
  const criterionEvaluator = dataValidationEvaluatorRegistry.get(criterion.type);
44592
- const sheetId = this.env.model.getters.getActiveSheetId();
44593
44624
  const values = criterion.values
44594
44625
  .slice(0, criterionEvaluator.numberOfValues(criterion))
44595
44626
  .map((value) => value?.trim())
@@ -44597,8 +44628,8 @@ class DataValidationEditor extends Component {
44597
44628
  .map((value) => canonicalizeContent(value, locale));
44598
44629
  rule.criterion = { ...criterion, values };
44599
44630
  return {
44600
- sheetId,
44601
- ranges: this.state.rule.ranges.map((xc) => this.env.model.getters.getRangeDataFromXc(sheetId, xc)),
44631
+ sheetId: this.editingSheetId,
44632
+ ranges: this.state.rule.ranges.map((xc) => this.env.model.getters.getRangeDataFromXc(this.editingSheetId, xc)),
44602
44633
  rule,
44603
44634
  };
44604
44635
  }
@@ -45128,6 +45159,7 @@ css /* scss */ `
45128
45159
  .o-button {
45129
45160
  height: 19px;
45130
45161
  width: 19px;
45162
+ box-sizing: content-box;
45131
45163
  .o-icon {
45132
45164
  height: 14px;
45133
45165
  width: 14px;
@@ -57832,7 +57864,7 @@ class RangeAdapter {
57832
57864
  let sheetName = "";
57833
57865
  if (prefixSheet) {
57834
57866
  if (rangeImpl.invalidSheetName) {
57835
- sheetName = rangeImpl.invalidSheetName;
57867
+ sheetName = getCanonicalSymbolName(rangeImpl.invalidSheetName);
57836
57868
  }
57837
57869
  else {
57838
57870
  sheetName = getCanonicalSymbolName(this.getters.getSheetName(rangeImpl.sheetId));
@@ -61137,7 +61169,7 @@ class FormulaDependencyGraph {
61137
61169
  * in the correct order they should be evaluated.
61138
61170
  * This is called a topological ordering (excluding cycles)
61139
61171
  */
61140
- getCellsDependingOn(ranges) {
61172
+ getCellsDependingOn(ranges, ignore) {
61141
61173
  const visited = this.createEmptyPositionSet();
61142
61174
  const queue = Array.from(ranges).reverse();
61143
61175
  while (queue.length > 0) {
@@ -61152,7 +61184,7 @@ class FormulaDependencyGraph {
61152
61184
  const impactedPositions = this.rTree.search(range).map((dep) => dep.data);
61153
61185
  const nextInQueue = {};
61154
61186
  for (const position of impactedPositions) {
61155
- if (!visited.has(position)) {
61187
+ if (!visited.has(position) && !ignore.has(position)) {
61156
61188
  if (!nextInQueue[position.sheetId]) {
61157
61189
  nextInQueue[position.sheetId] = [];
61158
61190
  }
@@ -61709,7 +61741,7 @@ class Evaluator {
61709
61741
  }
61710
61742
  invalidatePositionsDependingOnSpread(sheetId, resultZone) {
61711
61743
  // the result matrix is split in 2 zones to exclude the array formula position
61712
- const invalidatedPositions = this.formulaDependencies().getCellsDependingOn(excludeTopLeft(resultZone).map((zone) => ({ sheetId, zone })));
61744
+ const invalidatedPositions = this.formulaDependencies().getCellsDependingOn(excludeTopLeft(resultZone).map((zone) => ({ sheetId, zone })), this.nextPositionsToUpdate);
61713
61745
  invalidatedPositions.delete({ sheetId, col: resultZone.left, row: resultZone.top });
61714
61746
  this.nextPositionsToUpdate.addMany(invalidatedPositions);
61715
61747
  }
@@ -61827,7 +61859,7 @@ class Evaluator {
61827
61859
  for (const sheetId in zonesBySheetIds) {
61828
61860
  ranges.push(...zonesBySheetIds[sheetId].map((zone) => ({ sheetId, zone })));
61829
61861
  }
61830
- return this.formulaDependencies().getCellsDependingOn(ranges);
61862
+ return this.formulaDependencies().getCellsDependingOn(ranges, this.nextPositionsToUpdate);
61831
61863
  }
61832
61864
  }
61833
61865
  function forEachSpreadPositionInMatrix(nbColumns, nbRows, callback) {
@@ -77306,6 +77338,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
77306
77338
  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, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
77307
77339
 
77308
77340
 
77309
- __info__.version = "18.2.32";
77310
- __info__.date = "2025-10-07T09:59:52.165Z";
77311
- __info__.hash = "a42c448";
77341
+ __info__.version = "18.2.34";
77342
+ __info__.date = "2025-11-12T14:15:32.431Z";
77343
+ __info__.hash = "9ca0c4c";