@odoo/o-spreadsheet 19.0.17 → 19.0.18

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.0.17
6
- * @date 2026-01-14T10:01:24.044Z
7
- * @hash 2165bad
5
+ * @version 19.0.18
6
+ * @date 2026-01-21T11:06:57.346Z
7
+ * @hash bd44f59
8
8
  */
9
9
 
10
10
  import { useEnv, useSubEnv, onWillUnmount, useComponent, status, Component, useRef, onMounted, useEffect, App, blockDom, useState, onPatched, useExternalListener, onWillUpdateProps, onWillStart, onWillPatch, xml, useChildSubEnv, markRaw, toRaw } from '@odoo/owl';
@@ -40,7 +40,8 @@ function createAction(item) {
40
40
  return children
41
41
  .map((child) => (typeof child === "function" ? child(env) : child))
42
42
  .flat()
43
- .map(createAction);
43
+ .map(createAction)
44
+ .sort((a, b) => a.sequence - b.sequence);
44
45
  }
45
46
  : () => [],
46
47
  isReadonlyAllowed: item.isReadonlyAllowed || false,
@@ -780,6 +781,7 @@ const DEFAULT_STYLE = {
780
781
  fillColor: "",
781
782
  textColor: "",
782
783
  };
784
+ const DEFAULT_NUMBER_STYLE = { ...DEFAULT_STYLE, align: "right" };
783
785
  const DEFAULT_VERTICAL_ALIGN = DEFAULT_STYLE.verticalAlign;
784
786
  const DEFAULT_WRAPPING_MODE = DEFAULT_STYLE.wrapping;
785
787
  // Fonts
@@ -5026,7 +5028,11 @@ function evaluatePredicate(value = "", criterion, locale) {
5026
5028
  if (operator === "<>" || operator === "=") {
5027
5029
  let result;
5028
5030
  if (typeof value === typeof operand) {
5029
- if (typeof value === "string" && typeof operand === "string") {
5031
+ if (value === "" && operand === "") {
5032
+ // fast path to avoid regex evaluation
5033
+ result = true;
5034
+ }
5035
+ else if (typeof value === "string" && typeof operand === "string") {
5030
5036
  result = wildcardToRegExp(operand).test(value);
5031
5037
  }
5032
5038
  else {
@@ -7052,7 +7058,7 @@ function getApplyRangeChangeRemoveColRow(cmd) {
7052
7058
  const groups = groupConsecutive(elements);
7053
7059
  return (range) => {
7054
7060
  if (range.sheetId !== cmd.sheetId) {
7055
- return { changeType: "NONE" };
7061
+ return { changeType: "NONE", range };
7056
7062
  }
7057
7063
  let newRange = range;
7058
7064
  let changeType = "NONE";
@@ -7079,10 +7085,7 @@ function getApplyRangeChangeRemoveColRow(cmd) {
7079
7085
  newRange = createAdaptedRange(newRange, dimension, changeType, -(max - min + 1));
7080
7086
  }
7081
7087
  }
7082
- if (changeType !== "NONE") {
7083
- return { changeType, range: newRange };
7084
- }
7085
- return { changeType: "NONE" };
7088
+ return { changeType, range: newRange };
7086
7089
  };
7087
7090
  }
7088
7091
  function getApplyRangeChangeAddColRow(cmd) {
@@ -7091,7 +7094,7 @@ function getApplyRangeChangeAddColRow(cmd) {
7091
7094
  const dimension = cmd.dimension === "COL" ? "columns" : "rows";
7092
7095
  return (range) => {
7093
7096
  if (range.sheetId !== cmd.sheetId) {
7094
- return { changeType: "NONE" };
7097
+ return { changeType: "NONE", range };
7095
7098
  }
7096
7099
  if (cmd.position === "after") {
7097
7100
  if (range.zone[start] <= cmd.base && cmd.base < range.zone[end]) {
@@ -7121,13 +7124,13 @@ function getApplyRangeChangeAddColRow(cmd) {
7121
7124
  };
7122
7125
  }
7123
7126
  }
7124
- return { changeType: "NONE" };
7127
+ return { changeType: "NONE", range };
7125
7128
  };
7126
7129
  }
7127
7130
  function getApplyRangeChangeDeleteSheet(cmd) {
7128
7131
  return (range) => {
7129
7132
  if (range.sheetId !== cmd.sheetId && range.invalidSheetName !== cmd.sheetName) {
7130
- return { changeType: "NONE" };
7133
+ return { changeType: "NONE", range };
7131
7134
  }
7132
7135
  const invalidSheetName = cmd.sheetName;
7133
7136
  range = {
@@ -7154,14 +7157,14 @@ function getApplyRangeChangeRenameSheet(cmd) {
7154
7157
  const newRange = { ...range, sheetId, invalidSheetName };
7155
7158
  return { changeType: "CHANGE", range: newRange };
7156
7159
  }
7157
- return { changeType: "NONE" };
7160
+ return { changeType: "NONE", range };
7158
7161
  };
7159
7162
  }
7160
7163
  function getApplyRangeChangeMoveRange(cmd) {
7161
7164
  const originZone = cmd.target[0];
7162
7165
  return (range) => {
7163
7166
  if (range.sheetId !== cmd.sheetId || !isZoneInside(range.zone, originZone)) {
7164
- return { changeType: "NONE" };
7167
+ return { changeType: "NONE", range };
7165
7168
  }
7166
7169
  const targetSheetId = cmd.targetSheetId;
7167
7170
  const offsetX = cmd.col - originZone.left;
@@ -7327,11 +7330,20 @@ function computeTextLinesHeight(textLineHeight, numberOfLines = 1) {
7327
7330
  /**
7328
7331
  * Get the default height of the cell given its style.
7329
7332
  */
7330
- function getDefaultCellHeight(ctx, cell, colSize) {
7333
+ function getDefaultCellHeight(ctx, cell, locale, colSize) {
7331
7334
  if (!cell || (!cell.isFormula && !cell.content)) {
7332
7335
  return DEFAULT_CELL_HEIGHT;
7333
7336
  }
7334
- const content = cell.isFormula ? "" : cell.content;
7337
+ let content = "";
7338
+ try {
7339
+ if (!cell.isFormula) {
7340
+ const localeFormat = { format: cell.format, locale };
7341
+ content = formatValue(parseLiteral(cell.content, locale), localeFormat);
7342
+ }
7343
+ }
7344
+ catch {
7345
+ content = CellErrorType.GenericError;
7346
+ }
7335
7347
  return getCellContentHeight(ctx, content, cell.style, colSize);
7336
7348
  }
7337
7349
  function getCellContentHeight(ctx, content, style, colSize) {
@@ -22225,7 +22237,16 @@ function createComputeFunction(descr) {
22225
22237
  }
22226
22238
  acceptToVectorize.push(!argDefinition.acceptMatrix);
22227
22239
  }
22228
- return applyVectorization(errorHandlingCompute.bind(this), args, acceptToVectorize);
22240
+ return replaceErrorPlaceholderInResult(applyVectorization(errorHandlingCompute.bind(this), args, acceptToVectorize));
22241
+ }
22242
+ function replaceErrorPlaceholderInResult(result) {
22243
+ if (!isMatrix(result)) {
22244
+ replaceFunctionNamePlaceholder(result, descr.name);
22245
+ }
22246
+ else {
22247
+ matrixForEach(result, (result) => replaceFunctionNamePlaceholder(result, descr.name));
22248
+ }
22249
+ return result;
22229
22250
  }
22230
22251
  function errorHandlingCompute(...args) {
22231
22252
  for (let i = 0; i < args.length; i++) {
@@ -22254,13 +22275,12 @@ function createComputeFunction(descr) {
22254
22275
  const result = descr.compute.apply(this, args);
22255
22276
  if (!isMatrix(result)) {
22256
22277
  if (typeof result === "object" && result !== null && "value" in result) {
22257
- replaceFunctionNamePlaceholder(result, descr.name);
22258
22278
  return result;
22259
22279
  }
22280
+ descr.name;
22260
22281
  return { value: result };
22261
22282
  }
22262
22283
  if (typeof result[0][0] === "object" && result[0][0] !== null && "value" in result[0][0]) {
22263
- matrixForEach(result, (result) => replaceFunctionNamePlaceholder(result, descr.name));
22264
22284
  return result;
22265
22285
  }
22266
22286
  return matrixMap(result, (row) => ({ value: row }));
@@ -22773,7 +22793,7 @@ function adaptFormulaStringRanges(defaultSheetId, formula, applyChange) {
22773
22793
  continue;
22774
22794
  }
22775
22795
  const sheetXC = tokens[tokenIdx].value;
22776
- const newSheetXC = adaptStringRange(defaultSheetId, sheetXC, applyChange);
22796
+ const newSheetXC = adaptStringRange(defaultSheetId, sheetXC, applyChange).range;
22777
22797
  if (sheetXC !== newSheetXC) {
22778
22798
  tokens[tokenIdx] = {
22779
22799
  value: newSheetXC,
@@ -22783,23 +22803,30 @@ function adaptFormulaStringRanges(defaultSheetId, formula, applyChange) {
22783
22803
  }
22784
22804
  return concat$1(tokens.map((token) => token.value));
22785
22805
  }
22786
- function adaptStringRange(defaultSheetId, sheetXC, applyChange) {
22806
+ function adaptStringRange(defaultSheetId, sheetXC, rangeAdapter) {
22787
22807
  const sheetName = splitReference(sheetXC).sheetName;
22788
22808
  if (sheetName
22789
- ? !isSheetNameEqual(sheetName, applyChange.sheetName.old)
22790
- : defaultSheetId !== applyChange.sheetId) {
22791
- return sheetXC;
22809
+ ? !isSheetNameEqual(sheetName, rangeAdapter.sheetName.old)
22810
+ : defaultSheetId !== rangeAdapter.sheetId) {
22811
+ return { changeType: "NONE", range: sheetXC };
22792
22812
  }
22793
- const sheetId = sheetName ? applyChange.sheetId : defaultSheetId;
22813
+ const sheetId = sheetName ? rangeAdapter.sheetId : defaultSheetId;
22794
22814
  const range = getRange(sheetXC, sheetId);
22795
22815
  if (range.invalidXc) {
22796
- return sheetXC;
22816
+ return { changeType: "NONE", range: sheetXC };
22797
22817
  }
22798
- const change = applyChange.applyChange(range);
22818
+ const change = rangeAdapter.applyChange(range);
22799
22819
  if (change.changeType === "NONE" || change.changeType === "REMOVE") {
22800
- return sheetXC;
22820
+ return { changeType: change.changeType, range: sheetXC };
22821
+ }
22822
+ const rangeStr = getRangeString(change.range, defaultSheetId, getSheetNameGetter(rangeAdapter));
22823
+ if (rangeStr === CellErrorType.InvalidReference) {
22824
+ return { changeType: "REMOVE", range: rangeStr };
22801
22825
  }
22802
- return getRangeString(change.range, defaultSheetId, getSheetNameGetter(applyChange));
22826
+ return {
22827
+ changeType: change.changeType,
22828
+ range: rangeStr,
22829
+ };
22803
22830
  }
22804
22831
  function getSheetNameGetter(applyChange) {
22805
22832
  return (sheetId) => {
@@ -22904,8 +22931,6 @@ function adaptChartRange(range, applyChange) {
22904
22931
  }
22905
22932
  const change = applyChange(range);
22906
22933
  switch (change.changeType) {
22907
- case "NONE":
22908
- return range;
22909
22934
  case "REMOVE":
22910
22935
  return undefined;
22911
22936
  default:
@@ -23057,16 +23082,16 @@ function toExcelLabelRange(getters, labelRange, shouldRemoveFirstLabel) {
23057
23082
  function transformChartDefinitionWithDataSetsWithZone(chartSheetId, definition, applyChange) {
23058
23083
  let labelRange;
23059
23084
  if (definition.labelRange) {
23060
- const adaptedRange = adaptStringRange(chartSheetId, definition.labelRange, applyChange);
23061
- if (adaptedRange !== CellErrorType.InvalidReference) {
23085
+ const { changeType, range: adaptedRange } = adaptStringRange(chartSheetId, definition.labelRange, applyChange);
23086
+ if (changeType !== "REMOVE") {
23062
23087
  labelRange = adaptedRange;
23063
23088
  }
23064
23089
  }
23065
23090
  const dataSets = [];
23066
23091
  for (const dataSet of definition.dataSets) {
23067
23092
  const newDataSet = { ...dataSet };
23068
- const adaptedRange = adaptStringRange(chartSheetId, dataSet.dataRange, applyChange);
23069
- if (adaptedRange !== CellErrorType.InvalidReference) {
23093
+ const { changeType, range: adaptedRange } = adaptStringRange(chartSheetId, dataSet.dataRange, applyChange);
23094
+ if (changeType !== "REMOVE") {
23070
23095
  newDataSet.dataRange = adaptedRange;
23071
23096
  dataSets.push(newDataSet);
23072
23097
  }
@@ -24465,14 +24490,14 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
24465
24490
  let baseline;
24466
24491
  let keyValue;
24467
24492
  if (definition.baseline) {
24468
- const adaptedRange = adaptStringRange(chartSheetId, definition.baseline, applyChange);
24469
- if (adaptedRange !== CellErrorType.InvalidReference) {
24493
+ const { changeType, range: adaptedRange } = adaptStringRange(chartSheetId, definition.baseline, applyChange);
24494
+ if (changeType !== "REMOVE") {
24470
24495
  baseline = adaptedRange;
24471
24496
  }
24472
24497
  }
24473
24498
  if (definition.keyValue) {
24474
- const adaptedRange = adaptStringRange(chartSheetId, definition.keyValue, applyChange);
24475
- if (adaptedRange !== CellErrorType.InvalidReference) {
24499
+ const { changeType, range: adaptedRange } = adaptStringRange(chartSheetId, definition.keyValue, applyChange);
24500
+ if (changeType !== "REMOVE") {
24476
24501
  keyValue = adaptedRange;
24477
24502
  }
24478
24503
  }
@@ -24529,7 +24554,7 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
24529
24554
  // This kind of graph is not exportable in Excel
24530
24555
  return undefined;
24531
24556
  }
24532
- updateRanges(applyChange) {
24557
+ updateRanges({ applyChange }) {
24533
24558
  const baseline = adaptChartRange(this.baseline, applyChange);
24534
24559
  const keyValue = adaptChartRange(this.keyValue, applyChange);
24535
24560
  if (this.baseline === baseline && this.keyValue === keyValue) {
@@ -27695,7 +27720,7 @@ class BarChart extends AbstractChart {
27695
27720
  verticalAxis: getDefinedAxis(definition),
27696
27721
  };
27697
27722
  }
27698
- updateRanges(applyChange) {
27723
+ updateRanges({ applyChange }) {
27699
27724
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
27700
27725
  if (!isStale) {
27701
27726
  return this;
@@ -28901,7 +28926,7 @@ class ComboChart extends AbstractChart {
28901
28926
  verticalAxis: getDefinedAxis(definition),
28902
28927
  };
28903
28928
  }
28904
- updateRanges(applyChange) {
28929
+ updateRanges({ applyChange }) {
28905
28930
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
28906
28931
  if (!isStale) {
28907
28932
  return this;
@@ -29077,7 +29102,7 @@ class FunnelChart extends AbstractChart {
29077
29102
  getDefinitionForExcel() {
29078
29103
  return undefined;
29079
29104
  }
29080
- updateRanges(applyChange) {
29105
+ updateRanges({ applyChange }) {
29081
29106
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
29082
29107
  if (!isStale) {
29083
29108
  return this;
@@ -29188,8 +29213,8 @@ class GaugeChart extends AbstractChart {
29188
29213
  static transformDefinition(chartSheetId, definition, applyChange) {
29189
29214
  let dataRange;
29190
29215
  if (definition.dataRange) {
29191
- const adaptedRange = adaptStringRange(chartSheetId, definition.dataRange, applyChange);
29192
- if (adaptedRange !== CellErrorType.InvalidReference) {
29216
+ const { changeType, range: adaptedRange } = adaptStringRange(chartSheetId, definition.dataRange, applyChange);
29217
+ if (changeType !== "REMOVE") {
29193
29218
  dataRange = adaptedRange;
29194
29219
  }
29195
29220
  }
@@ -29266,13 +29291,9 @@ class GaugeChart extends AbstractChart {
29266
29291
  : undefined,
29267
29292
  };
29268
29293
  }
29269
- updateRanges(applyChange, sheetId, adaptSheetName) {
29294
+ updateRanges({ applyChange, adaptFormulaString }) {
29270
29295
  const dataRange = adaptChartRange(this.dataRange, applyChange);
29271
- const adaptFormula = (formula) => adaptFormulaStringRanges(this.sheetId, formula, {
29272
- applyChange,
29273
- sheetId,
29274
- sheetName: adaptSheetName,
29275
- });
29296
+ const adaptFormula = (formula) => adaptFormulaString(this.sheetId, formula);
29276
29297
  const sectionRule = adaptSectionRuleFormulas(this.sectionRule, adaptFormula);
29277
29298
  const definition = this.getDefinitionWithSpecificRanges(dataRange, sectionRule);
29278
29299
  return new GaugeChart(definition, this.sheetId, this.getters);
@@ -29500,7 +29521,7 @@ class GeoChart extends AbstractChart {
29500
29521
  getDefinitionForExcel() {
29501
29522
  return undefined;
29502
29523
  }
29503
- updateRanges(applyChange) {
29524
+ updateRanges({ applyChange }) {
29504
29525
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
29505
29526
  if (!isStale) {
29506
29527
  return this;
@@ -29642,7 +29663,7 @@ class LineChart extends AbstractChart {
29642
29663
  : undefined,
29643
29664
  };
29644
29665
  }
29645
- updateRanges(applyChange) {
29666
+ updateRanges({ applyChange }) {
29646
29667
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
29647
29668
  if (!isStale) {
29648
29669
  return this;
@@ -29799,7 +29820,7 @@ class PieChart extends AbstractChart {
29799
29820
  labelRange,
29800
29821
  };
29801
29822
  }
29802
- updateRanges(applyChange) {
29823
+ updateRanges({ applyChange }) {
29803
29824
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
29804
29825
  if (!isStale) {
29805
29826
  return this;
@@ -29954,7 +29975,7 @@ class PyramidChart extends AbstractChart {
29954
29975
  maxValue,
29955
29976
  };
29956
29977
  }
29957
- updateRanges(applyChange) {
29978
+ updateRanges({ applyChange }) {
29958
29979
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
29959
29980
  if (!isStale) {
29960
29981
  return this;
@@ -30104,7 +30125,7 @@ class RadarChart extends AbstractChart {
30104
30125
  labelRange,
30105
30126
  };
30106
30127
  }
30107
- updateRanges(applyChange) {
30128
+ updateRanges({ applyChange }) {
30108
30129
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
30109
30130
  if (!isStale) {
30110
30131
  return this;
@@ -30232,7 +30253,7 @@ class ScatterChart extends AbstractChart {
30232
30253
  : undefined,
30233
30254
  };
30234
30255
  }
30235
- updateRanges(applyChange) {
30256
+ updateRanges({ applyChange }) {
30236
30257
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
30237
30258
  if (!isStale) {
30238
30259
  return this;
@@ -30399,7 +30420,7 @@ class SunburstChart extends AbstractChart {
30399
30420
  getDefinitionForExcel() {
30400
30421
  return undefined;
30401
30422
  }
30402
- updateRanges(applyChange) {
30423
+ updateRanges({ applyChange }) {
30403
30424
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
30404
30425
  if (!isStale) {
30405
30426
  return this;
@@ -30549,7 +30570,7 @@ class TreeMapChart extends AbstractChart {
30549
30570
  getDefinitionForExcel() {
30550
30571
  return undefined;
30551
30572
  }
30552
- updateRanges(applyChange) {
30573
+ updateRanges({ applyChange }) {
30553
30574
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
30554
30575
  if (!isStale) {
30555
30576
  return this;
@@ -30710,7 +30731,7 @@ class WaterfallChart extends AbstractChart {
30710
30731
  // TODO: implement export excel
30711
30732
  return undefined;
30712
30733
  }
30713
- updateRanges(applyChange) {
30734
+ updateRanges({ applyChange }) {
30714
30735
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
30715
30736
  if (!isStale) {
30716
30737
  return this;
@@ -35227,7 +35248,6 @@ class AbstractComposerStore extends SpreadsheetStore {
35227
35248
  });
35228
35249
  }
35229
35250
  handleEvent(event) {
35230
- this.hideHelp();
35231
35251
  const sheetId = this.getters.getActiveSheetId();
35232
35252
  let unboundedZone;
35233
35253
  if (event.options.unbounded) {
@@ -35575,6 +35595,7 @@ class AbstractComposerStore extends SpreadsheetStore {
35575
35595
  this.colorIndexByRange = {};
35576
35596
  this.hoveredTokens = [];
35577
35597
  this.hoveredContentEvaluation = "";
35598
+ this.hideHelp();
35578
35599
  }
35579
35600
  /**
35580
35601
  * Reset the current content to the active cell content
@@ -40817,6 +40838,7 @@ function extractStyle(data, content, styleId, formatId, borderId) {
40817
40838
  ? V_ALIGNMENT_EXPORT_CONVERSION_MAP[style.verticalAlign]
40818
40839
  : undefined,
40819
40840
  wrapText: style.wrapping === "wrap" || content?.includes(NEWLINE) ? true : undefined,
40841
+ shrinkToFit: style.wrapping === "clip" ? true : undefined,
40820
40842
  },
40821
40843
  };
40822
40844
  styles.font["strike"] = !!style?.strikethrough || undefined;
@@ -40837,6 +40859,7 @@ function normalizeStyle(construct, styles) {
40837
40859
  vertical: styles.alignment.vertical,
40838
40860
  horizontal: styles.alignment.horizontal,
40839
40861
  wrapText: styles.alignment.wrapText,
40862
+ shrinkToFit: styles.alignment.shrinkToFit,
40840
40863
  },
40841
40864
  };
40842
40865
  return pushElement(style, construct.styles);
@@ -47887,8 +47910,6 @@ function adaptPivotRange(range, applyChange) {
47887
47910
  }
47888
47911
  const change = applyChange(range);
47889
47912
  switch (change.changeType) {
47890
- case "NONE":
47891
- return range;
47892
47913
  case "REMOVE":
47893
47914
  return undefined;
47894
47915
  default:
@@ -55454,7 +55475,7 @@ class GaugeChartConfigPanel extends Component {
55454
55475
  });
55455
55476
  dataRange = this.props.definition.dataRange;
55456
55477
  get configurationErrorMessages() {
55457
- const cancelledReasons = [...(this.state.dataRangeDispatchResult?.reasons || [])];
55478
+ const cancelledReasons = [...(this.state.dataRangeDispatchResult?.reasons || [])].filter((reason) => reason !== "NoChanges" /* CommandResult.NoChanges */);
55458
55479
  return cancelledReasons.map((error) => ChartTerms.Errors[error] || ChartTerms.Errors.Unexpected);
55459
55480
  }
55460
55481
  get isDataRangeInvalid() {
@@ -55540,7 +55561,7 @@ class GaugeChartDesignPanel extends Component {
55540
55561
  });
55541
55562
  }
55542
55563
  get designErrorMessages() {
55543
- const cancelledReasons = [...(this.state.sectionRuleCancelledReasons || [])];
55564
+ const cancelledReasons = [...(this.state.sectionRuleCancelledReasons || [])].filter((reason) => reason !== "NoChanges" /* CommandResult.NoChanges */);
55544
55565
  return cancelledReasons.map((error) => ChartTerms.Errors[error] || ChartTerms.Errors.Unexpected);
55545
55566
  }
55546
55567
  get isRangeMinInvalid() {
@@ -55912,7 +55933,7 @@ class ScorecardChartConfigPanel extends Component {
55912
55933
  const cancelledReasons = [
55913
55934
  ...(this.state.keyValueDispatchResult?.reasons || []),
55914
55935
  ...(this.state.baselineDispatchResult?.reasons || []),
55915
- ];
55936
+ ].filter((reason) => reason !== "NoChanges" /* CommandResult.NoChanges */);
55916
55937
  return cancelledReasons.map((error) => ChartTerms.Errors[error] || ChartTerms.Errors.Unexpected);
55917
55938
  }
55918
55939
  get isKeyValueInvalid() {
@@ -62218,7 +62239,7 @@ class CorePlugin extends BasePlugin {
62218
62239
  * @param sheetId an sheetId to adapt either range of that sheet specifically, or ranges pointing to that sheet
62219
62240
  * @param sheetName couple of old and new sheet names to adapt ranges pointing to that sheet
62220
62241
  */
62221
- adaptRanges(applyChange, sheetId, sheetName) { }
62242
+ adaptRanges(rangeAdapterFunctions, sheetId, sheetName) { }
62222
62243
  /**
62223
62244
  * Implement this method to clean unused external resources, such as images
62224
62245
  * stored on a server which have been deleted.
@@ -62297,7 +62318,7 @@ class BordersPlugin extends CorePlugin {
62297
62318
  }
62298
62319
  }
62299
62320
  }
62300
- adaptRanges(applyChange, sheetId) {
62321
+ adaptRanges({ applyChange }, sheetId) {
62301
62322
  const newBorders = [];
62302
62323
  for (const border of this.borders[sheetId] ?? []) {
62303
62324
  const change = applyChange(this.getters.getRangeFromZone(sheetId, border.zone));
@@ -62660,7 +62681,7 @@ class CellPlugin extends CorePlugin {
62660
62681
  ];
62661
62682
  nextId = 1;
62662
62683
  cells = {};
62663
- adaptRanges(applyChange, sheetId, sheetName) {
62684
+ adaptRanges({ applyChange }, sheetId, sheetName) {
62664
62685
  for (const sheet of Object.keys(this.cells)) {
62665
62686
  for (const cell of Object.values(this.cells[sheet] || {})) {
62666
62687
  if (cell.isFormula) {
@@ -62882,7 +62903,7 @@ class CellPlugin extends CorePlugin {
62882
62903
  for (const position of positions) {
62883
62904
  const cell = this.getters.getCell(position);
62884
62905
  const xc = toXC(position.col, position.row);
62885
- const style = this.removeDefaultStyleValues(cell.style);
62906
+ const style = this.extractCustomStyle(cell);
62886
62907
  if (Object.keys(style).length) {
62887
62908
  const styleId = getItemId(style, styles);
62888
62909
  positionsByStyle[styleId] ??= [];
@@ -62928,10 +62949,14 @@ class CellPlugin extends CorePlugin {
62928
62949
  }
62929
62950
  }
62930
62951
  }
62931
- removeDefaultStyleValues(style) {
62932
- const cleanedStyle = { ...style };
62933
- for (const property in DEFAULT_STYLE) {
62934
- if (cleanedStyle[property] === DEFAULT_STYLE[property]) {
62952
+ extractCustomStyle(cell) {
62953
+ const cleanedStyle = { ...cell.style };
62954
+ const defaultStyle = isNumber(cell.content, DEFAULT_LOCALE)
62955
+ ? DEFAULT_NUMBER_STYLE
62956
+ : DEFAULT_STYLE;
62957
+ for (const property in cleanedStyle) {
62958
+ if ((property !== "align" || !cell.isFormula) &&
62959
+ cleanedStyle[property] === defaultStyle[property]) {
62935
62960
  delete cleanedStyle[property];
62936
62961
  }
62937
62962
  }
@@ -63282,12 +63307,12 @@ class ChartPlugin extends CorePlugin {
63282
63307
  charts = {};
63283
63308
  createChart = chartFactory(this.getters);
63284
63309
  validateChartDefinition = (cmd) => validateChartDefinition(this, cmd.definition);
63285
- adaptRanges(applyChange, sheetId, adaptSheetName) {
63310
+ adaptRanges(rangeAdapters) {
63286
63311
  for (const [chartId, chart] of Object.entries(this.charts)) {
63287
63312
  if (!chart) {
63288
63313
  continue;
63289
63314
  }
63290
- const newChart = chart.chart.updateRanges(applyChange, sheetId, adaptSheetName);
63315
+ const newChart = chart.chart.updateRanges(rangeAdapters);
63291
63316
  this.history.update("charts", chartId, newChart ? { figureId: chart.figureId, chart: newChart } : undefined);
63292
63317
  }
63293
63318
  }
@@ -63542,7 +63567,7 @@ class ConditionalFormatPlugin extends CorePlugin {
63542
63567
  "getAdaptedCfRanges",
63543
63568
  ];
63544
63569
  cfRules = {};
63545
- adaptCFFormulas(applyChange) {
63570
+ adaptCFFormulas({ applyChange, adaptFormulaString }) {
63546
63571
  for (const sheetId in this.cfRules) {
63547
63572
  for (const rule of this.cfRules[sheetId]) {
63548
63573
  if (rule.rule.type === "DataBarRule" && rule.rule.rangeValues) {
@@ -63566,7 +63591,7 @@ class ConditionalFormatPlugin extends CorePlugin {
63566
63591
  for (let i = 0; i < rule.rule.values.length; i++) {
63567
63592
  this.history.update("cfRules", sheetId, this.cfRules[sheetId].indexOf(rule), "rule",
63568
63593
  //@ts-expect-error
63569
- "values", i, this.getters.adaptFormulaStringDependencies(sheetId, rule.rule.values[i], applyChange));
63594
+ "values", i, adaptFormulaString(sheetId, rule.rule.values[i]));
63570
63595
  }
63571
63596
  }
63572
63597
  else if (rule.rule.type === "IconSetRule") {
@@ -63574,7 +63599,7 @@ class ConditionalFormatPlugin extends CorePlugin {
63574
63599
  if (rule.rule[inflectionPoint].type === "formula") {
63575
63600
  this.history.update("cfRules", sheetId, this.cfRules[sheetId].indexOf(rule), "rule",
63576
63601
  //@ts-expect-error
63577
- inflectionPoint, "value", this.getters.adaptFormulaStringDependencies(sheetId, rule.rule[inflectionPoint].value, applyChange));
63602
+ inflectionPoint, "value", adaptFormulaString(sheetId, rule.rule[inflectionPoint].value));
63578
63603
  }
63579
63604
  }
63580
63605
  }
@@ -63584,14 +63609,14 @@ class ConditionalFormatPlugin extends CorePlugin {
63584
63609
  if (ruleValue?.type === "formula" && ruleValue?.value) {
63585
63610
  this.history.update("cfRules", sheetId, this.cfRules[sheetId].indexOf(rule), "rule",
63586
63611
  //@ts-expect-error
63587
- value, "value", this.getters.adaptFormulaStringDependencies(sheetId, ruleValue.value, applyChange));
63612
+ value, "value", adaptFormulaString(sheetId, ruleValue.value));
63588
63613
  }
63589
63614
  }
63590
63615
  }
63591
63616
  }
63592
63617
  }
63593
63618
  }
63594
- adaptCFRanges(sheetId, applyChange) {
63619
+ adaptCFRanges(sheetId, { applyChange }) {
63595
63620
  for (const rule of this.cfRules[sheetId]) {
63596
63621
  for (const range of rule.ranges) {
63597
63622
  const change = applyChange(range);
@@ -63615,12 +63640,12 @@ class ConditionalFormatPlugin extends CorePlugin {
63615
63640
  }
63616
63641
  }
63617
63642
  }
63618
- adaptRanges(applyChange, sheetId) {
63643
+ adaptRanges(rangeAdapters, sheetId) {
63619
63644
  const sheetIds = sheetId ? [sheetId] : Object.keys(this.cfRules);
63620
63645
  for (const sheetId of sheetIds) {
63621
- this.adaptCFRanges(sheetId, applyChange);
63646
+ this.adaptCFRanges(sheetId, rangeAdapters);
63622
63647
  }
63623
- this.adaptCFFormulas(applyChange);
63648
+ this.adaptCFFormulas(rangeAdapters);
63624
63649
  }
63625
63650
  // ---------------------------------------------------------------------------
63626
63651
  // Command Handling
@@ -63997,23 +64022,23 @@ class DataValidationPlugin extends CorePlugin {
63997
64022
  "getValidationRuleForCell",
63998
64023
  ];
63999
64024
  rules = {};
64000
- adaptRanges(applyChange, sheetId) {
64001
- this.adaptDVRanges(sheetId, applyChange);
64002
- this.adaptDVFormulas(applyChange);
64025
+ adaptRanges(rangeAdapters, sheetId) {
64026
+ this.adaptDVRanges(sheetId, rangeAdapters);
64027
+ this.adaptDVFormulas(rangeAdapters);
64003
64028
  }
64004
- adaptDVFormulas(applyChange) {
64029
+ adaptDVFormulas({ adaptFormulaString }) {
64005
64030
  for (const sheetId in this.rules) {
64006
64031
  const rules = this.rules[sheetId];
64007
64032
  for (let ruleIndex = rules.length - 1; ruleIndex >= 0; ruleIndex--) {
64008
64033
  const rule = this.rules[sheetId][ruleIndex];
64009
64034
  for (let valueIndex = 0; valueIndex < rule.criterion.values.length; valueIndex++) {
64010
- const value = this.getters.adaptFormulaStringDependencies(sheetId, rule.criterion.values[valueIndex], applyChange);
64035
+ const value = adaptFormulaString(sheetId, rule.criterion.values[valueIndex]);
64011
64036
  this.history.update("rules", sheetId, ruleIndex, "criterion", "values", valueIndex, value);
64012
64037
  }
64013
64038
  }
64014
64039
  }
64015
64040
  }
64016
- adaptDVRanges(sheetId, applyChange) {
64041
+ adaptDVRanges(sheetId, { applyChange }) {
64017
64042
  const rules = this.rules[sheetId];
64018
64043
  for (let ruleIndex = rules.length - 1; ruleIndex >= 0; ruleIndex--) {
64019
64044
  const rule = this.rules[sheetId][ruleIndex];
@@ -64287,7 +64312,7 @@ class FigurePlugin extends CorePlugin {
64287
64312
  // ---------------------------------------------------------------------------
64288
64313
  // Command Handling
64289
64314
  // ---------------------------------------------------------------------------
64290
- adaptRanges(applyChange, sheetId) {
64315
+ adaptRanges({ applyChange }, sheetId) {
64291
64316
  for (const figure of this.getFigures(sheetId)) {
64292
64317
  const change = applyChange(this.getters.getRangeFromZone(sheetId, {
64293
64318
  left: figure.col,
@@ -65118,8 +65143,8 @@ class MergePlugin extends CorePlugin {
65118
65143
  break;
65119
65144
  }
65120
65145
  }
65121
- adaptRanges(applyChange, sheetId) {
65122
- this.applyRangeChangeOnSheet(sheetId, applyChange);
65146
+ adaptRanges(rangeAdapters, sheetId) {
65147
+ this.applyRangeChangeOnSheet(sheetId, rangeAdapters);
65123
65148
  }
65124
65149
  // ---------------------------------------------------------------------------
65125
65150
  // Getters
@@ -65421,7 +65446,7 @@ class MergePlugin extends CorePlugin {
65421
65446
  /**
65422
65447
  * Apply a range change on merges of a particular sheet.
65423
65448
  */
65424
- applyRangeChangeOnSheet(sheetId, applyChange) {
65449
+ applyRangeChangeOnSheet(sheetId, { applyChange }) {
65425
65450
  const merges = Object.entries(this.merges[sheetId] || {});
65426
65451
  for (const [mergeId, range] of merges) {
65427
65452
  if (range) {
@@ -65495,7 +65520,7 @@ function rangeToMerge(mergeId, range) {
65495
65520
  };
65496
65521
  }
65497
65522
 
65498
- class RangeAdapter {
65523
+ class RangeAdapterPlugin {
65499
65524
  getters;
65500
65525
  providers = [];
65501
65526
  isAdaptingRanges = false;
@@ -65503,7 +65528,6 @@ class RangeAdapter {
65503
65528
  this.getters = getters;
65504
65529
  }
65505
65530
  static getters = [
65506
- "adaptFormulaStringDependencies",
65507
65531
  "copyFormulaStringForSheet",
65508
65532
  "extendRange",
65509
65533
  "getRangeString",
@@ -65534,8 +65558,8 @@ class RangeAdapter {
65534
65558
  throw new Error("Plugins cannot dispatch commands during adaptRanges phase");
65535
65559
  }
65536
65560
  const rangeAdapter = getRangeAdapter(cmd);
65537
- if (rangeAdapter?.applyChange) {
65538
- this.executeOnAllRanges(rangeAdapter.applyChange, rangeAdapter.sheetId, rangeAdapter.sheetName);
65561
+ if (rangeAdapter) {
65562
+ this.executeOnAllRanges(rangeAdapter);
65539
65563
  }
65540
65564
  }
65541
65565
  finalize() { }
@@ -65554,11 +65578,15 @@ class RangeAdapter {
65554
65578
  return result;
65555
65579
  };
65556
65580
  }
65557
- executeOnAllRanges(adaptRange, sheetId, sheetName) {
65581
+ executeOnAllRanges(rangeAdapter) {
65558
65582
  this.isAdaptingRanges = true;
65559
- const func = this.verifyRangeRemoved(adaptRange);
65583
+ const adapterFunctions = {
65584
+ applyChange: this.verifyRangeRemoved(rangeAdapter.applyChange),
65585
+ adaptRangeString: (defaultSheetId, sheetXC) => adaptStringRange(defaultSheetId, sheetXC, rangeAdapter),
65586
+ adaptFormulaString: (defaultSheetId, formula) => adaptFormulaStringRanges(defaultSheetId, formula, rangeAdapter),
65587
+ };
65560
65588
  for (const provider of this.providers) {
65561
- provider(func, sheetId, sheetName);
65589
+ provider(adapterFunctions, rangeAdapter.sheetId, rangeAdapter.sheetName);
65562
65590
  }
65563
65591
  this.isAdaptingRanges = false;
65564
65592
  }
@@ -65726,18 +65754,6 @@ class RangeAdapter {
65726
65754
  const unionOfZones = unionUnboundedZones(...zones);
65727
65755
  return this.getRangeFromZone(ranges[0].sheetId, unionOfZones);
65728
65756
  }
65729
- adaptFormulaStringDependencies(sheetId, formula, applyChange) {
65730
- if (!formula.startsWith("=")) {
65731
- return formula;
65732
- }
65733
- const compiledFormula = compile(formula);
65734
- const updatedDependencies = compiledFormula.dependencies.map((dep) => {
65735
- const range = this.getters.getRangeFromSheetXC(sheetId, dep);
65736
- const changedRange = applyChange(range);
65737
- return changedRange.changeType === "NONE" ? range : changedRange.range;
65738
- });
65739
- return this.getters.getFormulaString(sheetId, compiledFormula.tokens, updatedDependencies);
65740
- }
65741
65757
  /**
65742
65758
  * Copy a formula string to another sheet.
65743
65759
  *
@@ -66625,7 +66641,7 @@ class TablePlugin extends CorePlugin {
66625
66641
  static getters = ["getCoreTable", "getCoreTables", "getCoreTableMatchingTopLeft"];
66626
66642
  tables = {};
66627
66643
  nextTableId = 1;
66628
- adaptRanges(applyChange, sheetId) {
66644
+ adaptRanges({ applyChange }, sheetId) {
66629
66645
  for (const table of this.getCoreTables(sheetId)) {
66630
66646
  this.applyRangeChangeOnTable(sheetId, table, applyChange);
66631
66647
  }
@@ -67710,7 +67726,7 @@ class PivotCorePlugin extends CorePlugin {
67710
67726
  }
67711
67727
  }
67712
67728
  }
67713
- adaptRanges(applyChange) {
67729
+ adaptRanges({ applyChange, adaptFormulaString }) {
67714
67730
  for (const pivotId in this.pivots) {
67715
67731
  const definition = deepCopy(this.pivots[pivotId]?.definition);
67716
67732
  if (!definition) {
@@ -67730,19 +67746,13 @@ class PivotCorePlugin extends CorePlugin {
67730
67746
  continue;
67731
67747
  }
67732
67748
  const sheetId = measure.computedBy.sheetId;
67733
- const compiledFormula = this.compiledMeasureFormulas[pivotId][measureId].formula;
67734
- const newDependencies = [];
67735
- for (const range of compiledFormula.dependencies) {
67736
- const change = applyChange(range);
67737
- if (change.changeType === "NONE") {
67738
- newDependencies.push(range);
67739
- }
67740
- else {
67741
- newDependencies.push(change.range);
67742
- }
67743
- }
67744
- const newFormulaString = this.getters.getFormulaString(sheetId, compiledFormula.tokens, newDependencies);
67749
+ const { formula: compiledFormula, dependencies: indirectDependencies } = this.compiledMeasureFormulas[pivotId][measureId];
67750
+ // adapt direct dependencies
67751
+ this.history.update("compiledMeasureFormulas", pivotId, measureId, "formula", "dependencies", compiledFormula.dependencies.map((range) => applyChange(range).range));
67752
+ // adapt all dependencies (including indirect)
67753
+ this.history.update("compiledMeasureFormulas", pivotId, measure.id, "dependencies", indirectDependencies.map((range) => applyChange(range).range));
67745
67754
  const oldFormulaString = measure.computedBy.formula;
67755
+ const newFormulaString = adaptFormulaString(sheetId, oldFormulaString);
67746
67756
  if (newFormulaString !== oldFormulaString) {
67747
67757
  this.replaceMeasureFormula(pivotId, measure, newFormulaString);
67748
67758
  }
@@ -67904,7 +67914,6 @@ class PivotCorePlugin extends CorePlugin {
67904
67914
  formula: newFormulaString,
67905
67915
  sheetId: measure.computedBy.sheetId,
67906
67916
  });
67907
- this.compileCalculatedMeasures(pivotId, pivot.definition.measures);
67908
67917
  }
67909
67918
  checkSortedColumnInMeasures(definition) {
67910
67919
  const measures = definition.measures.map((measure) => measure.id);
@@ -69550,11 +69559,16 @@ class SpreadingRelation {
69550
69559
  return this.arrayFormulasToResults.get(formulasPosition);
69551
69560
  }
69552
69561
  /**
69553
- * Remove a node, also remove it from other nodes adjacency list
69562
+ * Remove a spreading relation for a given array formula position
69563
+ * and its result zone
69554
69564
  */
69555
69565
  removeNode(position) {
69566
+ const resultZone = this.arrayFormulasToResults.get(position);
69567
+ if (!resultZone) {
69568
+ return;
69569
+ }
69556
69570
  this.resultsToArrayFormulas.remove({
69557
- boundingBox: { sheetId: position.sheetId, zone: positionToZone(position) },
69571
+ boundingBox: { sheetId: position.sheetId, zone: resultZone },
69558
69572
  data: position,
69559
69573
  });
69560
69574
  this.arrayFormulasToResults.delete(position);
@@ -69867,6 +69881,10 @@ class Evaluator {
69867
69881
  // empty matrix
69868
69882
  return createEvaluatedCell({ value: 0 }, this.getters.getLocale(), cellData);
69869
69883
  }
69884
+ if (nbRows === 1 && nbColumns === 1) {
69885
+ // single value matrix
69886
+ return createEvaluatedCell(nullValueToZeroValue(formulaReturn[0][0]), this.getters.getLocale(), cellData);
69887
+ }
69870
69888
  const resultZone = {
69871
69889
  top: formulaPosition.row,
69872
69890
  bottom: formulaPosition.row + nbRows - 1,
@@ -71586,6 +71604,7 @@ class HeaderSizeUIPlugin extends CoreViewPlugin {
71586
71604
  handle(cmd) {
71587
71605
  switch (cmd.type) {
71588
71606
  case "START":
71607
+ case "UPDATE_LOCALE":
71589
71608
  for (const sheetId of this.getters.getSheetIds()) {
71590
71609
  this.initializeSheet(sheetId);
71591
71610
  }
@@ -71707,7 +71726,7 @@ class HeaderSizeUIPlugin extends CoreViewPlugin {
71707
71726
  }
71708
71727
  const cell = this.getters.getCell(position);
71709
71728
  const colSize = this.getters.getColSize(position.sheetId, position.col);
71710
- return getDefaultCellHeight(this.ctx, cell, colSize);
71729
+ return getDefaultCellHeight(this.ctx, cell, this.getters.getLocale(), colSize);
71711
71730
  }
71712
71731
  isInMultiRowMerge(position) {
71713
71732
  const merge = this.getters.getMerge(position);
@@ -74030,7 +74049,7 @@ function addConditionalFormatCommandAdaptRange(cmd, applyChange) {
74030
74049
  cmd.cf.rule = {
74031
74050
  ...rule,
74032
74051
  rangeValues: rule.rangeValues
74033
- ? adaptStringRange(cmd.sheetId, rule.rangeValues, applyChange)
74052
+ ? adaptStringRange(cmd.sheetId, rule.rangeValues, applyChange).range
74034
74053
  : undefined,
74035
74054
  };
74036
74055
  }
@@ -87650,6 +87669,9 @@ function addStyles(styles) {
87650
87669
  if (style.alignment && style.alignment.wrapText) {
87651
87670
  alignAttrs.push(["wrapText", "1"]);
87652
87671
  }
87672
+ if (style.alignment && style.alignment.shrinkToFit) {
87673
+ alignAttrs.push(["shrinkToFit", "1"]);
87674
+ }
87653
87675
  if (alignAttrs.length > 0) {
87654
87676
  attributes.push(["applyAlignment", "1"]); // for Libre Office
87655
87677
  styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}><alignment ${formatAttributes(alignAttrs)} /></xf> `);
@@ -88420,7 +88442,7 @@ class Model extends EventBus {
88420
88442
  this.config = this.setupConfig(config);
88421
88443
  this.session = this.setupSession(workbookData.revisionId);
88422
88444
  this.coreGetters = {};
88423
- this.range = new RangeAdapter(this.coreGetters);
88445
+ this.range = new RangeAdapterPlugin(this.coreGetters);
88424
88446
  this.coreGetters.getRangeString = this.range.getRangeString.bind(this.range);
88425
88447
  this.coreGetters.getRangeFromSheetXC = this.range.getRangeFromSheetXC.bind(this.range);
88426
88448
  this.coreGetters.createAdaptedRanges = this.range.createAdaptedRanges.bind(this.range);
@@ -88434,8 +88456,6 @@ class Model extends EventBus {
88434
88456
  this.coreGetters.extendRange = this.range.extendRange.bind(this.range);
88435
88457
  this.coreGetters.getRangesUnion = this.range.getRangesUnion.bind(this.range);
88436
88458
  this.coreGetters.removeRangesSheetPrefix = this.range.removeRangesSheetPrefix.bind(this.range);
88437
- this.coreGetters.adaptFormulaStringDependencies =
88438
- this.range.adaptFormulaStringDependencies.bind(this.range);
88439
88459
  this.coreGetters.copyFormulaStringForSheet = this.range.copyFormulaStringForSheet.bind(this.range);
88440
88460
  this.getters = {
88441
88461
  isReadonly: () => this.config.mode === "readonly" || this.config.mode === "dashboard",
@@ -89123,6 +89143,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
89123
89143
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, ClientDisconnectedError, CommandResult, CorePlugin, CoreViewPlugin, DispatchResult, EvaluationError, LocalTransportService, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, chartHelpers, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, getCaretDownSvg, getCaretUpSvg, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
89124
89144
 
89125
89145
 
89126
- __info__.version = "19.0.17";
89127
- __info__.date = "2026-01-14T10:01:24.044Z";
89128
- __info__.hash = "2165bad";
89146
+ __info__.version = "19.0.18";
89147
+ __info__.date = "2026-01-21T11:06:57.346Z";
89148
+ __info__.hash = "bd44f59";