@odoo/o-spreadsheet 18.3.31 → 18.3.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,9 +2,9 @@
2
2
  /**
3
3
  * This file is generated by o-spreadsheet build tools. Do not edit it.
4
4
  * @see https://github.com/odoo/o-spreadsheet
5
- * @version 18.3.31
6
- * @date 2025-12-26T10:18:10.765Z
7
- * @hash 1e143e1
5
+ * @version 18.3.33
6
+ * @date 2026-01-21T11:05:17.933Z
7
+ * @hash b7e5d91
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -33,7 +33,8 @@
33
33
  return children
34
34
  .map((child) => (typeof child === "function" ? child(env) : child))
35
35
  .flat()
36
- .map(createAction);
36
+ .map(createAction)
37
+ .sort((a, b) => a.sequence - b.sequence);
37
38
  }
38
39
  : () => [],
39
40
  isReadonlyAllowed: item.isReadonlyAllowed || false,
@@ -308,6 +309,7 @@
308
309
  fillColor: "",
309
310
  textColor: "",
310
311
  };
312
+ const DEFAULT_NUMBER_STYLE = { ...DEFAULT_STYLE, align: "right" };
311
313
  const DEFAULT_VERTICAL_ALIGN = DEFAULT_STYLE.verticalAlign;
312
314
  const DEFAULT_WRAPPING_MODE = DEFAULT_STYLE.wrapping;
313
315
  // Fonts
@@ -6180,67 +6182,6 @@
6180
6182
  return sheetName !== undefined ? `${getCanonicalSymbolName(sheetName)}!${xc}` : xc;
6181
6183
  }
6182
6184
 
6183
- function createDefaultRows(rowNumber) {
6184
- const rows = [];
6185
- for (let i = 0; i < rowNumber; i++) {
6186
- const row = {
6187
- cells: {},
6188
- };
6189
- rows.push(row);
6190
- }
6191
- return rows;
6192
- }
6193
- function moveHeaderIndexesOnHeaderAddition(indexHeaderAdded, numberAdded, headers) {
6194
- return headers.map((header) => {
6195
- if (header >= indexHeaderAdded) {
6196
- return header + numberAdded;
6197
- }
6198
- return header;
6199
- });
6200
- }
6201
- function moveHeaderIndexesOnHeaderDeletion(deletedHeaders, headers) {
6202
- deletedHeaders = [...deletedHeaders].sort((a, b) => b - a);
6203
- return headers
6204
- .map((header) => {
6205
- for (const deletedHeader of deletedHeaders) {
6206
- if (header > deletedHeader) {
6207
- header--;
6208
- }
6209
- else if (header === deletedHeader) {
6210
- return undefined;
6211
- }
6212
- }
6213
- return header;
6214
- })
6215
- .filter(isDefined);
6216
- }
6217
- function getNextSheetName(existingNames, baseName = "Sheet") {
6218
- let i = 1;
6219
- let name = `${baseName}${i}`;
6220
- while (existingNames.includes(name)) {
6221
- name = `${baseName}${i}`;
6222
- i++;
6223
- }
6224
- return name;
6225
- }
6226
- function getDuplicateSheetName(nameToDuplicate, existingNames) {
6227
- let i = 1;
6228
- const baseName = _t("Copy of %s", nameToDuplicate);
6229
- let name = baseName.toString();
6230
- while (existingNames.includes(name)) {
6231
- name = `${baseName} (${i})`;
6232
- i++;
6233
- }
6234
- return name;
6235
- }
6236
- function isSheetNameEqual(name1, name2) {
6237
- if (name1 === undefined || name2 === undefined) {
6238
- return false;
6239
- }
6240
- return (getUnquotedSheetName(name1.trim().toUpperCase()) ===
6241
- getUnquotedSheetName(name2.trim().toUpperCase()));
6242
- }
6243
-
6244
6185
  function createRange(args, getSheetSize) {
6245
6186
  const unboundedZone = args.zone;
6246
6187
  const zone = boundUnboundedZone(unboundedZone, getSheetSize(args.sheetId));
@@ -6535,8 +6476,8 @@
6535
6476
  elements.sort((a, b) => b - a);
6536
6477
  const groups = groupConsecutive(elements);
6537
6478
  return (range) => {
6538
- if (!isSheetNameEqual(range.sheetId, cmd.sheetId)) {
6539
- return { changeType: "NONE" };
6479
+ if (range.sheetId !== cmd.sheetId) {
6480
+ return { changeType: "NONE", range };
6540
6481
  }
6541
6482
  let newRange = range;
6542
6483
  let changeType = "NONE";
@@ -6563,10 +6504,7 @@
6563
6504
  newRange = createAdaptedRange(newRange, dimension, changeType, -(max - min + 1));
6564
6505
  }
6565
6506
  }
6566
- if (changeType !== "NONE") {
6567
- return { changeType, range: newRange };
6568
- }
6569
- return { changeType: "NONE" };
6507
+ return { changeType, range: newRange };
6570
6508
  };
6571
6509
  }
6572
6510
  function getApplyRangeChangeAddColRow(cmd) {
@@ -6575,7 +6513,7 @@
6575
6513
  let dimension = cmd.dimension === "COL" ? "columns" : "rows";
6576
6514
  return (range) => {
6577
6515
  if (range.sheetId !== cmd.sheetId) {
6578
- return { changeType: "NONE" };
6516
+ return { changeType: "NONE", range };
6579
6517
  }
6580
6518
  if (cmd.position === "after") {
6581
6519
  if (range.zone[start] <= cmd.base && cmd.base < range.zone[end]) {
@@ -6605,13 +6543,13 @@
6605
6543
  };
6606
6544
  }
6607
6545
  }
6608
- return { changeType: "NONE" };
6546
+ return { changeType: "NONE", range };
6609
6547
  };
6610
6548
  }
6611
6549
  function getApplyRangeChangeDeleteSheet(cmd) {
6612
6550
  return (range) => {
6613
6551
  if (range.sheetId !== cmd.sheetId && range.invalidSheetName !== cmd.sheetName) {
6614
- return { changeType: "NONE" };
6552
+ return { changeType: "NONE", range };
6615
6553
  }
6616
6554
  const invalidSheetName = cmd.sheetName;
6617
6555
  range = {
@@ -6638,14 +6576,14 @@
6638
6576
  const newRange = { ...range, sheetId, invalidSheetName };
6639
6577
  return { changeType: "CHANGE", range: newRange };
6640
6578
  }
6641
- return { changeType: "NONE" };
6579
+ return { changeType: "NONE", range };
6642
6580
  };
6643
6581
  }
6644
6582
  function getApplyRangeChangeMoveRange(cmd) {
6645
6583
  const originZone = cmd.target[0];
6646
6584
  return (range) => {
6647
6585
  if (range.sheetId !== cmd.sheetId || !isZoneInside(range.zone, originZone)) {
6648
- return { changeType: "NONE" };
6586
+ return { changeType: "NONE", range };
6649
6587
  }
6650
6588
  const targetSheetId = cmd.targetSheetId;
6651
6589
  const offsetX = cmd.col - originZone.left;
@@ -6742,17 +6680,87 @@
6742
6680
  return results.map((r) => r.elem);
6743
6681
  }
6744
6682
 
6683
+ function createDefaultRows(rowNumber) {
6684
+ const rows = [];
6685
+ for (let i = 0; i < rowNumber; i++) {
6686
+ const row = {
6687
+ cells: {},
6688
+ };
6689
+ rows.push(row);
6690
+ }
6691
+ return rows;
6692
+ }
6693
+ function moveHeaderIndexesOnHeaderAddition(indexHeaderAdded, numberAdded, headers) {
6694
+ return headers.map((header) => {
6695
+ if (header >= indexHeaderAdded) {
6696
+ return header + numberAdded;
6697
+ }
6698
+ return header;
6699
+ });
6700
+ }
6701
+ function moveHeaderIndexesOnHeaderDeletion(deletedHeaders, headers) {
6702
+ deletedHeaders = [...deletedHeaders].sort((a, b) => b - a);
6703
+ return headers
6704
+ .map((header) => {
6705
+ for (const deletedHeader of deletedHeaders) {
6706
+ if (header > deletedHeader) {
6707
+ header--;
6708
+ }
6709
+ else if (header === deletedHeader) {
6710
+ return undefined;
6711
+ }
6712
+ }
6713
+ return header;
6714
+ })
6715
+ .filter(isDefined);
6716
+ }
6717
+ function getNextSheetName(existingNames, baseName = "Sheet") {
6718
+ let i = 1;
6719
+ let name = `${baseName}${i}`;
6720
+ while (existingNames.includes(name)) {
6721
+ name = `${baseName}${i}`;
6722
+ i++;
6723
+ }
6724
+ return name;
6725
+ }
6726
+ function getDuplicateSheetName(nameToDuplicate, existingNames) {
6727
+ let i = 1;
6728
+ const baseName = _t("Copy of %s", nameToDuplicate);
6729
+ let name = baseName.toString();
6730
+ while (existingNames.includes(name)) {
6731
+ name = `${baseName} (${i})`;
6732
+ i++;
6733
+ }
6734
+ return name;
6735
+ }
6736
+ function isSheetNameEqual(name1, name2) {
6737
+ if (name1 === undefined || name2 === undefined) {
6738
+ return false;
6739
+ }
6740
+ return (getUnquotedSheetName(name1.trim().toUpperCase()) ===
6741
+ getUnquotedSheetName(name2.trim().toUpperCase()));
6742
+ }
6743
+
6745
6744
  function computeTextLinesHeight(textLineHeight, numberOfLines = 1) {
6746
6745
  return numberOfLines * (textLineHeight + MIN_CELL_TEXT_MARGIN) - MIN_CELL_TEXT_MARGIN;
6747
6746
  }
6748
6747
  /**
6749
6748
  * Get the default height of the cell given its style.
6750
6749
  */
6751
- function getDefaultCellHeight(ctx, cell, colSize) {
6750
+ function getDefaultCellHeight(ctx, cell, locale, colSize) {
6752
6751
  if (!cell || (!cell.isFormula && !cell.content)) {
6753
6752
  return DEFAULT_CELL_HEIGHT;
6754
6753
  }
6755
- const content = cell.isFormula ? "" : cell.content;
6754
+ let content = "";
6755
+ try {
6756
+ if (!cell.isFormula) {
6757
+ const localeFormat = { format: cell.format, locale };
6758
+ content = formatValue(parseLiteral(cell.content, locale), localeFormat);
6759
+ }
6760
+ }
6761
+ catch {
6762
+ content = CellErrorType.GenericError;
6763
+ }
6756
6764
  return getCellContentHeight(ctx, content, cell.style, colSize);
6757
6765
  }
6758
6766
  function getCellContentHeight(ctx, content, style, colSize) {
@@ -18414,9 +18422,10 @@ stores.inject(MyMetaStore, storeInstance);
18414
18422
  throw new EvaluationError(_t("Function PIVOT takes an even number of arguments."));
18415
18423
  }
18416
18424
  }
18417
- function addPivotDependencies(evalContext, coreDefinition, forMeasures) {
18425
+ function addPivotDependencies(evalContext, pivotId, forMeasures) {
18418
18426
  //TODO This function can be very costly when used with PIVOT.VALUE and PIVOT.HEADER
18419
18427
  const dependencies = [];
18428
+ const coreDefinition = evalContext.getters.getPivotCoreDefinition(pivotId);
18420
18429
  if (coreDefinition.type === "SPREADSHEET" && coreDefinition.dataSet) {
18421
18430
  const { sheetId, zone } = coreDefinition.dataSet;
18422
18431
  const xc = zoneToXc(zone);
@@ -18433,8 +18442,7 @@ stores.inject(MyMetaStore, storeInstance);
18433
18442
  }
18434
18443
  for (const measure of forMeasures) {
18435
18444
  if (measure.computedBy) {
18436
- const formula = evalContext.getters.getMeasureCompiledFormula(measure);
18437
- dependencies.push(...formula.dependencies.filter((range) => !range.invalidXc));
18445
+ dependencies.push(...evalContext.getters.getMeasureFullDependencies(pivotId, measure));
18438
18446
  }
18439
18447
  }
18440
18448
  const originPosition = evalContext.__originCellPosition;
@@ -18869,7 +18877,7 @@ stores.inject(MyMetaStore, storeInstance);
18869
18877
  assertDomainLength(domainArgs);
18870
18878
  const pivot = this.getters.getPivot(pivotId);
18871
18879
  const coreDefinition = this.getters.getPivotCoreDefinition(pivotId);
18872
- addPivotDependencies(this, coreDefinition, coreDefinition.measures.filter((m) => m.id === _measure));
18880
+ addPivotDependencies(this, pivotId, coreDefinition.measures.filter((m) => m.id === _measure));
18873
18881
  pivot.init({ reload: pivot.needsReevaluation });
18874
18882
  const error = pivot.assertIsValid({ throwOnError: false });
18875
18883
  if (error) {
@@ -18902,8 +18910,7 @@ stores.inject(MyMetaStore, storeInstance);
18902
18910
  const _pivotId = getPivotId(_pivotFormulaId, this.getters);
18903
18911
  assertDomainLength(domainArgs);
18904
18912
  const pivot = this.getters.getPivot(_pivotId);
18905
- const coreDefinition = this.getters.getPivotCoreDefinition(_pivotId);
18906
- addPivotDependencies(this, coreDefinition, []);
18913
+ addPivotDependencies(this, _pivotId, []);
18907
18914
  pivot.init({ reload: pivot.needsReevaluation });
18908
18915
  const error = pivot.assertIsValid({ throwOnError: false });
18909
18916
  if (error) {
@@ -18957,7 +18964,7 @@ stores.inject(MyMetaStore, storeInstance);
18957
18964
  const pivotId = getPivotId(_pivotFormulaId, this.getters);
18958
18965
  const pivot = this.getters.getPivot(pivotId);
18959
18966
  const coreDefinition = this.getters.getPivotCoreDefinition(pivotId);
18960
- addPivotDependencies(this, coreDefinition, coreDefinition.measures);
18967
+ addPivotDependencies(this, pivotId, coreDefinition.measures);
18961
18968
  pivot.init({ reload: pivot.needsReevaluation });
18962
18969
  const error = pivot.assertIsValid({ throwOnError: false });
18963
18970
  if (error) {
@@ -20186,7 +20193,16 @@ stores.inject(MyMetaStore, storeInstance);
20186
20193
  }
20187
20194
  acceptToVectorize.push(!argDefinition.acceptMatrix);
20188
20195
  }
20189
- return applyVectorization(errorHandlingCompute.bind(this), args, acceptToVectorize);
20196
+ return replaceErrorPlaceholderInResult(applyVectorization(errorHandlingCompute.bind(this), args, acceptToVectorize));
20197
+ }
20198
+ function replaceErrorPlaceholderInResult(result) {
20199
+ if (!isMatrix(result)) {
20200
+ replaceFunctionNamePlaceholder(result, descr.name);
20201
+ }
20202
+ else {
20203
+ matrixForEach(result, (result) => replaceFunctionNamePlaceholder(result, descr.name));
20204
+ }
20205
+ return result;
20190
20206
  }
20191
20207
  function errorHandlingCompute(...args) {
20192
20208
  for (let i = 0; i < args.length; i++) {
@@ -20214,13 +20230,12 @@ stores.inject(MyMetaStore, storeInstance);
20214
20230
  const result = descr.compute.apply(this, args);
20215
20231
  if (!isMatrix(result)) {
20216
20232
  if (typeof result === "object" && result !== null && "value" in result) {
20217
- replaceFunctionNamePlaceholder(result, descr.name);
20218
20233
  return result;
20219
20234
  }
20235
+ descr.name;
20220
20236
  return { value: result };
20221
20237
  }
20222
20238
  if (typeof result[0][0] === "object" && result[0][0] !== null && "value" in result[0][0]) {
20223
- matrixForEach(result, (result) => replaceFunctionNamePlaceholder(result, descr.name));
20224
20239
  return result;
20225
20240
  }
20226
20241
  return matrixMap(result, (row) => ({ value: row }));
@@ -20672,7 +20687,7 @@ stores.inject(MyMetaStore, storeInstance);
20672
20687
  continue;
20673
20688
  }
20674
20689
  const sheetXC = tokens[tokenIdx].value;
20675
- const newSheetXC = adaptStringRange(defaultSheetId, sheetXC, applyChange);
20690
+ const newSheetXC = adaptStringRange(defaultSheetId, sheetXC, applyChange).range;
20676
20691
  if (sheetXC !== newSheetXC) {
20677
20692
  tokens[tokenIdx] = {
20678
20693
  value: newSheetXC,
@@ -20682,23 +20697,30 @@ stores.inject(MyMetaStore, storeInstance);
20682
20697
  }
20683
20698
  return concat(tokens.map((token) => token.value));
20684
20699
  }
20685
- function adaptStringRange(defaultSheetId, sheetXC, applyChange) {
20700
+ function adaptStringRange(defaultSheetId, sheetXC, rangeAdapter) {
20686
20701
  const sheetName = splitReference(sheetXC).sheetName;
20687
20702
  if (sheetName
20688
- ? !isSheetNameEqual(sheetName, applyChange.sheetName.old)
20689
- : defaultSheetId !== applyChange.sheetId) {
20690
- return sheetXC;
20703
+ ? !isSheetNameEqual(sheetName, rangeAdapter.sheetName.old)
20704
+ : defaultSheetId !== rangeAdapter.sheetId) {
20705
+ return { changeType: "NONE", range: sheetXC };
20691
20706
  }
20692
- const sheetId = sheetName ? applyChange.sheetId : defaultSheetId;
20707
+ const sheetId = sheetName ? rangeAdapter.sheetId : defaultSheetId;
20693
20708
  const range = getRange(sheetXC, sheetId);
20694
20709
  if (range.invalidXc) {
20695
- return sheetXC;
20710
+ return { changeType: "NONE", range: sheetXC };
20696
20711
  }
20697
- const change = applyChange.applyChange(range);
20712
+ const change = rangeAdapter.applyChange(range);
20698
20713
  if (change.changeType === "NONE" || change.changeType === "REMOVE") {
20699
- return sheetXC;
20714
+ return { changeType: change.changeType, range: sheetXC };
20700
20715
  }
20701
- return getRangeString(change.range, defaultSheetId, getSheetNameGetter(applyChange));
20716
+ const rangeStr = getRangeString(change.range, defaultSheetId, getSheetNameGetter(rangeAdapter));
20717
+ if (rangeStr === CellErrorType.InvalidReference) {
20718
+ return { changeType: "REMOVE", range: rangeStr };
20719
+ }
20720
+ return {
20721
+ changeType: change.changeType,
20722
+ range: rangeStr,
20723
+ };
20702
20724
  }
20703
20725
  function getSheetNameGetter(applyChange) {
20704
20726
  return (sheetId) => {
@@ -20797,8 +20819,6 @@ stores.inject(MyMetaStore, storeInstance);
20797
20819
  }
20798
20820
  const change = applyChange(range);
20799
20821
  switch (change.changeType) {
20800
- case "NONE":
20801
- return range;
20802
20822
  case "REMOVE":
20803
20823
  return undefined;
20804
20824
  default:
@@ -20936,16 +20956,16 @@ stores.inject(MyMetaStore, storeInstance);
20936
20956
  function transformChartDefinitionWithDataSetsWithZone(chartSheetId, definition, applyChange) {
20937
20957
  let labelRange;
20938
20958
  if (definition.labelRange) {
20939
- const adaptedRange = adaptStringRange(chartSheetId, definition.labelRange, applyChange);
20940
- if (adaptedRange !== CellErrorType.InvalidReference) {
20959
+ const { changeType, range: adaptedRange } = adaptStringRange(chartSheetId, definition.labelRange, applyChange);
20960
+ if (changeType !== "REMOVE") {
20941
20961
  labelRange = adaptedRange;
20942
20962
  }
20943
20963
  }
20944
20964
  const dataSets = [];
20945
20965
  for (const dataSet of definition.dataSets) {
20946
20966
  const newDataSet = { ...dataSet };
20947
- const adaptedRange = adaptStringRange(chartSheetId, dataSet.dataRange, applyChange);
20948
- if (adaptedRange !== CellErrorType.InvalidReference) {
20967
+ const { changeType, range: adaptedRange } = adaptStringRange(chartSheetId, dataSet.dataRange, applyChange);
20968
+ if (changeType !== "REMOVE") {
20949
20969
  newDataSet.dataRange = adaptedRange;
20950
20970
  dataSets.push(newDataSet);
20951
20971
  }
@@ -22271,14 +22291,14 @@ stores.inject(MyMetaStore, storeInstance);
22271
22291
  let baseline;
22272
22292
  let keyValue;
22273
22293
  if (definition.baseline) {
22274
- const adaptedRange = adaptStringRange(chartSheetId, definition.baseline, applyChange);
22275
- if (adaptedRange !== CellErrorType.InvalidReference) {
22294
+ const { changeType, range: adaptedRange } = adaptStringRange(chartSheetId, definition.baseline, applyChange);
22295
+ if (changeType !== "REMOVE") {
22276
22296
  baseline = adaptedRange;
22277
22297
  }
22278
22298
  }
22279
22299
  if (definition.keyValue) {
22280
- const adaptedRange = adaptStringRange(chartSheetId, definition.keyValue, applyChange);
22281
- if (adaptedRange !== CellErrorType.InvalidReference) {
22300
+ const { changeType, range: adaptedRange } = adaptStringRange(chartSheetId, definition.keyValue, applyChange);
22301
+ if (changeType !== "REMOVE") {
22282
22302
  keyValue = adaptedRange;
22283
22303
  }
22284
22304
  }
@@ -22334,7 +22354,7 @@ stores.inject(MyMetaStore, storeInstance);
22334
22354
  // This kind of graph is not exportable in Excel
22335
22355
  return undefined;
22336
22356
  }
22337
- updateRanges(applyChange) {
22357
+ updateRanges({ applyChange }) {
22338
22358
  const baseline = adaptChartRange(this.baseline, applyChange);
22339
22359
  const keyValue = adaptChartRange(this.keyValue, applyChange);
22340
22360
  if (this.baseline === baseline && this.keyValue === keyValue) {
@@ -23229,7 +23249,7 @@ stores.inject(MyMetaStore, storeInstance);
23229
23249
  }
23230
23250
  captureSelection(zone, col, row) {
23231
23251
  this.model.selection.capture(this, {
23232
- cell: { col: col ?? zone.left, row: row ?? zone.right },
23252
+ cell: { col: col ?? zone.left, row: row ?? zone.top },
23233
23253
  zone,
23234
23254
  }, {
23235
23255
  handleEvent: this.handleEvent.bind(this),
@@ -27206,7 +27226,7 @@ stores.inject(MyMetaStore, storeInstance);
27206
27226
  verticalAxis: getDefinedAxis(definition),
27207
27227
  };
27208
27228
  }
27209
- updateRanges(applyChange) {
27229
+ updateRanges({ applyChange }) {
27210
27230
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
27211
27231
  if (!isStale) {
27212
27232
  return this;
@@ -27327,7 +27347,7 @@ stores.inject(MyMetaStore, storeInstance);
27327
27347
  verticalAxis: getDefinedAxis(definition),
27328
27348
  };
27329
27349
  }
27330
- updateRanges(applyChange) {
27350
+ updateRanges({ applyChange }) {
27331
27351
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
27332
27352
  if (!isStale) {
27333
27353
  return this;
@@ -27498,7 +27518,7 @@ stores.inject(MyMetaStore, storeInstance);
27498
27518
  getDefinitionForExcel() {
27499
27519
  return undefined;
27500
27520
  }
27501
- updateRanges(applyChange) {
27521
+ updateRanges({ applyChange }) {
27502
27522
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
27503
27523
  if (!isStale) {
27504
27524
  return this;
@@ -27609,8 +27629,8 @@ stores.inject(MyMetaStore, storeInstance);
27609
27629
  static transformDefinition(chartSheetId, definition, applyChange) {
27610
27630
  let dataRange;
27611
27631
  if (definition.dataRange) {
27612
- const adaptedRange = adaptStringRange(chartSheetId, definition.dataRange, applyChange);
27613
- if (adaptedRange !== CellErrorType.InvalidReference) {
27632
+ const { changeType, range: adaptedRange } = adaptStringRange(chartSheetId, definition.dataRange, applyChange);
27633
+ if (changeType !== "REMOVE") {
27614
27634
  dataRange = adaptedRange;
27615
27635
  }
27616
27636
  }
@@ -27685,13 +27705,9 @@ stores.inject(MyMetaStore, storeInstance);
27685
27705
  : undefined,
27686
27706
  };
27687
27707
  }
27688
- updateRanges(applyChange, sheetId, adaptSheetName) {
27708
+ updateRanges({ applyChange, adaptFormulaString }) {
27689
27709
  const dataRange = adaptChartRange(this.dataRange, applyChange);
27690
- const adaptFormula = (formula) => adaptFormulaStringRanges(this.sheetId, formula, {
27691
- applyChange,
27692
- sheetId,
27693
- sheetName: adaptSheetName,
27694
- });
27710
+ const adaptFormula = (formula) => adaptFormulaString(this.sheetId, formula);
27695
27711
  const sectionRule = adaptSectionRuleFormulas(this.sectionRule, adaptFormula);
27696
27712
  const definition = this.getDefinitionWithSpecificRanges(dataRange, sectionRule);
27697
27713
  return new GaugeChart(definition, this.sheetId, this.getters);
@@ -27911,7 +27927,7 @@ stores.inject(MyMetaStore, storeInstance);
27911
27927
  getDefinitionForExcel() {
27912
27928
  return undefined;
27913
27929
  }
27914
- updateRanges(applyChange) {
27930
+ updateRanges({ applyChange }) {
27915
27931
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
27916
27932
  if (!isStale) {
27917
27933
  return this;
@@ -28043,7 +28059,7 @@ stores.inject(MyMetaStore, storeInstance);
28043
28059
  : undefined,
28044
28060
  };
28045
28061
  }
28046
- updateRanges(applyChange) {
28062
+ updateRanges({ applyChange }) {
28047
28063
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
28048
28064
  if (!isStale) {
28049
28065
  return this;
@@ -28200,7 +28216,7 @@ stores.inject(MyMetaStore, storeInstance);
28200
28216
  labelRange,
28201
28217
  };
28202
28218
  }
28203
- updateRanges(applyChange) {
28219
+ updateRanges({ applyChange }) {
28204
28220
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
28205
28221
  if (!isStale) {
28206
28222
  return this;
@@ -28336,7 +28352,7 @@ stores.inject(MyMetaStore, storeInstance);
28336
28352
  getDefinitionForExcel() {
28337
28353
  return undefined;
28338
28354
  }
28339
- updateRanges(applyChange) {
28355
+ updateRanges({ applyChange }) {
28340
28356
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
28341
28357
  if (!isStale) {
28342
28358
  return this;
@@ -28483,7 +28499,7 @@ stores.inject(MyMetaStore, storeInstance);
28483
28499
  labelRange,
28484
28500
  };
28485
28501
  }
28486
- updateRanges(applyChange) {
28502
+ updateRanges({ applyChange }) {
28487
28503
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
28488
28504
  if (!isStale) {
28489
28505
  return this;
@@ -28605,7 +28621,7 @@ stores.inject(MyMetaStore, storeInstance);
28605
28621
  : undefined,
28606
28622
  };
28607
28623
  }
28608
- updateRanges(applyChange) {
28624
+ updateRanges({ applyChange }) {
28609
28625
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
28610
28626
  if (!isStale) {
28611
28627
  return this;
@@ -28767,7 +28783,7 @@ stores.inject(MyMetaStore, storeInstance);
28767
28783
  getDefinitionForExcel() {
28768
28784
  return undefined;
28769
28785
  }
28770
- updateRanges(applyChange) {
28786
+ updateRanges({ applyChange }) {
28771
28787
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
28772
28788
  if (!isStale) {
28773
28789
  return this;
@@ -28915,7 +28931,7 @@ stores.inject(MyMetaStore, storeInstance);
28915
28931
  getDefinitionForExcel() {
28916
28932
  return undefined;
28917
28933
  }
28918
- updateRanges(applyChange) {
28934
+ updateRanges({ applyChange }) {
28919
28935
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
28920
28936
  if (!isStale) {
28921
28937
  return this;
@@ -29070,7 +29086,7 @@ stores.inject(MyMetaStore, storeInstance);
29070
29086
  // TODO: implement export excel
29071
29087
  return undefined;
29072
29088
  }
29073
- updateRanges(applyChange) {
29089
+ updateRanges({ applyChange }) {
29074
29090
  const { dataSets, labelRange, isStale } = updateChartRangesWithDataSets(this.getters, applyChange, this.dataSets, this.labelRange);
29075
29091
  if (!isStale) {
29076
29092
  return this;
@@ -31938,6 +31954,7 @@ stores.inject(MyMetaStore, storeInstance);
31938
31954
  ? V_ALIGNMENT_EXPORT_CONVERSION_MAP[style.verticalAlign]
31939
31955
  : undefined,
31940
31956
  wrapText: style.wrapping === "wrap" || content?.includes(NEWLINE) ? true : undefined,
31957
+ shrinkToFit: style.wrapping === "clip" ? true : undefined,
31941
31958
  },
31942
31959
  };
31943
31960
  styles.font["strike"] = !!style?.strikethrough || undefined;
@@ -31958,6 +31975,7 @@ stores.inject(MyMetaStore, storeInstance);
31958
31975
  vertical: styles.alignment.vertical,
31959
31976
  horizontal: styles.alignment.horizontal,
31960
31977
  wrapText: styles.alignment.wrapText,
31978
+ shrinkToFit: styles.alignment.shrinkToFit,
31961
31979
  },
31962
31980
  };
31963
31981
  return pushElement(style, construct.styles);
@@ -42962,7 +42980,7 @@ stores.inject(MyMetaStore, storeInstance);
42962
42980
  });
42963
42981
  dataRange = this.props.definition.dataRange;
42964
42982
  get configurationErrorMessages() {
42965
- const cancelledReasons = [...(this.state.dataRangeDispatchResult?.reasons || [])];
42983
+ const cancelledReasons = [...(this.state.dataRangeDispatchResult?.reasons || [])].filter((reason) => reason !== "NoChanges" /* CommandResult.NoChanges */);
42966
42984
  return cancelledReasons.map((error) => ChartTerms.Errors[error] || ChartTerms.Errors.Unexpected);
42967
42985
  }
42968
42986
  get isDataRangeInvalid() {
@@ -44386,7 +44404,7 @@ stores.inject(MyMetaStore, storeInstance);
44386
44404
  });
44387
44405
  }
44388
44406
  get designErrorMessages() {
44389
- const cancelledReasons = [...(this.state.sectionRuleCancelledReasons || [])];
44407
+ const cancelledReasons = [...(this.state.sectionRuleCancelledReasons || [])].filter((reason) => reason !== "NoChanges" /* CommandResult.NoChanges */);
44390
44408
  return cancelledReasons.map((error) => ChartTerms.Errors[error] || ChartTerms.Errors.Unexpected);
44391
44409
  }
44392
44410
  get isRangeMinInvalid() {
@@ -44722,7 +44740,7 @@ stores.inject(MyMetaStore, storeInstance);
44722
44740
  const cancelledReasons = [
44723
44741
  ...(this.state.keyValueDispatchResult?.reasons || []),
44724
44742
  ...(this.state.baselineDispatchResult?.reasons || []),
44725
- ];
44743
+ ].filter((reason) => reason !== "NoChanges" /* CommandResult.NoChanges */);
44726
44744
  return cancelledReasons.map((error) => ChartTerms.Errors[error] || ChartTerms.Errors.Unexpected);
44727
44745
  }
44728
44746
  get isKeyValueInvalid() {
@@ -47617,6 +47635,12 @@ stores.inject(MyMetaStore, storeInstance);
47617
47635
  case "ACTIVATE_SHEET":
47618
47636
  this.isSearchDirty = true;
47619
47637
  this.shouldFinalizeUpdateSelection = true;
47638
+ if (this.searchOptions.specificRange) {
47639
+ this.searchOptions.specificRange = {
47640
+ ...this.searchOptions.specificRange,
47641
+ sheetId: this.getters.getActiveSheetId(),
47642
+ };
47643
+ }
47620
47644
  break;
47621
47645
  case "REPLACE_SEARCH":
47622
47646
  for (const match of cmd.matches) {
@@ -48038,9 +48062,20 @@ stores.inject(MyMetaStore, storeInstance);
48038
48062
  const specificRange = this.env.model.getters.getRangeFromSheetXC(this.env.model.getters.getActiveSheetId(), this.state.dataRange);
48039
48063
  this.store.updateSearchOptions({ specificRange });
48040
48064
  }
48065
+ get specificRange() {
48066
+ const range = this.store.searchOptions.specificRange;
48067
+ return range ? this.env.model.getters.getRangeString(range, "forceSheetReference") : "";
48068
+ }
48041
48069
  get pendingSearch() {
48042
48070
  return this.updateSearchContent.isDebouncePending();
48043
48071
  }
48072
+ get selectionInputKey() {
48073
+ // Selections input are made to work with objects linked to a sheet id. They store the active sheet id at their creation,
48074
+ // and have specific behaviour linked to it (eg. go back to the initial sheet after confirmation).
48075
+ // We don't want all those behaviors here, so we force the recreation of the component when the active sheet changes.
48076
+ // The only drawback is that the input loses focus when changing sheet.
48077
+ return this.env.model.getters.getActiveSheetId();
48078
+ }
48044
48079
  }
48045
48080
 
48046
48081
  css /* scss */ `
@@ -50310,8 +50345,6 @@ stores.inject(MyMetaStore, storeInstance);
50310
50345
  }
50311
50346
  const change = applyChange(range);
50312
50347
  switch (change.changeType) {
50313
- case "NONE":
50314
- return range;
50315
50348
  case "REMOVE":
50316
50349
  return undefined;
50317
50350
  default:
@@ -57374,7 +57407,7 @@ stores.inject(MyMetaStore, storeInstance);
57374
57407
  * @param sheetId an sheetId to adapt either range of that sheet specifically, or ranges pointing to that sheet
57375
57408
  * @param sheetName couple of old and new sheet names to adapt ranges pointing to that sheet
57376
57409
  */
57377
- adaptRanges(applyChange, sheetId, sheetName) { }
57410
+ adaptRanges(rangeAdapterFunctions, sheetId, sheetName) { }
57378
57411
  /**
57379
57412
  * Implement this method to clean unused external resources, such as images
57380
57413
  * stored on a server which have been deleted.
@@ -57970,7 +58003,7 @@ stores.inject(MyMetaStore, storeInstance);
57970
58003
  ];
57971
58004
  nextId = 1;
57972
58005
  cells = {};
57973
- adaptRanges(applyChange, sheetId, sheetName) {
58006
+ adaptRanges({ applyChange }, sheetId, sheetName) {
57974
58007
  for (const sheet of Object.keys(this.cells)) {
57975
58008
  for (const cell of Object.values(this.cells[sheet] || {})) {
57976
58009
  if (cell.isFormula) {
@@ -58192,7 +58225,7 @@ stores.inject(MyMetaStore, storeInstance);
58192
58225
  for (const position of positions) {
58193
58226
  const cell = this.getters.getCell(position);
58194
58227
  const xc = toXC(position.col, position.row);
58195
- const style = this.removeDefaultStyleValues(cell.style);
58228
+ const style = this.extractCustomStyle(cell);
58196
58229
  if (Object.keys(style).length) {
58197
58230
  const styleId = getItemId(style, styles);
58198
58231
  positionsByStyle[styleId] ??= [];
@@ -58238,10 +58271,14 @@ stores.inject(MyMetaStore, storeInstance);
58238
58271
  }
58239
58272
  }
58240
58273
  }
58241
- removeDefaultStyleValues(style) {
58242
- const cleanedStyle = { ...style };
58243
- for (const property in DEFAULT_STYLE) {
58244
- if (cleanedStyle[property] === DEFAULT_STYLE[property]) {
58274
+ extractCustomStyle(cell) {
58275
+ const cleanedStyle = { ...cell.style };
58276
+ const defaultStyle = isNumber(cell.content, DEFAULT_LOCALE)
58277
+ ? DEFAULT_NUMBER_STYLE
58278
+ : DEFAULT_STYLE;
58279
+ for (const property in cleanedStyle) {
58280
+ if ((property !== "align" || !cell.isFormula) &&
58281
+ cleanedStyle[property] === defaultStyle[property]) {
58245
58282
  delete cleanedStyle[property];
58246
58283
  }
58247
58284
  }
@@ -58591,9 +58628,9 @@ stores.inject(MyMetaStore, storeInstance);
58591
58628
  charts = {};
58592
58629
  createChart = chartFactory(this.getters);
58593
58630
  validateChartDefinition = (cmd) => validateChartDefinition(this, cmd.definition);
58594
- adaptRanges(applyChange, sheetId, adaptSheetName) {
58631
+ adaptRanges(rangeAdapters) {
58595
58632
  for (const [chartId, chart] of Object.entries(this.charts)) {
58596
- this.history.update("charts", chartId, chart?.updateRanges(applyChange, sheetId, adaptSheetName));
58633
+ this.history.update("charts", chartId, chart?.updateRanges(rangeAdapters));
58597
58634
  }
58598
58635
  }
58599
58636
  // ---------------------------------------------------------------------------
@@ -58783,7 +58820,7 @@ stores.inject(MyMetaStore, storeInstance);
58783
58820
  "getAdaptedCfRanges",
58784
58821
  ];
58785
58822
  cfRules = {};
58786
- adaptCFFormulas(applyChange) {
58823
+ adaptCFFormulas({ applyChange, adaptFormulaString }) {
58787
58824
  for (const sheetId in this.cfRules) {
58788
58825
  for (const rule of this.cfRules[sheetId]) {
58789
58826
  if (rule.rule.type === "DataBarRule" && rule.rule.rangeValues) {
@@ -58807,7 +58844,7 @@ stores.inject(MyMetaStore, storeInstance);
58807
58844
  for (let i = 0; i < rule.rule.values.length; i++) {
58808
58845
  this.history.update("cfRules", sheetId, this.cfRules[sheetId].indexOf(rule), "rule",
58809
58846
  //@ts-expect-error
58810
- "values", i, this.getters.adaptFormulaStringDependencies(sheetId, rule.rule.values[i], applyChange));
58847
+ "values", i, adaptFormulaString(sheetId, rule.rule.values[i]));
58811
58848
  }
58812
58849
  }
58813
58850
  else if (rule.rule.type === "IconSetRule") {
@@ -58815,7 +58852,7 @@ stores.inject(MyMetaStore, storeInstance);
58815
58852
  if (rule.rule[inflectionPoint].type === "formula") {
58816
58853
  this.history.update("cfRules", sheetId, this.cfRules[sheetId].indexOf(rule), "rule",
58817
58854
  //@ts-expect-error
58818
- inflectionPoint, "value", this.getters.adaptFormulaStringDependencies(sheetId, rule.rule[inflectionPoint].value, applyChange));
58855
+ inflectionPoint, "value", adaptFormulaString(sheetId, rule.rule[inflectionPoint].value));
58819
58856
  }
58820
58857
  }
58821
58858
  }
@@ -58825,14 +58862,14 @@ stores.inject(MyMetaStore, storeInstance);
58825
58862
  if (ruleValue?.type === "formula" && ruleValue?.value) {
58826
58863
  this.history.update("cfRules", sheetId, this.cfRules[sheetId].indexOf(rule), "rule",
58827
58864
  //@ts-expect-error
58828
- value, "value", this.getters.adaptFormulaStringDependencies(sheetId, ruleValue.value, applyChange));
58865
+ value, "value", adaptFormulaString(sheetId, ruleValue.value));
58829
58866
  }
58830
58867
  }
58831
58868
  }
58832
58869
  }
58833
58870
  }
58834
58871
  }
58835
- adaptCFRanges(sheetId, applyChange) {
58872
+ adaptCFRanges(sheetId, { applyChange }) {
58836
58873
  for (const rule of this.cfRules[sheetId]) {
58837
58874
  for (const range of rule.ranges) {
58838
58875
  const change = applyChange(range);
@@ -58856,12 +58893,12 @@ stores.inject(MyMetaStore, storeInstance);
58856
58893
  }
58857
58894
  }
58858
58895
  }
58859
- adaptRanges(applyChange, sheetId) {
58896
+ adaptRanges(rangeAdapters, sheetId) {
58860
58897
  const sheetIds = sheetId ? [sheetId] : Object.keys(this.cfRules);
58861
58898
  for (const sheetId of sheetIds) {
58862
- this.adaptCFRanges(sheetId, applyChange);
58899
+ this.adaptCFRanges(sheetId, rangeAdapters);
58863
58900
  }
58864
- this.adaptCFFormulas(applyChange);
58901
+ this.adaptCFFormulas(rangeAdapters);
58865
58902
  }
58866
58903
  // ---------------------------------------------------------------------------
58867
58904
  // Command Handling
@@ -59252,23 +59289,23 @@ stores.inject(MyMetaStore, storeInstance);
59252
59289
  "getValidationRuleForCell",
59253
59290
  ];
59254
59291
  rules = {};
59255
- adaptRanges(applyChange, sheetId) {
59256
- this.adaptDVRanges(sheetId, applyChange);
59257
- this.adaptDVFormulas(applyChange);
59292
+ adaptRanges(rangeAdapters, sheetId) {
59293
+ this.adaptDVRanges(sheetId, rangeAdapters);
59294
+ this.adaptDVFormulas(rangeAdapters);
59258
59295
  }
59259
- adaptDVFormulas(applyChange) {
59296
+ adaptDVFormulas({ adaptFormulaString }) {
59260
59297
  for (const sheetId in this.rules) {
59261
59298
  const rules = this.rules[sheetId];
59262
59299
  for (let ruleIndex = rules.length - 1; ruleIndex >= 0; ruleIndex--) {
59263
59300
  const rule = this.rules[sheetId][ruleIndex];
59264
59301
  for (let valueIndex = 0; valueIndex < rule.criterion.values.length; valueIndex++) {
59265
- const value = this.getters.adaptFormulaStringDependencies(sheetId, rule.criterion.values[valueIndex], applyChange);
59302
+ const value = adaptFormulaString(sheetId, rule.criterion.values[valueIndex]);
59266
59303
  this.history.update("rules", sheetId, ruleIndex, "criterion", "values", valueIndex, value);
59267
59304
  }
59268
59305
  }
59269
59306
  }
59270
59307
  }
59271
- adaptDVRanges(sheetId, applyChange) {
59308
+ adaptDVRanges(sheetId, { applyChange }) {
59272
59309
  const rules = this.rules[sheetId];
59273
59310
  for (let ruleIndex = rules.length - 1; ruleIndex >= 0; ruleIndex--) {
59274
59311
  const rule = this.rules[sheetId][ruleIndex];
@@ -59542,7 +59579,7 @@ stores.inject(MyMetaStore, storeInstance);
59542
59579
  // ---------------------------------------------------------------------------
59543
59580
  // Command Handling
59544
59581
  // ---------------------------------------------------------------------------
59545
- adaptRanges(applyChange, sheetId) {
59582
+ adaptRanges({ applyChange }, sheetId) {
59546
59583
  for (const figure of this.getFigures(sheetId)) {
59547
59584
  const change = applyChange(this.getters.getRangeFromZone(sheetId, {
59548
59585
  left: figure.col,
@@ -60349,8 +60386,8 @@ stores.inject(MyMetaStore, storeInstance);
60349
60386
  break;
60350
60387
  }
60351
60388
  }
60352
- adaptRanges(applyChange, sheetId) {
60353
- this.applyRangeChangeOnSheet(sheetId, applyChange);
60389
+ adaptRanges(rangeAdapters, sheetId) {
60390
+ this.applyRangeChangeOnSheet(sheetId, rangeAdapters);
60354
60391
  }
60355
60392
  // ---------------------------------------------------------------------------
60356
60393
  // Getters
@@ -60655,7 +60692,7 @@ stores.inject(MyMetaStore, storeInstance);
60655
60692
  /**
60656
60693
  * Apply a range change on merges of a particular sheet.
60657
60694
  */
60658
- applyRangeChangeOnSheet(sheetId, applyChange) {
60695
+ applyRangeChangeOnSheet(sheetId, { applyChange }) {
60659
60696
  const merges = Object.entries(this.merges[sheetId] || {});
60660
60697
  for (const [mergeId, range] of merges) {
60661
60698
  if (range) {
@@ -60729,7 +60766,7 @@ stores.inject(MyMetaStore, storeInstance);
60729
60766
  };
60730
60767
  }
60731
60768
 
60732
- class RangeAdapter {
60769
+ class RangeAdapterPlugin {
60733
60770
  getters;
60734
60771
  providers = [];
60735
60772
  isAdaptingRanges = false;
@@ -60737,7 +60774,6 @@ stores.inject(MyMetaStore, storeInstance);
60737
60774
  this.getters = getters;
60738
60775
  }
60739
60776
  static getters = [
60740
- "adaptFormulaStringDependencies",
60741
60777
  "copyFormulaStringForSheet",
60742
60778
  "extendRange",
60743
60779
  "getRangeString",
@@ -60768,8 +60804,8 @@ stores.inject(MyMetaStore, storeInstance);
60768
60804
  throw new Error("Plugins cannot dispatch commands during adaptRanges phase");
60769
60805
  }
60770
60806
  const rangeAdapter = getRangeAdapter(cmd);
60771
- if (rangeAdapter?.applyChange) {
60772
- this.executeOnAllRanges(rangeAdapter.applyChange, rangeAdapter.sheetId, rangeAdapter.sheetName);
60807
+ if (rangeAdapter) {
60808
+ this.executeOnAllRanges(rangeAdapter);
60773
60809
  }
60774
60810
  }
60775
60811
  finalize() { }
@@ -60788,11 +60824,15 @@ stores.inject(MyMetaStore, storeInstance);
60788
60824
  return result;
60789
60825
  };
60790
60826
  }
60791
- executeOnAllRanges(adaptRange, sheetId, sheetName) {
60827
+ executeOnAllRanges(rangeAdapter) {
60792
60828
  this.isAdaptingRanges = true;
60793
- const func = this.verifyRangeRemoved(adaptRange);
60829
+ const adapterFunctions = {
60830
+ applyChange: this.verifyRangeRemoved(rangeAdapter.applyChange),
60831
+ adaptRangeString: (defaultSheetId, sheetXC) => adaptStringRange(defaultSheetId, sheetXC, rangeAdapter),
60832
+ adaptFormulaString: (defaultSheetId, formula) => adaptFormulaStringRanges(defaultSheetId, formula, rangeAdapter),
60833
+ };
60794
60834
  for (const provider of this.providers) {
60795
- provider(func, sheetId, sheetName);
60835
+ provider(adapterFunctions, rangeAdapter.sheetId, rangeAdapter.sheetName);
60796
60836
  }
60797
60837
  this.isAdaptingRanges = false;
60798
60838
  }
@@ -60960,18 +61000,6 @@ stores.inject(MyMetaStore, storeInstance);
60960
61000
  const unionOfZones = unionUnboundedZones(...zones);
60961
61001
  return this.getRangeFromZone(ranges[0].sheetId, unionOfZones);
60962
61002
  }
60963
- adaptFormulaStringDependencies(sheetId, formula, applyChange) {
60964
- if (!formula.startsWith("=")) {
60965
- return formula;
60966
- }
60967
- const compiledFormula = compile(formula);
60968
- const updatedDependencies = compiledFormula.dependencies.map((dep) => {
60969
- const range = this.getters.getRangeFromSheetXC(sheetId, dep);
60970
- const changedRange = applyChange(range);
60971
- return changedRange.changeType === "NONE" ? range : changedRange.range;
60972
- });
60973
- return this.getters.getFormulaString(sheetId, compiledFormula.tokens, updatedDependencies);
60974
- }
60975
61003
  /**
60976
61004
  * Copy a formula string to another sheet.
60977
61005
  *
@@ -61864,7 +61892,7 @@ stores.inject(MyMetaStore, storeInstance);
61864
61892
  static getters = ["getCoreTable", "getCoreTables", "getCoreTableMatchingTopLeft"];
61865
61893
  tables = {};
61866
61894
  nextTableId = 1;
61867
- adaptRanges(applyChange, sheetId) {
61895
+ adaptRanges({ applyChange }, sheetId) {
61868
61896
  for (const table of this.getCoreTables(sheetId)) {
61869
61897
  this.applyRangeChangeOnTable(sheetId, table, applyChange);
61870
61898
  }
@@ -62742,6 +62770,7 @@ stores.inject(MyMetaStore, storeInstance);
62742
62770
  "getMeasureCompiledFormula",
62743
62771
  "getPivotName",
62744
62772
  "isExistingPivot",
62773
+ "getMeasureFullDependencies",
62745
62774
  ];
62746
62775
  nextFormulaId = 1;
62747
62776
  pivots = {};
@@ -62824,12 +62853,12 @@ stores.inject(MyMetaStore, storeInstance);
62824
62853
  }
62825
62854
  case "UPDATE_PIVOT": {
62826
62855
  this.history.update("pivots", cmd.pivotId, "definition", this.repairSortedColumn(deepCopy(cmd.pivot)));
62827
- this.compileCalculatedMeasures(cmd.pivot.measures);
62856
+ this.compileCalculatedMeasures(cmd.pivotId, cmd.pivot.measures);
62828
62857
  break;
62829
62858
  }
62830
62859
  }
62831
62860
  }
62832
- adaptRanges(applyChange) {
62861
+ adaptRanges({ applyChange, adaptFormulaString }) {
62833
62862
  for (const pivotId in this.pivots) {
62834
62863
  const definition = deepCopy(this.pivots[pivotId]?.definition);
62835
62864
  if (!definition) {
@@ -62842,22 +62871,22 @@ stores.inject(MyMetaStore, storeInstance);
62842
62871
  this.history.update("pivots", pivotId, "definition", newDefinition);
62843
62872
  }
62844
62873
  }
62845
- for (const sheetId in this.compiledMeasureFormulas) {
62846
- for (const formulaString in this.compiledMeasureFormulas[sheetId]) {
62847
- const compiledFormula = this.compiledMeasureFormulas[sheetId][formulaString];
62848
- const newDependencies = [];
62849
- for (const range of compiledFormula.dependencies) {
62850
- const change = applyChange(range);
62851
- if (change.changeType === "NONE") {
62852
- newDependencies.push(range);
62853
- }
62854
- else {
62855
- newDependencies.push(change.range);
62856
- }
62874
+ for (const pivotId in this.compiledMeasureFormulas) {
62875
+ for (const measureId in this.compiledMeasureFormulas[pivotId]) {
62876
+ const measure = this.pivots[pivotId]?.definition.measures.find((m) => m.id === measureId);
62877
+ if (!measure || !measure.computedBy) {
62878
+ continue;
62857
62879
  }
62858
- const newFormulaString = this.getters.getFormulaString(sheetId, compiledFormula.tokens, newDependencies);
62859
- if (newFormulaString !== formulaString) {
62860
- this.replaceMeasureFormula(sheetId, formulaString, newFormulaString);
62880
+ const sheetId = measure.computedBy.sheetId;
62881
+ const { formula: compiledFormula, dependencies: indirectDependencies } = this.compiledMeasureFormulas[pivotId][measureId];
62882
+ // adapt direct dependencies
62883
+ this.history.update("compiledMeasureFormulas", pivotId, measureId, "formula", "dependencies", compiledFormula.dependencies.map((range) => applyChange(range).range));
62884
+ // adapt all dependencies (including indirect)
62885
+ this.history.update("compiledMeasureFormulas", pivotId, measure.id, "dependencies", indirectDependencies.map((range) => applyChange(range).range));
62886
+ const oldFormulaString = measure.computedBy.formula;
62887
+ const newFormulaString = adaptFormulaString(sheetId, oldFormulaString);
62888
+ if (newFormulaString !== oldFormulaString) {
62889
+ this.replaceMeasureFormula(pivotId, measure, newFormulaString);
62861
62890
  }
62862
62891
  }
62863
62892
  }
@@ -62895,12 +62924,17 @@ stores.inject(MyMetaStore, storeInstance);
62895
62924
  isExistingPivot(pivotId) {
62896
62925
  return pivotId in this.pivots;
62897
62926
  }
62898
- getMeasureCompiledFormula(measure) {
62927
+ getMeasureCompiledFormula(pivotId, measure) {
62928
+ if (!measure.computedBy) {
62929
+ throw new Error(`Measure ${measure.fieldName} is not computed by formula`);
62930
+ }
62931
+ return this.compiledMeasureFormulas[pivotId][measure.id].formula;
62932
+ }
62933
+ getMeasureFullDependencies(pivotId, measure) {
62899
62934
  if (!measure.computedBy) {
62900
62935
  throw new Error(`Measure ${measure.fieldName} is not computed by formula`);
62901
62936
  }
62902
- const sheetId = measure.computedBy.sheetId;
62903
- return this.compiledMeasureFormulas[sheetId][measure.computedBy.formula];
62937
+ return this.compiledMeasureFormulas[pivotId][measure.id].dependencies;
62904
62938
  }
62905
62939
  // -------------------------------------------------------------------------
62906
62940
  // Private
@@ -62910,18 +62944,42 @@ stores.inject(MyMetaStore, storeInstance);
62910
62944
  definition: this.repairSortedColumn(deepCopy(pivot)),
62911
62945
  formulaId,
62912
62946
  });
62913
- this.compileCalculatedMeasures(pivot.measures);
62947
+ this.compileCalculatedMeasures(pivotId, pivot.measures);
62914
62948
  this.history.update("formulaIds", formulaId, pivotId);
62915
62949
  this.history.update("nextFormulaId", this.nextFormulaId + 1);
62916
62950
  }
62917
- compileCalculatedMeasures(measures) {
62951
+ compileCalculatedMeasures(pivotId, measures) {
62918
62952
  for (const measure of measures) {
62919
62953
  if (measure.computedBy) {
62920
- const sheetId = measure.computedBy.sheetId;
62921
62954
  const compiledFormula = this.compileMeasureFormula(measure.computedBy.sheetId, measure.computedBy.formula);
62922
- this.history.update("compiledMeasureFormulas", sheetId, measure.computedBy.formula, compiledFormula);
62955
+ this.history.update("compiledMeasureFormulas", pivotId, measure.id, "formula", compiledFormula);
62923
62956
  }
62924
62957
  }
62958
+ for (const measure of measures) {
62959
+ if (measure.computedBy) {
62960
+ const dependencies = this.computeMeasureFullDependencies(pivotId, measure);
62961
+ this.history.update("compiledMeasureFormulas", pivotId, measure.id, "dependencies", dependencies);
62962
+ }
62963
+ }
62964
+ }
62965
+ computeMeasureFullDependencies(pivotId, measure, exploredMeasures = new Set()) {
62966
+ const rangeDependencies = [];
62967
+ const definition = this.getPivotCoreDefinition(pivotId);
62968
+ const formula = this.getMeasureCompiledFormula(pivotId, measure);
62969
+ exploredMeasures.add(measure.id);
62970
+ for (const token of formula.tokens) {
62971
+ if (token.type !== "SYMBOL") {
62972
+ continue;
62973
+ }
62974
+ const otherMeasure = definition.measures.find((measureCandidate) => getCanonicalSymbolName(measureCandidate.id) === token.value &&
62975
+ measure.id !== measureCandidate.id);
62976
+ if (!otherMeasure || exploredMeasures.has(otherMeasure.id) || !otherMeasure.computedBy) {
62977
+ continue;
62978
+ }
62979
+ rangeDependencies.push(...this.computeMeasureFullDependencies(pivotId, otherMeasure, exploredMeasures));
62980
+ }
62981
+ rangeDependencies.push(...formula.dependencies.filter((range) => !range.invalidXc));
62982
+ return rangeDependencies;
62925
62983
  }
62926
62984
  insertPivot(position, formulaId, table) {
62927
62985
  this.resizeSheet(position.sheetId, position, table);
@@ -62981,21 +63039,16 @@ stores.inject(MyMetaStore, storeInstance);
62981
63039
  dependencies: rangeDependencies,
62982
63040
  };
62983
63041
  }
62984
- replaceMeasureFormula(sheetId, formulaString, newFormulaString) {
62985
- this.history.update("compiledMeasureFormulas", sheetId, formulaString, undefined);
62986
- this.history.update("compiledMeasureFormulas", sheetId, newFormulaString, this.compileMeasureFormula(sheetId, newFormulaString));
62987
- for (const pivotId in this.pivots) {
62988
- const pivot = this.pivots[pivotId];
62989
- if (!pivot) {
62990
- continue;
62991
- }
62992
- for (const measure of pivot.definition.measures) {
62993
- if (measure.computedBy?.formula === formulaString) {
62994
- const measureIndex = pivot.definition.measures.indexOf(measure);
62995
- this.history.update("pivots", pivotId, "definition", "measures", measureIndex, "computedBy", { formula: newFormulaString, sheetId });
62996
- }
62997
- }
63042
+ replaceMeasureFormula(pivotId, measure, newFormulaString) {
63043
+ const pivot = this.pivots[pivotId];
63044
+ if (!pivot) {
63045
+ return;
62998
63046
  }
63047
+ const measureIndex = pivot.definition.measures.indexOf(measure);
63048
+ this.history.update("pivots", pivotId, "definition", "measures", measureIndex, "computedBy", {
63049
+ formula: newFormulaString,
63050
+ sheetId: measure.computedBy.sheetId,
63051
+ });
62999
63052
  }
63000
63053
  checkSortedColumnInMeasures(definition) {
63001
63054
  definition = this.repairSortedColumn(definition);
@@ -64400,11 +64453,16 @@ stores.inject(MyMetaStore, storeInstance);
64400
64453
  return this.arrayFormulasToResults.get(formulasPosition);
64401
64454
  }
64402
64455
  /**
64403
- * Remove a node, also remove it from other nodes adjacency list
64456
+ * Remove a spreading relation for a given array formula position
64457
+ * and its result zone
64404
64458
  */
64405
64459
  removeNode(position) {
64460
+ const resultZone = this.arrayFormulasToResults.get(position);
64461
+ if (!resultZone) {
64462
+ return;
64463
+ }
64406
64464
  this.resultsToArrayFormulas.remove({
64407
- boundingBox: { sheetId: position.sheetId, zone: positionToZone(position) },
64465
+ boundingBox: { sheetId: position.sheetId, zone: resultZone },
64408
64466
  data: position,
64409
64467
  });
64410
64468
  this.arrayFormulasToResults.delete(position);
@@ -64692,6 +64750,10 @@ stores.inject(MyMetaStore, storeInstance);
64692
64750
  // empty matrix
64693
64751
  return createEvaluatedCell({ value: 0 }, this.getters.getLocale(), cellData);
64694
64752
  }
64753
+ if (nbRows === 1 && nbColumns === 1) {
64754
+ // single value matrix
64755
+ return createEvaluatedCell(nullValueToZeroValue(formulaReturn[0][0]), this.getters.getLocale(), cellData);
64756
+ }
64695
64757
  const resultZone = {
64696
64758
  top: formulaPosition.row,
64697
64759
  bottom: formulaPosition.row + nbRows - 1,
@@ -66117,6 +66179,7 @@ stores.inject(MyMetaStore, storeInstance);
66117
66179
  handle(cmd) {
66118
66180
  switch (cmd.type) {
66119
66181
  case "START":
66182
+ case "UPDATE_LOCALE":
66120
66183
  for (const sheetId of this.getters.getSheetIds()) {
66121
66184
  this.initializeSheet(sheetId);
66122
66185
  }
@@ -66238,7 +66301,7 @@ stores.inject(MyMetaStore, storeInstance);
66238
66301
  }
66239
66302
  const cell = this.getters.getCell(position);
66240
66303
  const colSize = this.getters.getColSize(position.sheetId, position.col);
66241
- return getDefaultCellHeight(this.ctx, cell, colSize);
66304
+ return getDefaultCellHeight(this.ctx, cell, this.getters.getLocale(), colSize);
66242
66305
  }
66243
66306
  isInMultiRowMerge(position) {
66244
66307
  const merge = this.getters.getMerge(position);
@@ -66285,14 +66348,16 @@ stores.inject(MyMetaStore, storeInstance);
66285
66348
  function withPivotPresentationLayer (PivotClass) {
66286
66349
  class PivotPresentationLayer extends PivotClass {
66287
66350
  getters;
66351
+ pivotId;
66288
66352
  cache = {};
66289
66353
  rankAsc = {};
66290
66354
  rankDesc = {};
66291
66355
  runningTotal = {};
66292
66356
  runningTotalInPercent = {};
66293
- constructor(custom, params) {
66357
+ constructor(pivotId, custom, params) {
66294
66358
  super(custom, params);
66295
66359
  this.getters = params.getters;
66360
+ this.pivotId = pivotId;
66296
66361
  }
66297
66362
  markAsDirtyForEvaluation() {
66298
66363
  this.cache = {};
@@ -66342,7 +66407,7 @@ stores.inject(MyMetaStore, storeInstance);
66342
66407
  return handleError(error, measure.aggregator.toUpperCase());
66343
66408
  }
66344
66409
  }
66345
- const formula = this.getters.getMeasureCompiledFormula(measure);
66410
+ const formula = this.getters.getMeasureCompiledFormula(this.pivotId, measure);
66346
66411
  const getSymbolValue = (symbolName) => {
66347
66412
  const { columns, rows } = this.definition;
66348
66413
  if (columns.find((col) => col.nameWithGranularity === symbolName)) {
@@ -67070,7 +67135,7 @@ stores.inject(MyMetaStore, storeInstance);
67070
67135
  const definition = deepCopy(this.getters.getPivotCoreDefinition(pivotId));
67071
67136
  if (!(pivotId in this.pivots)) {
67072
67137
  const Pivot = withPivotPresentationLayer(pivotRegistry.get(definition.type).ui);
67073
- this.pivots[pivotId] = new Pivot(this.custom, { definition, getters: this.getters });
67138
+ this.pivots[pivotId] = new Pivot(pivotId, this.custom, { definition, getters: this.getters });
67074
67139
  }
67075
67140
  else if (recreate) {
67076
67141
  this.pivots[pivotId].onDefinitionChange(definition);
@@ -68125,7 +68190,7 @@ stores.inject(MyMetaStore, storeInstance);
68125
68190
  cmd.cf.rule = {
68126
68191
  ...rule,
68127
68192
  rangeValues: rule.rangeValues
68128
- ? adaptStringRange(cmd.sheetId, rule.rangeValues, applyChange)
68193
+ ? adaptStringRange(cmd.sheetId, rule.rangeValues, applyChange).range
68129
68194
  : undefined,
68130
68195
  };
68131
68196
  }
@@ -79612,6 +79677,9 @@ stores.inject(MyMetaStore, storeInstance);
79612
79677
  if (style.alignment && style.alignment.wrapText) {
79613
79678
  alignAttrs.push(["wrapText", "1"]);
79614
79679
  }
79680
+ if (style.alignment && style.alignment.shrinkToFit) {
79681
+ alignAttrs.push(["shrinkToFit", "1"]);
79682
+ }
79615
79683
  if (alignAttrs.length > 0) {
79616
79684
  attributes.push(["applyAlignment", "1"]); // for Libre Office
79617
79685
  styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}><alignment ${formatAttributes(alignAttrs)} /></xf> `);
@@ -80382,7 +80450,7 @@ stores.inject(MyMetaStore, storeInstance);
80382
80450
  this.config = this.setupConfig(config);
80383
80451
  this.session = this.setupSession(workbookData.revisionId);
80384
80452
  this.coreGetters = {};
80385
- this.range = new RangeAdapter(this.coreGetters);
80453
+ this.range = new RangeAdapterPlugin(this.coreGetters);
80386
80454
  this.coreGetters.getRangeString = this.range.getRangeString.bind(this.range);
80387
80455
  this.coreGetters.getRangeFromSheetXC = this.range.getRangeFromSheetXC.bind(this.range);
80388
80456
  this.coreGetters.createAdaptedRanges = this.range.createAdaptedRanges.bind(this.range);
@@ -80396,8 +80464,6 @@ stores.inject(MyMetaStore, storeInstance);
80396
80464
  this.coreGetters.extendRange = this.range.extendRange.bind(this.range);
80397
80465
  this.coreGetters.getRangesUnion = this.range.getRangesUnion.bind(this.range);
80398
80466
  this.coreGetters.removeRangesSheetPrefix = this.range.removeRangesSheetPrefix.bind(this.range);
80399
- this.coreGetters.adaptFormulaStringDependencies =
80400
- this.range.adaptFormulaStringDependencies.bind(this.range);
80401
80467
  this.coreGetters.copyFormulaStringForSheet = this.range.copyFormulaStringForSheet.bind(this.range);
80402
80468
  this.getters = {
80403
80469
  isReadonly: () => this.config.mode === "readonly" || this.config.mode === "dashboard",
@@ -81113,9 +81179,9 @@ stores.inject(MyMetaStore, storeInstance);
81113
81179
  exports.tokenize = tokenize;
81114
81180
 
81115
81181
 
81116
- __info__.version = "18.3.31";
81117
- __info__.date = "2025-12-26T10:18:10.765Z";
81118
- __info__.hash = "1e143e1";
81182
+ __info__.version = "18.3.33";
81183
+ __info__.date = "2026-01-21T11:05:17.933Z";
81184
+ __info__.hash = "b7e5d91";
81119
81185
 
81120
81186
 
81121
81187
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);