@odoo/o-spreadsheet 19.2.23 → 19.2.25

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 19.2.23
6
- * @date 2026-07-30T06:54:22.421Z
7
- * @hash 7914fd5
5
+ * @version 19.2.25
6
+ * @date 2026-08-12T09:16:52.703Z
7
+ * @hash 685ffda
8
8
  */
9
9
  :root {
10
10
  --os-gray-100: light-dark(#f9fafb, #1b1d26);
@@ -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 19.2.23
6
- * @date 2026-07-30T06:54:20.810Z
7
- * @hash 7914fd5
5
+ * @version 19.2.25
6
+ * @date 2026-08-12T09:16:51.116Z
7
+ * @hash 685ffda
8
8
  */
9
9
 
10
10
  import { App, Component, blockDom, markRaw, onMounted, onPatched, onWillPatch, onWillStart, onWillUnmount, onWillUpdateProps, status, toRaw, useChildSubEnv, useComponent, useEffect, useEnv, useExternalListener, useRef, useState, useSubEnv, whenReady, xml } from "@odoo/owl";
@@ -3940,19 +3940,58 @@ function applyVectorization(formula, args, acceptToVectorize = void 0) {
3940
3940
  }
3941
3941
  }
3942
3942
  if (countVectorizedCol === 1 && countVectorizedRow === 1) return formula(...args);
3943
- const getArgOffset = (i, j) => args.map((arg, index) => {
3944
- switch (vectorArgsType?.[index]) {
3945
- case "matrix": return arg[i][j];
3946
- case "horizontal": return arg[i][0];
3947
- case "vertical": return arg[0][j];
3948
- case void 0: return arg;
3943
+ const argsBuffer = new Array(args.length);
3944
+ const argGetters = [];
3945
+ const vectorizedIndices = [];
3946
+ for (let k = 0; k < args.length; k++) {
3947
+ const arg = args[k];
3948
+ switch (vectorArgsType?.[k]) {
3949
+ case "matrix":
3950
+ argGetters.push((i, j) => arg[i][j]);
3951
+ vectorizedIndices.push(k);
3952
+ break;
3953
+ case "horizontal":
3954
+ argGetters.push((i) => arg[i][0]);
3955
+ vectorizedIndices.push(k);
3956
+ break;
3957
+ case "vertical":
3958
+ argGetters.push((_i, j) => arg[0][j]);
3959
+ vectorizedIndices.push(k);
3960
+ break;
3961
+ case void 0:
3962
+ argsBuffer[k] = arg;
3963
+ break;
3949
3964
  }
3950
- });
3951
- return generateMatrix(countVectorizedCol, countVectorizedRow, (col, row) => {
3952
- if (col > vectorizedColLimit - 1 || row > vectorizedRowLimit - 1) return new NotAvailableError(_t("Array arguments to [[FUNCTION_NAME]] are of different size."));
3953
- const singleCellComputeResult = formula(...getArgOffset(col, row));
3954
- return isMatrix(singleCellComputeResult) ? singleCellComputeResult[0][0] : singleCellComputeResult;
3955
- });
3965
+ }
3966
+ const nbVectorized = vectorizedIndices.length;
3967
+ let callFormula;
3968
+ switch (argsBuffer.length) {
3969
+ case 1:
3970
+ callFormula = () => formula(argsBuffer[0]);
3971
+ break;
3972
+ case 2:
3973
+ callFormula = () => formula(argsBuffer[0], argsBuffer[1]);
3974
+ break;
3975
+ case 3:
3976
+ callFormula = () => formula(argsBuffer[0], argsBuffer[1], argsBuffer[2]);
3977
+ break;
3978
+ default: callFormula = () => formula(...argsBuffer);
3979
+ }
3980
+ const result = new Array(countVectorizedCol);
3981
+ for (let col = 0; col < countVectorizedCol; col++) {
3982
+ const column = new Array(countVectorizedRow);
3983
+ result[col] = column;
3984
+ for (let row = 0; row < countVectorizedRow; row++) {
3985
+ if (col > vectorizedColLimit - 1 || row > vectorizedRowLimit - 1) {
3986
+ column[row] = new NotAvailableError(_t("Array arguments to [[FUNCTION_NAME]] are of different size."));
3987
+ continue;
3988
+ }
3989
+ for (let k = 0; k < nbVectorized; k++) argsBuffer[vectorizedIndices[k]] = argGetters[k](col, row);
3990
+ const singleCellComputeResult = callFormula();
3991
+ column[row] = isMatrix(singleCellComputeResult) ? singleCellComputeResult[0][0] : singleCellComputeResult;
3992
+ }
3993
+ }
3994
+ return result;
3956
3995
  }
3957
3996
  /**
3958
3997
  * This function allows to visit arguments and stop the visit if necessary.
@@ -17389,7 +17428,7 @@ var FigureComponent = class extends Component {
17389
17428
  case "ArrowLeft":
17390
17429
  case "ArrowRight":
17391
17430
  case "ArrowUp":
17392
- const { col, row, offset } = this.postionInBoundary(this.props.figureUI, ev.key);
17431
+ const { col, row, offset } = this.postionInBoundary(this.env.model.getters.getActiveSheetId(), this.props.figureUI, ev.key);
17393
17432
  this.env.model.dispatch("UPDATE_FIGURE", {
17394
17433
  sheetId: this.env.model.getters.getActiveSheetId(),
17395
17434
  figureId: this.props.figureUI.id,
@@ -17413,34 +17452,52 @@ var FigureComponent = class extends Component {
17413
17452
  break;
17414
17453
  }
17415
17454
  }
17416
- postionInBoundary(position, key) {
17417
- const sheetId = this.env.model.getters.getActiveSheetId();
17418
- let { col, row, offset } = position;
17455
+ postionInBoundary(sheetId, figure, key) {
17456
+ let { col, row, offset } = figure;
17419
17457
  offset = { ...offset };
17458
+ const maxAnchor = this.env.model.getters.getMaxAnchorOffset(sheetId, figure.height, figure.width);
17420
17459
  switch (key) {
17421
17460
  case "ArrowUp":
17422
17461
  if (offset.y === 0) {
17423
17462
  row--;
17463
+ while (row > 0 && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row--;
17424
17464
  offset.y = this.env.model.getters.getRowSize(sheetId, row) - 1;
17425
17465
  } else offset.y--;
17426
17466
  break;
17427
17467
  case "ArrowLeft":
17428
17468
  if (offset.x === 0) {
17429
17469
  col--;
17470
+ while (col > 0 && this.env.model.getters.isColHiddenByUser(sheetId, col)) col--;
17430
17471
  offset.x = this.env.model.getters.getColSize(sheetId, col) - 1;
17431
17472
  } else offset.x--;
17432
17473
  break;
17433
17474
  case "ArrowDown":
17434
17475
  if (offset.y === this.env.model.getters.getRowSize(sheetId, row)) {
17435
17476
  row++;
17477
+ while (row <= maxAnchor.row && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row++;
17436
17478
  offset.y = 0;
17437
17479
  } else offset.y++;
17438
17480
  break;
17439
17481
  case "ArrowRight": if (offset.x === this.env.model.getters.getColSize(sheetId, row)) {
17440
17482
  col++;
17483
+ while (col <= maxAnchor.col && this.env.model.getters.isColHiddenByUser(sheetId, col)) col++;
17441
17484
  offset.x = 0;
17442
17485
  } else offset.x++;
17443
17486
  }
17487
+ if (col < 0) {
17488
+ col = 0;
17489
+ offset.x = 0;
17490
+ } else if (col > maxAnchor.col || col === maxAnchor.col && offset.x > maxAnchor.offset.x) {
17491
+ col = maxAnchor.col;
17492
+ offset.x = maxAnchor.offset.x;
17493
+ }
17494
+ if (row < 0) {
17495
+ row = 0;
17496
+ offset.y = 0;
17497
+ } else if (row > maxAnchor.row || row === maxAnchor.row && offset.y > maxAnchor.offset.y) {
17498
+ row = maxAnchor.row;
17499
+ offset.y = maxAnchor.offset.y;
17500
+ }
17444
17501
  return {
17445
17502
  col,
17446
17503
  row,
@@ -17711,12 +17768,15 @@ function validateArguments(descr) {
17711
17768
  //#endregion
17712
17769
  //#region src/functions/create_compute_function.ts
17713
17770
  function createComputeFunction(descr) {
17771
+ let currentArgDefinitions = [];
17714
17772
  function vectorizedCompute(...args) {
17715
17773
  const acceptToVectorize = [];
17774
+ currentArgDefinitions = new Array(args.length);
17716
17775
  const getArgToFocus = argTargeting(descr, args.length);
17717
17776
  for (let i = 0; i < args.length; i++) {
17718
17777
  const argIndex = getArgToFocus(i).index ?? -1;
17719
17778
  const argDefinition = descr.args[argIndex];
17779
+ currentArgDefinitions[i] = argDefinition;
17720
17780
  const arg = args[i];
17721
17781
  if (!isMatrix(arg) && argDefinition.acceptMatrixOnly) throw new BadExpressionError(_t("Function %s expects the parameter '%s' to be reference to a cell or range.", descr.name, (i + 1).toString()));
17722
17782
  acceptToVectorize.push(!argDefinition.acceptMatrix);
@@ -17731,8 +17791,7 @@ function createComputeFunction(descr) {
17731
17791
  function errorHandlingCompute(...args) {
17732
17792
  for (let i = 0; i < args.length; i++) {
17733
17793
  const arg = args[i];
17734
- const getArgToFocus = argTargeting(descr, args.length);
17735
- if (!descr.args[getArgToFocus(i).index ?? i].acceptErrors && !isMatrix(arg) && isEvaluationError(arg?.value)) return arg;
17794
+ if (!currentArgDefinitions[i].acceptErrors && !isMatrix(arg) && isEvaluationError(arg?.value)) return arg;
17736
17795
  }
17737
17796
  try {
17738
17797
  return computeFunctionToObject.apply(this, args);
@@ -25782,6 +25841,9 @@ for (const category of categories) {
25782
25841
  });
25783
25842
  }
25784
25843
  }
25844
+ /** Formulas using one of these functions are never squished: they are always exported
25845
+ * as a full formula string, and they don't become the base formula of the next cells. */
25846
+ const NonSquishableFunctionRegistry = new Registry();
25785
25847
 
25786
25848
  //#endregion
25787
25849
  //#region src/types/xlsx.ts
@@ -50757,7 +50819,13 @@ var CellComposerStore = class extends AbstractComposerStore {
50757
50819
  const cell = this.getters.getEvaluatedCell(position);
50758
50820
  if (cell.link && !isFormula(content)) content = markdownLink(content, cell.link.url);
50759
50821
  const currentFormat = this.getters.getCell(position)?.format;
50760
- const afterFormat = currentFormat === "@" || currentFormat && isDateTimeFormat(currentFormat) ? void 0 : detectDateFormat(content, this.getters.getLocale());
50822
+ const isCurrentFormatDate = currentFormat && isDateTimeFormat(currentFormat);
50823
+ const contentDateFormat = detectDateFormat(content, this.getters.getLocale());
50824
+ let afterFormat;
50825
+ if (currentFormat !== "@") {
50826
+ if (contentDateFormat && !isCurrentFormatDate) afterFormat = contentDateFormat;
50827
+ else if (isCurrentFormatDate && isNumber(content, this.getters.getLocale())) afterFormat = "";
50828
+ }
50761
50829
  this.addHeadersForSpreadingFormula(content);
50762
50830
  result = this.model.dispatch("UPDATE_CELL", {
50763
50831
  ...this.currentEditedCell,
@@ -55834,7 +55902,8 @@ var Squisher = class {
55834
55902
  * The result of this method is:
55835
55903
  * - if the cell is not a formula, returns the content as is and resets the base formula
55836
55904
  * - if the cell is a formula:
55837
- * - if there is no previous formula, or the normalized formula is different from the previous one, resets the base formula to this one and returns the full formula string
55905
+ * - if there is no previous formula, or the normalized formula is different from the previous one or it contains blacklisted functions (see NonSquishableFunctionRegistry),
55906
+ * resets the base formula to this one and returns the full formula string
55838
55907
  * - else, compares the literal values and range dependencies to the previous formula, and for each parameter:
55839
55908
  * - for numbers: returns a relative change (+N or -N) if possible, else the full number or "=" if unchanged
55840
55909
  * - for strings: returns the full string if changed, else "="
@@ -55845,6 +55914,10 @@ var Squisher = class {
55845
55914
  this.resetBase();
55846
55915
  return cell.content;
55847
55916
  }
55917
+ if (NonSquishableFunctionRegistry.getAll().some((functionName) => cell.compiledFormula.usesSymbol(functionName))) {
55918
+ this.resetBase();
55919
+ return cell.compiledFormula.toFormulaString(this.getters, this.rangeToStringOptions);
55920
+ }
55848
55921
  let numbers = [];
55849
55922
  let strings = [];
55850
55923
  let references = [];
@@ -71430,6 +71503,10 @@ function inverseCreateFigure(cmd) {
71430
71503
  }
71431
71504
  function inverseCreateChart(cmd) {
71432
71505
  return [{
71506
+ type: "DELETE_CHART",
71507
+ chartId: cmd.chartId,
71508
+ sheetId: cmd.sheetId
71509
+ }, {
71433
71510
  type: "DELETE_FIGURE",
71434
71511
  figureId: cmd.figureId,
71435
71512
  sheetId: cmd.sheetId
@@ -81541,7 +81618,8 @@ const registries = {
81541
81618
  supportedPivotPositionalFormulaRegistry,
81542
81619
  pivotToFunctionValueRegistry,
81543
81620
  migrationStepRegistry,
81544
- chartJsExtensionRegistry
81621
+ chartJsExtensionRegistry,
81622
+ NonSquishableFunctionRegistry
81545
81623
  };
81546
81624
  const helpers = {
81547
81625
  arg,
@@ -81733,6 +81811,6 @@ const chartHelpers = {
81733
81811
  //#endregion
81734
81812
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, ClientDisconnectedError, CommandResult, CompiledFormula, CorePlugin, CoreViewPlugin, DEFAULT_LOCALE, DEFAULT_LOCALES, DispatchResult, EvaluationError, LocalTransportService, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, canExecuteInReadonly, categories, chartHelpers, components, constants, convertAstNodes, coreTypes, createAutocompleteArgumentsProvider, findCellInNewZone, functionCache, getCaretDownSvg, getCaretUpSvg, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, isCoreCommand, isSheetDependent, iterateAstNodes, links, load, lockedSheetAllowedCommands, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
81735
81813
 
81736
- __info__.version = "19.2.23";
81737
- __info__.date = "2026-07-30T06:54:20.810Z";
81738
- __info__.hash = "7914fd5";
81814
+ __info__.version = "19.2.25";
81815
+ __info__.date = "2026-08-12T09:16:51.116Z";
81816
+ __info__.hash = "685ffda";
@@ -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 19.2.23
6
- * @date 2026-07-30T06:54:20.810Z
7
- * @hash 7914fd5
5
+ * @version 19.2.25
6
+ * @date 2026-08-12T09:16:51.116Z
7
+ * @hash 685ffda
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -3942,19 +3942,58 @@ stores.inject(MyMetaStore, storeInstance);
3942
3942
  }
3943
3943
  }
3944
3944
  if (countVectorizedCol === 1 && countVectorizedRow === 1) return formula(...args);
3945
- const getArgOffset = (i, j) => args.map((arg, index) => {
3946
- switch (vectorArgsType?.[index]) {
3947
- case "matrix": return arg[i][j];
3948
- case "horizontal": return arg[i][0];
3949
- case "vertical": return arg[0][j];
3950
- case void 0: return arg;
3945
+ const argsBuffer = new Array(args.length);
3946
+ const argGetters = [];
3947
+ const vectorizedIndices = [];
3948
+ for (let k = 0; k < args.length; k++) {
3949
+ const arg = args[k];
3950
+ switch (vectorArgsType?.[k]) {
3951
+ case "matrix":
3952
+ argGetters.push((i, j) => arg[i][j]);
3953
+ vectorizedIndices.push(k);
3954
+ break;
3955
+ case "horizontal":
3956
+ argGetters.push((i) => arg[i][0]);
3957
+ vectorizedIndices.push(k);
3958
+ break;
3959
+ case "vertical":
3960
+ argGetters.push((_i, j) => arg[0][j]);
3961
+ vectorizedIndices.push(k);
3962
+ break;
3963
+ case void 0:
3964
+ argsBuffer[k] = arg;
3965
+ break;
3951
3966
  }
3952
- });
3953
- return generateMatrix(countVectorizedCol, countVectorizedRow, (col, row) => {
3954
- if (col > vectorizedColLimit - 1 || row > vectorizedRowLimit - 1) return new NotAvailableError(_t("Array arguments to [[FUNCTION_NAME]] are of different size."));
3955
- const singleCellComputeResult = formula(...getArgOffset(col, row));
3956
- return isMatrix(singleCellComputeResult) ? singleCellComputeResult[0][0] : singleCellComputeResult;
3957
- });
3967
+ }
3968
+ const nbVectorized = vectorizedIndices.length;
3969
+ let callFormula;
3970
+ switch (argsBuffer.length) {
3971
+ case 1:
3972
+ callFormula = () => formula(argsBuffer[0]);
3973
+ break;
3974
+ case 2:
3975
+ callFormula = () => formula(argsBuffer[0], argsBuffer[1]);
3976
+ break;
3977
+ case 3:
3978
+ callFormula = () => formula(argsBuffer[0], argsBuffer[1], argsBuffer[2]);
3979
+ break;
3980
+ default: callFormula = () => formula(...argsBuffer);
3981
+ }
3982
+ const result = new Array(countVectorizedCol);
3983
+ for (let col = 0; col < countVectorizedCol; col++) {
3984
+ const column = new Array(countVectorizedRow);
3985
+ result[col] = column;
3986
+ for (let row = 0; row < countVectorizedRow; row++) {
3987
+ if (col > vectorizedColLimit - 1 || row > vectorizedRowLimit - 1) {
3988
+ column[row] = new NotAvailableError(_t("Array arguments to [[FUNCTION_NAME]] are of different size."));
3989
+ continue;
3990
+ }
3991
+ for (let k = 0; k < nbVectorized; k++) argsBuffer[vectorizedIndices[k]] = argGetters[k](col, row);
3992
+ const singleCellComputeResult = callFormula();
3993
+ column[row] = isMatrix(singleCellComputeResult) ? singleCellComputeResult[0][0] : singleCellComputeResult;
3994
+ }
3995
+ }
3996
+ return result;
3958
3997
  }
3959
3998
  /**
3960
3999
  * This function allows to visit arguments and stop the visit if necessary.
@@ -17391,7 +17430,7 @@ stores.inject(MyMetaStore, storeInstance);
17391
17430
  case "ArrowLeft":
17392
17431
  case "ArrowRight":
17393
17432
  case "ArrowUp":
17394
- const { col, row, offset } = this.postionInBoundary(this.props.figureUI, ev.key);
17433
+ const { col, row, offset } = this.postionInBoundary(this.env.model.getters.getActiveSheetId(), this.props.figureUI, ev.key);
17395
17434
  this.env.model.dispatch("UPDATE_FIGURE", {
17396
17435
  sheetId: this.env.model.getters.getActiveSheetId(),
17397
17436
  figureId: this.props.figureUI.id,
@@ -17415,34 +17454,52 @@ stores.inject(MyMetaStore, storeInstance);
17415
17454
  break;
17416
17455
  }
17417
17456
  }
17418
- postionInBoundary(position, key) {
17419
- const sheetId = this.env.model.getters.getActiveSheetId();
17420
- let { col, row, offset } = position;
17457
+ postionInBoundary(sheetId, figure, key) {
17458
+ let { col, row, offset } = figure;
17421
17459
  offset = { ...offset };
17460
+ const maxAnchor = this.env.model.getters.getMaxAnchorOffset(sheetId, figure.height, figure.width);
17422
17461
  switch (key) {
17423
17462
  case "ArrowUp":
17424
17463
  if (offset.y === 0) {
17425
17464
  row--;
17465
+ while (row > 0 && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row--;
17426
17466
  offset.y = this.env.model.getters.getRowSize(sheetId, row) - 1;
17427
17467
  } else offset.y--;
17428
17468
  break;
17429
17469
  case "ArrowLeft":
17430
17470
  if (offset.x === 0) {
17431
17471
  col--;
17472
+ while (col > 0 && this.env.model.getters.isColHiddenByUser(sheetId, col)) col--;
17432
17473
  offset.x = this.env.model.getters.getColSize(sheetId, col) - 1;
17433
17474
  } else offset.x--;
17434
17475
  break;
17435
17476
  case "ArrowDown":
17436
17477
  if (offset.y === this.env.model.getters.getRowSize(sheetId, row)) {
17437
17478
  row++;
17479
+ while (row <= maxAnchor.row && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row++;
17438
17480
  offset.y = 0;
17439
17481
  } else offset.y++;
17440
17482
  break;
17441
17483
  case "ArrowRight": if (offset.x === this.env.model.getters.getColSize(sheetId, row)) {
17442
17484
  col++;
17485
+ while (col <= maxAnchor.col && this.env.model.getters.isColHiddenByUser(sheetId, col)) col++;
17443
17486
  offset.x = 0;
17444
17487
  } else offset.x++;
17445
17488
  }
17489
+ if (col < 0) {
17490
+ col = 0;
17491
+ offset.x = 0;
17492
+ } else if (col > maxAnchor.col || col === maxAnchor.col && offset.x > maxAnchor.offset.x) {
17493
+ col = maxAnchor.col;
17494
+ offset.x = maxAnchor.offset.x;
17495
+ }
17496
+ if (row < 0) {
17497
+ row = 0;
17498
+ offset.y = 0;
17499
+ } else if (row > maxAnchor.row || row === maxAnchor.row && offset.y > maxAnchor.offset.y) {
17500
+ row = maxAnchor.row;
17501
+ offset.y = maxAnchor.offset.y;
17502
+ }
17446
17503
  return {
17447
17504
  col,
17448
17505
  row,
@@ -17713,12 +17770,15 @@ stores.inject(MyMetaStore, storeInstance);
17713
17770
  //#endregion
17714
17771
  //#region src/functions/create_compute_function.ts
17715
17772
  function createComputeFunction(descr) {
17773
+ let currentArgDefinitions = [];
17716
17774
  function vectorizedCompute(...args) {
17717
17775
  const acceptToVectorize = [];
17776
+ currentArgDefinitions = new Array(args.length);
17718
17777
  const getArgToFocus = argTargeting(descr, args.length);
17719
17778
  for (let i = 0; i < args.length; i++) {
17720
17779
  const argIndex = getArgToFocus(i).index ?? -1;
17721
17780
  const argDefinition = descr.args[argIndex];
17781
+ currentArgDefinitions[i] = argDefinition;
17722
17782
  const arg = args[i];
17723
17783
  if (!isMatrix(arg) && argDefinition.acceptMatrixOnly) throw new BadExpressionError(_t("Function %s expects the parameter '%s' to be reference to a cell or range.", descr.name, (i + 1).toString()));
17724
17784
  acceptToVectorize.push(!argDefinition.acceptMatrix);
@@ -17733,8 +17793,7 @@ stores.inject(MyMetaStore, storeInstance);
17733
17793
  function errorHandlingCompute(...args) {
17734
17794
  for (let i = 0; i < args.length; i++) {
17735
17795
  const arg = args[i];
17736
- const getArgToFocus = argTargeting(descr, args.length);
17737
- if (!descr.args[getArgToFocus(i).index ?? i].acceptErrors && !isMatrix(arg) && isEvaluationError(arg?.value)) return arg;
17796
+ if (!currentArgDefinitions[i].acceptErrors && !isMatrix(arg) && isEvaluationError(arg?.value)) return arg;
17738
17797
  }
17739
17798
  try {
17740
17799
  return computeFunctionToObject.apply(this, args);
@@ -25784,6 +25843,9 @@ stores.inject(MyMetaStore, storeInstance);
25784
25843
  });
25785
25844
  }
25786
25845
  }
25846
+ /** Formulas using one of these functions are never squished: they are always exported
25847
+ * as a full formula string, and they don't become the base formula of the next cells. */
25848
+ const NonSquishableFunctionRegistry = new Registry();
25787
25849
 
25788
25850
  //#endregion
25789
25851
  //#region src/types/xlsx.ts
@@ -50759,7 +50821,13 @@ stores.inject(MyMetaStore, storeInstance);
50759
50821
  const cell = this.getters.getEvaluatedCell(position);
50760
50822
  if (cell.link && !isFormula(content)) content = markdownLink(content, cell.link.url);
50761
50823
  const currentFormat = this.getters.getCell(position)?.format;
50762
- const afterFormat = currentFormat === "@" || currentFormat && isDateTimeFormat(currentFormat) ? void 0 : detectDateFormat(content, this.getters.getLocale());
50824
+ const isCurrentFormatDate = currentFormat && isDateTimeFormat(currentFormat);
50825
+ const contentDateFormat = detectDateFormat(content, this.getters.getLocale());
50826
+ let afterFormat;
50827
+ if (currentFormat !== "@") {
50828
+ if (contentDateFormat && !isCurrentFormatDate) afterFormat = contentDateFormat;
50829
+ else if (isCurrentFormatDate && isNumber(content, this.getters.getLocale())) afterFormat = "";
50830
+ }
50763
50831
  this.addHeadersForSpreadingFormula(content);
50764
50832
  result = this.model.dispatch("UPDATE_CELL", {
50765
50833
  ...this.currentEditedCell,
@@ -55836,7 +55904,8 @@ stores.inject(MyMetaStore, storeInstance);
55836
55904
  * The result of this method is:
55837
55905
  * - if the cell is not a formula, returns the content as is and resets the base formula
55838
55906
  * - if the cell is a formula:
55839
- * - if there is no previous formula, or the normalized formula is different from the previous one, resets the base formula to this one and returns the full formula string
55907
+ * - if there is no previous formula, or the normalized formula is different from the previous one or it contains blacklisted functions (see NonSquishableFunctionRegistry),
55908
+ * resets the base formula to this one and returns the full formula string
55840
55909
  * - else, compares the literal values and range dependencies to the previous formula, and for each parameter:
55841
55910
  * - for numbers: returns a relative change (+N or -N) if possible, else the full number or "=" if unchanged
55842
55911
  * - for strings: returns the full string if changed, else "="
@@ -55847,6 +55916,10 @@ stores.inject(MyMetaStore, storeInstance);
55847
55916
  this.resetBase();
55848
55917
  return cell.content;
55849
55918
  }
55919
+ if (NonSquishableFunctionRegistry.getAll().some((functionName) => cell.compiledFormula.usesSymbol(functionName))) {
55920
+ this.resetBase();
55921
+ return cell.compiledFormula.toFormulaString(this.getters, this.rangeToStringOptions);
55922
+ }
55850
55923
  let numbers = [];
55851
55924
  let strings = [];
55852
55925
  let references = [];
@@ -71432,6 +71505,10 @@ stores.inject(MyMetaStore, storeInstance);
71432
71505
  }
71433
71506
  function inverseCreateChart(cmd) {
71434
71507
  return [{
71508
+ type: "DELETE_CHART",
71509
+ chartId: cmd.chartId,
71510
+ sheetId: cmd.sheetId
71511
+ }, {
71435
71512
  type: "DELETE_FIGURE",
71436
71513
  figureId: cmd.figureId,
71437
71514
  sheetId: cmd.sheetId
@@ -81543,7 +81620,8 @@ stores.inject(MyMetaStore, storeInstance);
81543
81620
  supportedPivotPositionalFormulaRegistry,
81544
81621
  pivotToFunctionValueRegistry,
81545
81622
  migrationStepRegistry,
81546
- chartJsExtensionRegistry
81623
+ chartJsExtensionRegistry,
81624
+ NonSquishableFunctionRegistry
81547
81625
  };
81548
81626
  const helpers = {
81549
81627
  arg,
@@ -81793,8 +81871,8 @@ exports.stores = stores;
81793
81871
  exports.tokenColors = tokenColors;
81794
81872
  exports.tokenize = tokenize;
81795
81873
 
81796
- __info__.version = "19.2.23";
81797
- __info__.date = "2026-07-30T06:54:20.810Z";
81798
- __info__.hash = "7914fd5";
81874
+ __info__.version = "19.2.25";
81875
+ __info__.date = "2026-08-12T09:16:51.116Z";
81876
+ __info__.hash = "685ffda";
81799
81877
 
81800
81878
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);