@odoo/o-spreadsheet 19.3.11 → 19.3.13

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.3.11
6
- * @date 2026-07-13T06:26:28.422Z
7
- * @hash 35c06d3
5
+ * @version 19.3.13
6
+ * @date 2026-07-23T07:41:06.182Z
7
+ * @hash 2059bd0
8
8
  */
9
9
 
10
10
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
@@ -5568,7 +5568,7 @@ function getRangeString(range, forSheetId, getSheetName, options = {
5568
5568
  if (prefixSheet && !sheetName) return CellErrorType.InvalidReference;
5569
5569
  let rangeString = getRangePartString(range, 0, options);
5570
5570
  if (range.parts && range.parts.length === 2) {
5571
- if (range.zone.top !== range.zone.bottom || range.zone.left !== range.zone.right || range.parts[0].rowFixed || range.parts[0].colFixed || range.parts[1].rowFixed || range.parts[1].colFixed) {
5571
+ if (range.zone.top !== range.zone.bottom || range.zone.left !== range.zone.right || range.parts[0].rowFixed || range.parts[0].colFixed || range.parts[1].rowFixed || range.parts[1].colFixed || options.doNotSimplifyRange) {
5572
5572
  rangeString += ":";
5573
5573
  rangeString += getRangePartString(range, 1, options);
5574
5574
  }
@@ -6290,6 +6290,11 @@ var CompiledFormula = class CompiledFormula {
6290
6290
  const params = compileTokens(rangeTokenize(formula));
6291
6291
  return new CompiledFormula(sheetId, params.tokens, params.literalValues, params.symbols, params.dependencies.map((xc) => getters.getRangeFromSheetXC(sheetId, xc)), params.isBadExpression, params.normalizedFormula, params.execute);
6292
6292
  }
6293
+ areRangeShapesInLineWithNormalizedFormula() {
6294
+ return Array.from(this.normalizedFormula.matchAll(/\|C\||\|R\|/g)).every((value, index) => {
6295
+ return this.rangeDependencies[index].parts.length === 1 && value[0] === "|C|" || this.rangeDependencies[index].parts.length === 2 && value[0] === "|R|" || this.rangeDependencies[index].invalidXc || this.rangeDependencies[index].invalidSheetName;
6296
+ });
6297
+ }
6293
6298
  };
6294
6299
  function compileTokens(tokens) {
6295
6300
  try {
@@ -33915,7 +33920,7 @@ var ScorecardChartConfigPanel = class extends _odoo_owl.Component {
33915
33920
  return !!this.state.keyValueDispatchResult?.isCancelledBecause("InvalidScorecardKeyValue");
33916
33921
  }
33917
33922
  get isBaselineInvalid() {
33918
- return !!this.state.keyValueDispatchResult?.isCancelledBecause("InvalidScorecardBaseline");
33923
+ return !!this.state.baselineDispatchResult?.isCancelledBecause("InvalidScorecardBaseline");
33919
33924
  }
33920
33925
  onKeyValueRangeChanged(ranges) {
33921
33926
  this.keyValue = ranges[0];
@@ -44151,7 +44156,8 @@ var Autofill = class extends _odoo_owl.Component {
44151
44156
  const { x, y } = this.state.handler ? this.state.position : this.props.position;
44152
44157
  return cssPropertiesToCss({
44153
44158
  top: `${y}px`,
44154
- left: `${x}px`
44159
+ left: `${x}px`,
44160
+ visibility: this.props.isVisible ? "visible" : "hidden"
44155
44161
  });
44156
44162
  }
44157
44163
  get styleNextValue() {
@@ -44572,7 +44578,7 @@ var CellComposerStore = class extends AbstractComposerStore {
44572
44578
  this._cancelEdition();
44573
44579
  this.resetContent();
44574
44580
  }
44575
- if (cmd.sheetIdFrom !== cmd.sheetIdTo) {
44581
+ if (this.model.selection.isListening(this) && cmd.sheetIdFrom !== cmd.sheetIdTo) {
44576
44582
  const activePosition = this.getters.getActivePosition();
44577
44583
  const { col, row } = this.getters.getNextVisibleCellPosition({
44578
44584
  sheetId: cmd.sheetIdTo,
@@ -48714,6 +48720,10 @@ var Grid = class extends _odoo_owl.Component {
48714
48720
  get displaySelectionHandler() {
48715
48721
  return this.env.isMobile() && this.composerFocusStore.activeComposer.editionMode === "inactive";
48716
48722
  }
48723
+ get clientsToDisplay() {
48724
+ const sheetId = this.env.model.getters.getActiveSheetId();
48725
+ return this.env.model.getters.getClientsToDisplay(sheetId);
48726
+ }
48717
48727
  };
48718
48728
 
48719
48729
  //#endregion
@@ -49718,6 +49728,7 @@ var Squisher = class {
49718
49728
  alreadyAppliedNumberOffsets = [];
49719
49729
  previousStrings = [];
49720
49730
  baseFormulaWasTransformed = false;
49731
+ rangeToStringOptions = { doNotSimplifyRange: true };
49721
49732
  baseNumber = void 0;
49722
49733
  constructor(getters) {
49723
49734
  this.getters = getters;
@@ -49773,9 +49784,9 @@ var Squisher = class {
49773
49784
  let references = [];
49774
49785
  if (!this.baseFormula || this.baseFormula.normalizedFormula !== cell.compiledFormula.normalizedFormula) {
49775
49786
  this.resetBaseTo(cell.compiledFormula);
49776
- return cell.compiledFormula.toFormulaString(this.getters);
49787
+ return cell.compiledFormula.toFormulaString(this.getters, this.rangeToStringOptions);
49777
49788
  } else {
49778
- if (!this.baseFormulaWasTransformed && deepEquals(cell.compiledFormula.literalValues, this.baseFormula.literalValues) && deepEquals(cell.compiledFormula.rangeDependencies, this.baseFormula.rangeDependencies)) return cell.compiledFormula.toFormulaString(this.getters);
49789
+ if (!this.baseFormulaWasTransformed && deepEquals(cell.compiledFormula.literalValues, this.baseFormula.literalValues) && deepEquals(cell.compiledFormula.rangeDependencies, this.baseFormula.rangeDependencies)) return cell.compiledFormula.toFormulaString(this.getters, this.rangeToStringOptions);
49779
49790
  numbers = this.squishNumbers(cell.compiledFormula.literalValues.numbers);
49780
49791
  strings = this.squishStrings(cell.compiledFormula.literalValues.strings);
49781
49792
  references = this.squishReferences(cell.compiledFormula.rangeDependencies, forSheetId);
@@ -49852,23 +49863,23 @@ var Squisher = class {
49852
49863
  squishOneReference(reference, previousReferences, index, forSheetId) {
49853
49864
  const previousReference = previousReferences[index];
49854
49865
  if (deepEquals(previousReference, reference)) return "=";
49855
- if (previousReference.sheetId !== reference.sheetId || previousReference.prefixSheet !== reference.prefixSheet || previousReference.invalidSheetName !== reference.invalidSheetName || previousReference.invalidXc !== reference.invalidXc) {
49866
+ if (previousReference.sheetId !== reference.sheetId || previousReference.prefixSheet !== reference.prefixSheet || previousReference.invalidSheetName !== reference.invalidSheetName || previousReference.invalidXc !== reference.invalidXc || previousReference.parts.length !== reference.parts.length) {
49856
49867
  previousReferences[index] = deepCopy(reference);
49857
- return getRangeString(reference, forSheetId, this.getters.getSheetName);
49868
+ return getRangeString(reference, forSheetId, this.getters.getSheetName, this.rangeToStringOptions);
49858
49869
  }
49859
49870
  if (previousReference.unboundedZone.bottom === void 0 || previousReference.unboundedZone.right === void 0 || reference.unboundedZone.bottom === void 0 || reference.unboundedZone.right === void 0) {
49860
49871
  previousReferences[index] = deepCopy(reference);
49861
- return getRangeString(reference, forSheetId, this.getters.getSheetName);
49872
+ return getRangeString(reference, forSheetId, this.getters.getSheetName, this.rangeToStringOptions);
49862
49873
  }
49863
49874
  for (let i = 0; i < reference.parts.length; i++) if (previousReference.parts[i].colFixed !== reference.parts[i].colFixed || previousReference.parts[i].rowFixed !== reference.parts[i].rowFixed) {
49864
49875
  previousReferences[index] = deepCopy(reference);
49865
- return getRangeString(reference, forSheetId, this.getters.getSheetName);
49876
+ return getRangeString(reference, forSheetId, this.getters.getSheetName, this.rangeToStringOptions);
49866
49877
  }
49867
49878
  const currentZone = reference.zone;
49868
49879
  const previousZone = previousReference.zone;
49869
49880
  if (currentZone.top !== currentZone.bottom || currentZone.left !== currentZone.right || previousZone.top !== previousZone.bottom || previousZone.left !== previousZone.right) {
49870
49881
  previousReferences[index] = deepCopy(reference);
49871
- return getRangeString(reference, forSheetId, this.getters.getSheetName);
49882
+ return getRangeString(reference, forSheetId, this.getters.getSheetName, this.rangeToStringOptions);
49872
49883
  }
49873
49884
  const diffCol = reference.zone.left - previousReference.zone.left;
49874
49885
  const diffRow = reference.zone.top - previousReference.zone.top;
@@ -49876,7 +49887,7 @@ var Squisher = class {
49876
49887
  previousReference.unboundedZone = deepCopy(reference.unboundedZone);
49877
49888
  if (diffCol !== 0 && diffRow === 0) return `${diffCol > 0 ? "+" : "-"}C${Math.abs(diffCol)}`;
49878
49889
  else if (diffRow !== 0 && diffCol === 0) return `${diffRow > 0 ? "+" : "-"}R${Math.abs(diffRow)}`;
49879
- return getRangeString(reference, forSheetId, this.getters.getSheetName);
49890
+ return getRangeString(reference, forSheetId, this.getters.getSheetName, this.rangeToStringOptions);
49880
49891
  }
49881
49892
  /**
49882
49893
  * Squish the number parameters. Result for each parameter should be compared the previous formula.
@@ -50085,10 +50096,19 @@ var Unsquisher = class {
50085
50096
  case "FIRST_OFFSET": {
50086
50097
  const currentOffset = current;
50087
50098
  this.previousOffset = currentOffset;
50088
- for (const position of targetPositions) yield {
50089
- position,
50090
- compiled: this.unsquishFormula(currentOffset, sheetId, getters)
50091
- };
50099
+ for (const position of targetPositions) {
50100
+ const result = this.unsquishFormula(currentOffset, sheetId, getters);
50101
+ if (!result.areRangeShapesInLineWithNormalizedFormula()) {
50102
+ const formulaString = result.toFormulaString(getters);
50103
+ yield {
50104
+ position,
50105
+ compiled: CompiledFormula.Compile(formulaString, sheetId, getters)
50106
+ };
50107
+ } else yield {
50108
+ position,
50109
+ compiled: result
50110
+ };
50111
+ }
50092
50112
  break;
50093
50113
  }
50094
50114
  case "COMBINE_OFFSET": {
@@ -50097,10 +50117,19 @@ var Unsquisher = class {
50097
50117
  this.previousOffset.N = currentOffset.N ?? this.previousOffset.N;
50098
50118
  this.previousOffset.S = currentOffset.S ?? this.previousOffset.S;
50099
50119
  this.previousOffset.R = currentOffset.R ?? this.previousOffset.R;
50100
- for (const position of targetPositions) yield {
50101
- position,
50102
- compiled: this.unsquishFormula(this.previousOffset, sheetId, getters)
50103
- };
50120
+ for (const position of targetPositions) {
50121
+ const result = this.unsquishFormula(this.previousOffset, sheetId, getters);
50122
+ if (!result.areRangeShapesInLineWithNormalizedFormula()) {
50123
+ const formulaString = result.toFormulaString(getters);
50124
+ yield {
50125
+ position,
50126
+ compiled: CompiledFormula.Compile(formulaString, sheetId, getters)
50127
+ };
50128
+ } else yield {
50129
+ position,
50130
+ compiled: result
50131
+ };
50132
+ }
50104
50133
  break;
50105
50134
  }
50106
50135
  case "NEW_NUMBER":
@@ -58045,6 +58074,8 @@ var PivotUIPlugin = class extends CoreViewPlugin {
58045
58074
  pivots = {};
58046
58075
  unusedPivotsInFormulas;
58047
58076
  custom;
58077
+ pivotPositionCache = new PositionMap();
58078
+ shouldInvalidateCache = false;
58048
58079
  constructor(config) {
58049
58080
  super(config);
58050
58081
  this.custom = config.custom;
@@ -58055,7 +58086,11 @@ var PivotUIPlugin = class extends CoreViewPlugin {
58055
58086
  }
58056
58087
  }
58057
58088
  handle(cmd) {
58058
- if (invalidateEvaluationCommands.has(cmd.type)) for (const pivotId of this.getters.getPivotIds()) this.setupPivot(pivotId, { recreate: true });
58089
+ if (invalidateEvaluationCommands.has(cmd.type)) {
58090
+ this.shouldInvalidateCache = true;
58091
+ for (const pivotId of this.getters.getPivotIds()) this.setupPivot(pivotId, { recreate: true });
58092
+ }
58093
+ if (cmd.type === "UPDATE_CELL") this.shouldInvalidateCache = true;
58059
58094
  switch (cmd.type) {
58060
58095
  case "REFRESH_PIVOT":
58061
58096
  this.refreshPivot(cmd.id);
@@ -58095,6 +58130,12 @@ var PivotUIPlugin = class extends CoreViewPlugin {
58095
58130
  break;
58096
58131
  }
58097
58132
  }
58133
+ finalize() {
58134
+ if (this.shouldInvalidateCache) {
58135
+ this.pivotPositionCache = new PositionMap();
58136
+ this.shouldInvalidateCache = false;
58137
+ }
58138
+ }
58098
58139
  /**
58099
58140
  * Get the id of the first pivot in the formula at the given position. Returns undefined if there
58100
58141
  * is no pivot at this position
@@ -58106,9 +58147,14 @@ var PivotUIPlugin = class extends CoreViewPlugin {
58106
58147
  * Get all of the ids of the pivot present in the formula at the given position.
58107
58148
  */
58108
58149
  getPivotIdsFromPosition(position) {
58109
- const cell = this.getters.getCorrespondingFormulaCell(position);
58110
- if (cell && cell.isFormula) return this.getPivotIdsFromFormula(position.sheetId, cell.compiledFormula);
58111
- return [];
58150
+ if (!this.pivotPositionCache.has(position)) {
58151
+ const cell = this.getters.getCorrespondingFormulaCell(position);
58152
+ if (cell && cell.isFormula) {
58153
+ const pivotIds = this.getPivotIdsFromFormula(position.sheetId, cell.compiledFormula);
58154
+ this.pivotPositionCache.set(position, pivotIds);
58155
+ }
58156
+ }
58157
+ return this.pivotPositionCache.get(position) || [];
58112
58158
  }
58113
58159
  getPivotIdsFromFormula(sheetId, formula) {
58114
58160
  return this.getPivotFunctions(sheetId, formula).map((pivotFunction) => {
@@ -59853,17 +59899,32 @@ var TableComputedStylePlugin = class extends UIPlugin {
59853
59899
  getCellTableStyle(position) {
59854
59900
  const table = this.getters.getTable(position);
59855
59901
  if (!table) return;
59856
- return this.tableStyles[position.sheetId][table.id]().styles[position.col]?.[position.row];
59902
+ try {
59903
+ return this.tableStyles[position.sheetId][table.id]().styles[position.col]?.[position.row];
59904
+ } catch (e) {
59905
+ if (isEvaluationError(e) || e instanceof EvaluationError) return;
59906
+ throw e;
59907
+ }
59857
59908
  }
59858
59909
  getCellTableBorder(position) {
59859
59910
  const table = this.getters.getTable(position);
59860
59911
  if (!table) return;
59861
- return this.tableStyles[position.sheetId][table.id]().borders[position.col]?.[position.row];
59912
+ try {
59913
+ return this.tableStyles[position.sheetId][table.id]().borders[position.col]?.[position.row];
59914
+ } catch (e) {
59915
+ if (isEvaluationError(e) || e instanceof EvaluationError) return;
59916
+ throw e;
59917
+ }
59862
59918
  }
59863
59919
  computeTableStyle(sheetId, table) {
59864
59920
  return lazy(() => {
59865
59921
  const style = this.getters.getTableStyle(table.config.styleId);
59866
- const { tableMetaData, config } = this.getTableMetaData(sheetId, table);
59922
+ const tableMetaDataAndConfig = this.getTableMetaData(sheetId, table);
59923
+ if (!tableMetaDataAndConfig) return {
59924
+ borders: {},
59925
+ styles: {}
59926
+ };
59927
+ const { tableMetaData, config } = tableMetaDataAndConfig;
59867
59928
  const relativeTableStyle = getComputedTableStyle(config, style, tableMetaData);
59868
59929
  const mapping = this.getTableMapping(sheetId, table);
59869
59930
  const absoluteTableStyle = {
@@ -59901,6 +59962,7 @@ var TableComputedStylePlugin = class extends UIPlugin {
59901
59962
  const pivotInfo = this.getters.getPivotStyleAtPosition(mainPosition);
59902
59963
  if (!pivotInfo) throw new Error("No dynamic pivot info found at pivot table position");
59903
59964
  const pivot = this.getters.getPivot(pivotInfo.pivotId);
59965
+ if (!pivot.isValid()) return;
59904
59966
  const pivotStyle = pivotInfo.pivotStyle;
59905
59967
  const maxRowDepth = pivot.getExpandedTableStructure().getNumberOfRowGroupBys();
59906
59968
  const pivotTable = pivot.getCollapsedTableStructure();
@@ -61195,14 +61257,13 @@ var CollaborativePlugin = class extends UIPlugin {
61195
61257
  * Get the list of others connected clients which are present in the same sheet
61196
61258
  * and with a valid position
61197
61259
  */
61198
- getClientsToDisplay() {
61260
+ getClientsToDisplay(sheetId) {
61199
61261
  try {
61200
61262
  this.getters.getCurrentClient();
61201
61263
  } catch (e) {
61202
61264
  if (e instanceof ClientDisconnectedError) return [];
61203
61265
  else throw e;
61204
61266
  }
61205
- const sheetId = this.getters.getActiveSheetId();
61206
61267
  const clients = [];
61207
61268
  for (const client of this.getters.getConnectedClients()) if (client.id !== this.getters.getCurrentClient().id && client.position && client.position.sheetId === sheetId && this.isPositionValid(client.position)) clients.push({
61208
61269
  ...client,
@@ -61213,7 +61274,7 @@ var CollaborativePlugin = class extends UIPlugin {
61213
61274
  drawLayer(renderingContext) {
61214
61275
  if (this.getters.isDashboard()) return;
61215
61276
  const { ctx, thinLineWidth, viewports, sheetId } = renderingContext;
61216
- for (const client of this.getClientsToDisplay()) {
61277
+ for (const client of this.getClientsToDisplay(sheetId)) {
61217
61278
  const { row, col } = client.position;
61218
61279
  const zone = this.getters.expandZone(sheetId, {
61219
61280
  top: row,
@@ -61516,8 +61577,8 @@ var HeaderVisibilityUIPlugin = class extends UIPlugin {
61516
61577
  getNextVisibleCellPosition({ sheetId, col, row }) {
61517
61578
  return {
61518
61579
  sheetId,
61519
- col: this.findVisibleHeader(sheetId, "COL", col, this.getters.getNumberCols(sheetId) - 1),
61520
- row: this.findVisibleHeader(sheetId, "ROW", row, this.getters.getNumberRows(sheetId) - 1)
61580
+ col: this.findVisibleHeader(sheetId, "COL", col, this.getters.getNumberCols(sheetId) - 1) || this.findVisibleHeader(sheetId, "COL", col, 0) || 0,
61581
+ row: this.findVisibleHeader(sheetId, "ROW", row, this.getters.getNumberRows(sheetId) - 1) || this.findVisibleHeader(sheetId, "ROW", row, 0) || 0
61521
61582
  };
61522
61583
  }
61523
61584
  /**
@@ -84609,7 +84670,8 @@ const helpers = {
84609
84670
  parseFormat,
84610
84671
  isFormula,
84611
84672
  domainToColRowDomain,
84612
- collapseHierarchicalDisplayName
84673
+ collapseHierarchicalDisplayName,
84674
+ PositionMap
84613
84675
  };
84614
84676
  const links = {
84615
84677
  isMarkdownLink,
@@ -84789,6 +84851,6 @@ exports.stores = stores;
84789
84851
  exports.tokenColors = tokenColors;
84790
84852
  exports.tokenize = tokenize;
84791
84853
 
84792
- __info__.version = "19.3.11";
84793
- __info__.date = "2026-07-13T06:26:28.422Z";
84794
- __info__.hash = "35c06d3";
84854
+ __info__.version = "19.3.13";
84855
+ __info__.date = "2026-07-23T07:41:06.182Z";
84856
+ __info__.hash = "2059bd0";
@@ -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.3.11
6
- * @date 2026-07-13T06:26:30.150Z
7
- * @hash 35c06d3
5
+ * @version 19.3.13
6
+ * @date 2026-07-23T07:41:07.881Z
7
+ * @hash 2059bd0
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.3.11
6
- * @date 2026-07-13T06:26:28.422Z
7
- * @hash 35c06d3
5
+ * @version 19.3.13
6
+ * @date 2026-07-23T07:41:06.182Z
7
+ * @hash 2059bd0
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";
@@ -5567,7 +5567,7 @@ function getRangeString(range, forSheetId, getSheetName, options = {
5567
5567
  if (prefixSheet && !sheetName) return CellErrorType.InvalidReference;
5568
5568
  let rangeString = getRangePartString(range, 0, options);
5569
5569
  if (range.parts && range.parts.length === 2) {
5570
- if (range.zone.top !== range.zone.bottom || range.zone.left !== range.zone.right || range.parts[0].rowFixed || range.parts[0].colFixed || range.parts[1].rowFixed || range.parts[1].colFixed) {
5570
+ if (range.zone.top !== range.zone.bottom || range.zone.left !== range.zone.right || range.parts[0].rowFixed || range.parts[0].colFixed || range.parts[1].rowFixed || range.parts[1].colFixed || options.doNotSimplifyRange) {
5571
5571
  rangeString += ":";
5572
5572
  rangeString += getRangePartString(range, 1, options);
5573
5573
  }
@@ -6289,6 +6289,11 @@ var CompiledFormula = class CompiledFormula {
6289
6289
  const params = compileTokens(rangeTokenize(formula));
6290
6290
  return new CompiledFormula(sheetId, params.tokens, params.literalValues, params.symbols, params.dependencies.map((xc) => getters.getRangeFromSheetXC(sheetId, xc)), params.isBadExpression, params.normalizedFormula, params.execute);
6291
6291
  }
6292
+ areRangeShapesInLineWithNormalizedFormula() {
6293
+ return Array.from(this.normalizedFormula.matchAll(/\|C\||\|R\|/g)).every((value, index) => {
6294
+ return this.rangeDependencies[index].parts.length === 1 && value[0] === "|C|" || this.rangeDependencies[index].parts.length === 2 && value[0] === "|R|" || this.rangeDependencies[index].invalidXc || this.rangeDependencies[index].invalidSheetName;
6295
+ });
6296
+ }
6292
6297
  };
6293
6298
  function compileTokens(tokens) {
6294
6299
  try {
@@ -33914,7 +33919,7 @@ var ScorecardChartConfigPanel = class extends Component {
33914
33919
  return !!this.state.keyValueDispatchResult?.isCancelledBecause("InvalidScorecardKeyValue");
33915
33920
  }
33916
33921
  get isBaselineInvalid() {
33917
- return !!this.state.keyValueDispatchResult?.isCancelledBecause("InvalidScorecardBaseline");
33922
+ return !!this.state.baselineDispatchResult?.isCancelledBecause("InvalidScorecardBaseline");
33918
33923
  }
33919
33924
  onKeyValueRangeChanged(ranges) {
33920
33925
  this.keyValue = ranges[0];
@@ -44150,7 +44155,8 @@ var Autofill = class extends Component {
44150
44155
  const { x, y } = this.state.handler ? this.state.position : this.props.position;
44151
44156
  return cssPropertiesToCss({
44152
44157
  top: `${y}px`,
44153
- left: `${x}px`
44158
+ left: `${x}px`,
44159
+ visibility: this.props.isVisible ? "visible" : "hidden"
44154
44160
  });
44155
44161
  }
44156
44162
  get styleNextValue() {
@@ -44571,7 +44577,7 @@ var CellComposerStore = class extends AbstractComposerStore {
44571
44577
  this._cancelEdition();
44572
44578
  this.resetContent();
44573
44579
  }
44574
- if (cmd.sheetIdFrom !== cmd.sheetIdTo) {
44580
+ if (this.model.selection.isListening(this) && cmd.sheetIdFrom !== cmd.sheetIdTo) {
44575
44581
  const activePosition = this.getters.getActivePosition();
44576
44582
  const { col, row } = this.getters.getNextVisibleCellPosition({
44577
44583
  sheetId: cmd.sheetIdTo,
@@ -48713,6 +48719,10 @@ var Grid = class extends Component {
48713
48719
  get displaySelectionHandler() {
48714
48720
  return this.env.isMobile() && this.composerFocusStore.activeComposer.editionMode === "inactive";
48715
48721
  }
48722
+ get clientsToDisplay() {
48723
+ const sheetId = this.env.model.getters.getActiveSheetId();
48724
+ return this.env.model.getters.getClientsToDisplay(sheetId);
48725
+ }
48716
48726
  };
48717
48727
 
48718
48728
  //#endregion
@@ -49717,6 +49727,7 @@ var Squisher = class {
49717
49727
  alreadyAppliedNumberOffsets = [];
49718
49728
  previousStrings = [];
49719
49729
  baseFormulaWasTransformed = false;
49730
+ rangeToStringOptions = { doNotSimplifyRange: true };
49720
49731
  baseNumber = void 0;
49721
49732
  constructor(getters) {
49722
49733
  this.getters = getters;
@@ -49772,9 +49783,9 @@ var Squisher = class {
49772
49783
  let references = [];
49773
49784
  if (!this.baseFormula || this.baseFormula.normalizedFormula !== cell.compiledFormula.normalizedFormula) {
49774
49785
  this.resetBaseTo(cell.compiledFormula);
49775
- return cell.compiledFormula.toFormulaString(this.getters);
49786
+ return cell.compiledFormula.toFormulaString(this.getters, this.rangeToStringOptions);
49776
49787
  } else {
49777
- if (!this.baseFormulaWasTransformed && deepEquals(cell.compiledFormula.literalValues, this.baseFormula.literalValues) && deepEquals(cell.compiledFormula.rangeDependencies, this.baseFormula.rangeDependencies)) return cell.compiledFormula.toFormulaString(this.getters);
49788
+ if (!this.baseFormulaWasTransformed && deepEquals(cell.compiledFormula.literalValues, this.baseFormula.literalValues) && deepEquals(cell.compiledFormula.rangeDependencies, this.baseFormula.rangeDependencies)) return cell.compiledFormula.toFormulaString(this.getters, this.rangeToStringOptions);
49778
49789
  numbers = this.squishNumbers(cell.compiledFormula.literalValues.numbers);
49779
49790
  strings = this.squishStrings(cell.compiledFormula.literalValues.strings);
49780
49791
  references = this.squishReferences(cell.compiledFormula.rangeDependencies, forSheetId);
@@ -49851,23 +49862,23 @@ var Squisher = class {
49851
49862
  squishOneReference(reference, previousReferences, index, forSheetId) {
49852
49863
  const previousReference = previousReferences[index];
49853
49864
  if (deepEquals(previousReference, reference)) return "=";
49854
- if (previousReference.sheetId !== reference.sheetId || previousReference.prefixSheet !== reference.prefixSheet || previousReference.invalidSheetName !== reference.invalidSheetName || previousReference.invalidXc !== reference.invalidXc) {
49865
+ if (previousReference.sheetId !== reference.sheetId || previousReference.prefixSheet !== reference.prefixSheet || previousReference.invalidSheetName !== reference.invalidSheetName || previousReference.invalidXc !== reference.invalidXc || previousReference.parts.length !== reference.parts.length) {
49855
49866
  previousReferences[index] = deepCopy(reference);
49856
- return getRangeString(reference, forSheetId, this.getters.getSheetName);
49867
+ return getRangeString(reference, forSheetId, this.getters.getSheetName, this.rangeToStringOptions);
49857
49868
  }
49858
49869
  if (previousReference.unboundedZone.bottom === void 0 || previousReference.unboundedZone.right === void 0 || reference.unboundedZone.bottom === void 0 || reference.unboundedZone.right === void 0) {
49859
49870
  previousReferences[index] = deepCopy(reference);
49860
- return getRangeString(reference, forSheetId, this.getters.getSheetName);
49871
+ return getRangeString(reference, forSheetId, this.getters.getSheetName, this.rangeToStringOptions);
49861
49872
  }
49862
49873
  for (let i = 0; i < reference.parts.length; i++) if (previousReference.parts[i].colFixed !== reference.parts[i].colFixed || previousReference.parts[i].rowFixed !== reference.parts[i].rowFixed) {
49863
49874
  previousReferences[index] = deepCopy(reference);
49864
- return getRangeString(reference, forSheetId, this.getters.getSheetName);
49875
+ return getRangeString(reference, forSheetId, this.getters.getSheetName, this.rangeToStringOptions);
49865
49876
  }
49866
49877
  const currentZone = reference.zone;
49867
49878
  const previousZone = previousReference.zone;
49868
49879
  if (currentZone.top !== currentZone.bottom || currentZone.left !== currentZone.right || previousZone.top !== previousZone.bottom || previousZone.left !== previousZone.right) {
49869
49880
  previousReferences[index] = deepCopy(reference);
49870
- return getRangeString(reference, forSheetId, this.getters.getSheetName);
49881
+ return getRangeString(reference, forSheetId, this.getters.getSheetName, this.rangeToStringOptions);
49871
49882
  }
49872
49883
  const diffCol = reference.zone.left - previousReference.zone.left;
49873
49884
  const diffRow = reference.zone.top - previousReference.zone.top;
@@ -49875,7 +49886,7 @@ var Squisher = class {
49875
49886
  previousReference.unboundedZone = deepCopy(reference.unboundedZone);
49876
49887
  if (diffCol !== 0 && diffRow === 0) return `${diffCol > 0 ? "+" : "-"}C${Math.abs(diffCol)}`;
49877
49888
  else if (diffRow !== 0 && diffCol === 0) return `${diffRow > 0 ? "+" : "-"}R${Math.abs(diffRow)}`;
49878
- return getRangeString(reference, forSheetId, this.getters.getSheetName);
49889
+ return getRangeString(reference, forSheetId, this.getters.getSheetName, this.rangeToStringOptions);
49879
49890
  }
49880
49891
  /**
49881
49892
  * Squish the number parameters. Result for each parameter should be compared the previous formula.
@@ -50084,10 +50095,19 @@ var Unsquisher = class {
50084
50095
  case "FIRST_OFFSET": {
50085
50096
  const currentOffset = current;
50086
50097
  this.previousOffset = currentOffset;
50087
- for (const position of targetPositions) yield {
50088
- position,
50089
- compiled: this.unsquishFormula(currentOffset, sheetId, getters)
50090
- };
50098
+ for (const position of targetPositions) {
50099
+ const result = this.unsquishFormula(currentOffset, sheetId, getters);
50100
+ if (!result.areRangeShapesInLineWithNormalizedFormula()) {
50101
+ const formulaString = result.toFormulaString(getters);
50102
+ yield {
50103
+ position,
50104
+ compiled: CompiledFormula.Compile(formulaString, sheetId, getters)
50105
+ };
50106
+ } else yield {
50107
+ position,
50108
+ compiled: result
50109
+ };
50110
+ }
50091
50111
  break;
50092
50112
  }
50093
50113
  case "COMBINE_OFFSET": {
@@ -50096,10 +50116,19 @@ var Unsquisher = class {
50096
50116
  this.previousOffset.N = currentOffset.N ?? this.previousOffset.N;
50097
50117
  this.previousOffset.S = currentOffset.S ?? this.previousOffset.S;
50098
50118
  this.previousOffset.R = currentOffset.R ?? this.previousOffset.R;
50099
- for (const position of targetPositions) yield {
50100
- position,
50101
- compiled: this.unsquishFormula(this.previousOffset, sheetId, getters)
50102
- };
50119
+ for (const position of targetPositions) {
50120
+ const result = this.unsquishFormula(this.previousOffset, sheetId, getters);
50121
+ if (!result.areRangeShapesInLineWithNormalizedFormula()) {
50122
+ const formulaString = result.toFormulaString(getters);
50123
+ yield {
50124
+ position,
50125
+ compiled: CompiledFormula.Compile(formulaString, sheetId, getters)
50126
+ };
50127
+ } else yield {
50128
+ position,
50129
+ compiled: result
50130
+ };
50131
+ }
50103
50132
  break;
50104
50133
  }
50105
50134
  case "NEW_NUMBER":
@@ -57860,6 +57889,8 @@ var PivotUIPlugin = class extends CoreViewPlugin {
57860
57889
  pivots = {};
57861
57890
  unusedPivotsInFormulas;
57862
57891
  custom;
57892
+ pivotPositionCache = new PositionMap();
57893
+ shouldInvalidateCache = false;
57863
57894
  constructor(config) {
57864
57895
  super(config);
57865
57896
  this.custom = config.custom;
@@ -57870,7 +57901,11 @@ var PivotUIPlugin = class extends CoreViewPlugin {
57870
57901
  }
57871
57902
  }
57872
57903
  handle(cmd) {
57873
- if (invalidateEvaluationCommands.has(cmd.type)) for (const pivotId of this.getters.getPivotIds()) this.setupPivot(pivotId, { recreate: true });
57904
+ if (invalidateEvaluationCommands.has(cmd.type)) {
57905
+ this.shouldInvalidateCache = true;
57906
+ for (const pivotId of this.getters.getPivotIds()) this.setupPivot(pivotId, { recreate: true });
57907
+ }
57908
+ if (cmd.type === "UPDATE_CELL") this.shouldInvalidateCache = true;
57874
57909
  switch (cmd.type) {
57875
57910
  case "REFRESH_PIVOT":
57876
57911
  this.refreshPivot(cmd.id);
@@ -57910,6 +57945,12 @@ var PivotUIPlugin = class extends CoreViewPlugin {
57910
57945
  break;
57911
57946
  }
57912
57947
  }
57948
+ finalize() {
57949
+ if (this.shouldInvalidateCache) {
57950
+ this.pivotPositionCache = new PositionMap();
57951
+ this.shouldInvalidateCache = false;
57952
+ }
57953
+ }
57913
57954
  /**
57914
57955
  * Get the id of the first pivot in the formula at the given position. Returns undefined if there
57915
57956
  * is no pivot at this position
@@ -57921,9 +57962,14 @@ var PivotUIPlugin = class extends CoreViewPlugin {
57921
57962
  * Get all of the ids of the pivot present in the formula at the given position.
57922
57963
  */
57923
57964
  getPivotIdsFromPosition(position) {
57924
- const cell = this.getters.getCorrespondingFormulaCell(position);
57925
- if (cell && cell.isFormula) return this.getPivotIdsFromFormula(position.sheetId, cell.compiledFormula);
57926
- return [];
57965
+ if (!this.pivotPositionCache.has(position)) {
57966
+ const cell = this.getters.getCorrespondingFormulaCell(position);
57967
+ if (cell && cell.isFormula) {
57968
+ const pivotIds = this.getPivotIdsFromFormula(position.sheetId, cell.compiledFormula);
57969
+ this.pivotPositionCache.set(position, pivotIds);
57970
+ }
57971
+ }
57972
+ return this.pivotPositionCache.get(position) || [];
57927
57973
  }
57928
57974
  getPivotIdsFromFormula(sheetId, formula) {
57929
57975
  return this.getPivotFunctions(sheetId, formula).map((pivotFunction) => {
@@ -59668,17 +59714,32 @@ var TableComputedStylePlugin = class extends UIPlugin {
59668
59714
  getCellTableStyle(position) {
59669
59715
  const table = this.getters.getTable(position);
59670
59716
  if (!table) return;
59671
- return this.tableStyles[position.sheetId][table.id]().styles[position.col]?.[position.row];
59717
+ try {
59718
+ return this.tableStyles[position.sheetId][table.id]().styles[position.col]?.[position.row];
59719
+ } catch (e) {
59720
+ if (isEvaluationError(e) || e instanceof EvaluationError) return;
59721
+ throw e;
59722
+ }
59672
59723
  }
59673
59724
  getCellTableBorder(position) {
59674
59725
  const table = this.getters.getTable(position);
59675
59726
  if (!table) return;
59676
- return this.tableStyles[position.sheetId][table.id]().borders[position.col]?.[position.row];
59727
+ try {
59728
+ return this.tableStyles[position.sheetId][table.id]().borders[position.col]?.[position.row];
59729
+ } catch (e) {
59730
+ if (isEvaluationError(e) || e instanceof EvaluationError) return;
59731
+ throw e;
59732
+ }
59677
59733
  }
59678
59734
  computeTableStyle(sheetId, table) {
59679
59735
  return lazy(() => {
59680
59736
  const style = this.getters.getTableStyle(table.config.styleId);
59681
- const { tableMetaData, config } = this.getTableMetaData(sheetId, table);
59737
+ const tableMetaDataAndConfig = this.getTableMetaData(sheetId, table);
59738
+ if (!tableMetaDataAndConfig) return {
59739
+ borders: {},
59740
+ styles: {}
59741
+ };
59742
+ const { tableMetaData, config } = tableMetaDataAndConfig;
59682
59743
  const relativeTableStyle = getComputedTableStyle(config, style, tableMetaData);
59683
59744
  const mapping = this.getTableMapping(sheetId, table);
59684
59745
  const absoluteTableStyle = {
@@ -59716,6 +59777,7 @@ var TableComputedStylePlugin = class extends UIPlugin {
59716
59777
  const pivotInfo = this.getters.getPivotStyleAtPosition(mainPosition);
59717
59778
  if (!pivotInfo) throw new Error("No dynamic pivot info found at pivot table position");
59718
59779
  const pivot = this.getters.getPivot(pivotInfo.pivotId);
59780
+ if (!pivot.isValid()) return;
59719
59781
  const pivotStyle = pivotInfo.pivotStyle;
59720
59782
  const maxRowDepth = pivot.getExpandedTableStructure().getNumberOfRowGroupBys();
59721
59783
  const pivotTable = pivot.getCollapsedTableStructure();
@@ -61010,14 +61072,13 @@ var CollaborativePlugin = class extends UIPlugin {
61010
61072
  * Get the list of others connected clients which are present in the same sheet
61011
61073
  * and with a valid position
61012
61074
  */
61013
- getClientsToDisplay() {
61075
+ getClientsToDisplay(sheetId) {
61014
61076
  try {
61015
61077
  this.getters.getCurrentClient();
61016
61078
  } catch (e) {
61017
61079
  if (e instanceof ClientDisconnectedError) return [];
61018
61080
  else throw e;
61019
61081
  }
61020
- const sheetId = this.getters.getActiveSheetId();
61021
61082
  const clients = [];
61022
61083
  for (const client of this.getters.getConnectedClients()) if (client.id !== this.getters.getCurrentClient().id && client.position && client.position.sheetId === sheetId && this.isPositionValid(client.position)) clients.push({
61023
61084
  ...client,
@@ -61028,7 +61089,7 @@ var CollaborativePlugin = class extends UIPlugin {
61028
61089
  drawLayer(renderingContext) {
61029
61090
  if (this.getters.isDashboard()) return;
61030
61091
  const { ctx, thinLineWidth, viewports, sheetId } = renderingContext;
61031
- for (const client of this.getClientsToDisplay()) {
61092
+ for (const client of this.getClientsToDisplay(sheetId)) {
61032
61093
  const { row, col } = client.position;
61033
61094
  const zone = this.getters.expandZone(sheetId, {
61034
61095
  top: row,
@@ -61331,8 +61392,8 @@ var HeaderVisibilityUIPlugin = class extends UIPlugin {
61331
61392
  getNextVisibleCellPosition({ sheetId, col, row }) {
61332
61393
  return {
61333
61394
  sheetId,
61334
- col: this.findVisibleHeader(sheetId, "COL", col, this.getters.getNumberCols(sheetId) - 1),
61335
- row: this.findVisibleHeader(sheetId, "ROW", row, this.getters.getNumberRows(sheetId) - 1)
61395
+ col: this.findVisibleHeader(sheetId, "COL", col, this.getters.getNumberCols(sheetId) - 1) || this.findVisibleHeader(sheetId, "COL", col, 0) || 0,
61396
+ row: this.findVisibleHeader(sheetId, "ROW", row, this.getters.getNumberRows(sheetId) - 1) || this.findVisibleHeader(sheetId, "ROW", row, 0) || 0
61336
61397
  };
61337
61398
  }
61338
61399
  /**
@@ -84424,7 +84485,8 @@ const helpers = {
84424
84485
  parseFormat,
84425
84486
  isFormula,
84426
84487
  domainToColRowDomain,
84427
- collapseHierarchicalDisplayName
84488
+ collapseHierarchicalDisplayName,
84489
+ PositionMap
84428
84490
  };
84429
84491
  const links = {
84430
84492
  isMarkdownLink,
@@ -84546,6 +84608,6 @@ const chartHelpers = {
84546
84608
  //#endregion
84547
84609
  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 };
84548
84610
 
84549
- __info__.version = "19.3.11";
84550
- __info__.date = "2026-07-13T06:26:28.422Z";
84551
- __info__.hash = "35c06d3";
84611
+ __info__.version = "19.3.13";
84612
+ __info__.date = "2026-07-23T07:41:06.182Z";
84613
+ __info__.hash = "2059bd0";