@odoo/o-spreadsheet 18.0.11 → 18.0.12

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.0.11
6
- * @date 2025-01-27T10:08:13.567Z
7
- * @hash e8c6bd1
5
+ * @version 18.0.12
6
+ * @date 2025-01-29T06:24:22.122Z
7
+ * @hash a881cff
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -9456,13 +9456,13 @@ stores.inject(MyMetaStore, storeInstance);
9456
9456
  else if (ds.labelCell) {
9457
9457
  label = {
9458
9458
  reference: getters.getRangeString(ds.labelCell, "forceSheetReference", {
9459
- useFixedReference: true,
9459
+ useBoundedReference: true,
9460
9460
  }),
9461
9461
  };
9462
9462
  }
9463
9463
  return {
9464
9464
  label,
9465
- range: getters.getRangeString(dataRange, "forceSheetReference", { useFixedReference: true }),
9465
+ range: getters.getRangeString(dataRange, "forceSheetReference", { useBoundedReference: true }),
9466
9466
  backgroundColor: ds.backgroundColor,
9467
9467
  rightYAxis: ds.rightYAxis,
9468
9468
  };
@@ -9477,7 +9477,7 @@ stores.inject(MyMetaStore, storeInstance);
9477
9477
  zone.top = zone.top + 1;
9478
9478
  }
9479
9479
  const range = labelRange.clone({ zone });
9480
- return getters.getRangeString(range, "forceSheetReference", { useFixedReference: true });
9480
+ return getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
9481
9481
  }
9482
9482
  /**
9483
9483
  * Transform a chart definition which supports dataSets (dataSets and LabelRange)
@@ -9641,11 +9641,7 @@ stores.inject(MyMetaStore, storeInstance);
9641
9641
  if (values.length < 2 || labels.length < 2 || newLabels.length === 0) {
9642
9642
  return [];
9643
9643
  }
9644
- const labelMin = Math.min(...labels);
9645
- const labelMax = Math.max(...labels);
9646
- const labelRange = labelMax - labelMin;
9647
- const normalizedLabels = labels.map((v) => (v - labelMin) / labelRange);
9648
- const normalizedNewLabels = newLabels.map((v) => (v - labelMin) / labelRange);
9644
+ const { normalizedLabels, normalizedNewLabels } = normalizeLabels(labels, newLabels, config);
9649
9645
  try {
9650
9646
  switch (config.type) {
9651
9647
  case "polynomial": {
@@ -9684,6 +9680,30 @@ stores.inject(MyMetaStore, storeInstance);
9684
9680
  return Array.from({ length: newLabels.length }, () => NaN);
9685
9681
  }
9686
9682
  }
9683
+ function normalizeLabels(labels, newLabels, config) {
9684
+ let normalizedLabels = [];
9685
+ let normalizedNewLabels = [];
9686
+ if (config.type === "logarithmic") {
9687
+ // Logarithmic trends in charts are used to visualize proportional growth or
9688
+ // relative changes. Therefore, we change the normalization technique for
9689
+ // logarithmic trend lines for a better fit. The method used here is Max Absolute
9690
+ // Scaling. This Technique is ideal for data spanning several orders of magnitude,
9691
+ // as it balances differences between small and large values by compressing larger
9692
+ // values while preserving proportionality and ensuring all values are scaled relative
9693
+ // to the largest magnitude.
9694
+ const labelMax = Math.max(...labels.map(Math.abs));
9695
+ normalizedLabels = labels.map((l) => l / labelMax);
9696
+ normalizedNewLabels = newLabels.map((l) => l / labelMax);
9697
+ }
9698
+ else {
9699
+ const labelMax = Math.max(...labels);
9700
+ const labelMin = Math.min(...labels);
9701
+ const labelRange = labelMax - labelMin;
9702
+ normalizedLabels = labels.map((l) => (l - labelMax) / labelRange);
9703
+ normalizedNewLabels = newLabels.map((l) => (l - labelMax) / labelRange);
9704
+ }
9705
+ return { normalizedLabels, normalizedNewLabels };
9706
+ }
9687
9707
  function formatTickValue(localeFormat) {
9688
9708
  return (value) => {
9689
9709
  value = Number(value);
@@ -51364,7 +51384,7 @@ stores.inject(MyMetaStore, storeInstance);
51364
51384
  /*
51365
51385
  * Reconstructs the original formula string based on new dependencies
51366
51386
  */
51367
- getFormulaString(sheetId, tokens, dependencies, useFixedReference = false) {
51387
+ getFormulaString(sheetId, tokens, dependencies, useBoundedReference = false) {
51368
51388
  if (!dependencies.length) {
51369
51389
  return concat(tokens.map((token) => token.value));
51370
51390
  }
@@ -51372,7 +51392,7 @@ stores.inject(MyMetaStore, storeInstance);
51372
51392
  return concat(tokens.map((token) => {
51373
51393
  if (token.type === "REFERENCE") {
51374
51394
  const range = dependencies[rangeIndex++];
51375
- return this.getters.getRangeString(range, sheetId, { useFixedReference });
51395
+ return this.getters.getRangeString(range, sheetId, { useBoundedReference });
51376
51396
  }
51377
51397
  return token.value;
51378
51398
  }));
@@ -51652,7 +51672,7 @@ stores.inject(MyMetaStore, storeInstance);
51652
51672
  if (token.type === "REFERENCE") {
51653
51673
  const index = rangeIndex++;
51654
51674
  return this.getRangeString(this.compiledFormula.dependencies[index], this.sheetId, {
51655
- useFixedReference: true,
51675
+ useBoundedReference: true,
51656
51676
  });
51657
51677
  }
51658
51678
  return token.value;
@@ -51989,7 +52009,7 @@ stores.inject(MyMetaStore, storeInstance);
51989
52009
  if (data.sheets) {
51990
52010
  for (let sheet of data.sheets) {
51991
52011
  if (this.cfRules[sheet.id]) {
51992
- sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useFixedReference: true }));
52012
+ sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useBoundedReference: true }));
51993
52013
  }
51994
52014
  }
51995
52015
  }
@@ -52058,9 +52078,9 @@ stores.inject(MyMetaStore, storeInstance);
52058
52078
  // ---------------------------------------------------------------------------
52059
52079
  // Private
52060
52080
  // ---------------------------------------------------------------------------
52061
- mapToConditionalFormat(sheetId, cf, { useFixedReference } = { useFixedReference: false }) {
52081
+ mapToConditionalFormat(sheetId, cf, { useBoundedReference } = { useBoundedReference: false }) {
52062
52082
  const ranges = cf.ranges.map((range) => {
52063
- return this.getters.getRangeString(range, sheetId, { useFixedReference });
52083
+ return this.getters.getRangeString(range, sheetId, { useBoundedReference });
52064
52084
  });
52065
52085
  if (cf.rule.type !== "DataBarRule") {
52066
52086
  return {
@@ -52075,7 +52095,7 @@ stores.inject(MyMetaStore, storeInstance);
52075
52095
  ...cf.rule,
52076
52096
  rangeValues: cf.rule.rangeValues &&
52077
52097
  this.getters.getRangeString(cf.rule.rangeValues, sheetId, {
52078
- useFixedReference,
52098
+ useBoundedReference,
52079
52099
  }),
52080
52100
  },
52081
52101
  ranges,
@@ -52505,10 +52525,20 @@ stores.inject(MyMetaStore, storeInstance);
52505
52525
  for (const sheet of data.sheets) {
52506
52526
  sheet.dataValidationRules = [];
52507
52527
  for (const rule of this.rules[sheet.id]) {
52508
- sheet.dataValidationRules.push({
52509
- ...rule,
52510
- ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useFixedReference: true })),
52511
- });
52528
+ const excelRule = {
52529
+ ...deepCopy(rule),
52530
+ ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useBoundedReference: true })),
52531
+ };
52532
+ if (rule.criterion.type === "isValueInRange") {
52533
+ excelRule.criterion.values = rule.criterion.values.map((value) => {
52534
+ const range = this.getters.getRangeFromSheetXC(sheet.id, value);
52535
+ return this.getters.getRangeString(range, sheet.id, {
52536
+ useBoundedReference: true,
52537
+ useFixedReference: true,
52538
+ });
52539
+ });
52540
+ }
52541
+ sheet.dataValidationRules.push(excelRule);
52512
52542
  }
52513
52543
  }
52514
52544
  }
@@ -53922,9 +53952,10 @@ stores.inject(MyMetaStore, storeInstance);
53922
53952
  * @param range the range (received from getRangeFromXC or getRangeFromZone)
53923
53953
  * @param forSheetId the id of the sheet where the range string is supposed to be used.
53924
53954
  * @param options
53955
+ * @param options.useBoundedReference if true, the range will be returned with bounded row and column
53925
53956
  * @param options.useFixedReference if true, the range will be returned with fixed row and column
53926
53957
  */
53927
- getRangeString(range, forSheetId, options = { useFixedReference: false }) {
53958
+ getRangeString(range, forSheetId, options = { useBoundedReference: false, useFixedReference: false }) {
53928
53959
  if (!range) {
53929
53960
  return CellErrorType.InvalidReference;
53930
53961
  }
@@ -54027,13 +54058,13 @@ stores.inject(MyMetaStore, storeInstance);
54027
54058
  /**
54028
54059
  * Get a Xc string that represent a part of a range
54029
54060
  */
54030
- getRangePartString(range, part, options = { useFixedReference: false }) {
54031
- const colFixed = range.parts && range.parts[part]?.colFixed ? "$" : "";
54061
+ getRangePartString(range, part, options = { useBoundedReference: false, useFixedReference: false }) {
54062
+ const colFixed = range.parts[part]?.colFixed || options.useFixedReference ? "$" : "";
54032
54063
  const col = part === 0 ? numberToLetters(range.zone.left) : numberToLetters(range.zone.right);
54033
- const rowFixed = range.parts && range.parts[part]?.rowFixed ? "$" : "";
54064
+ const rowFixed = range.parts[part]?.rowFixed || options.useFixedReference ? "$" : "";
54034
54065
  const row = part === 0 ? String(range.zone.top + 1) : String(range.zone.bottom + 1);
54035
54066
  let str = "";
54036
- if (range.isFullCol && !options.useFixedReference) {
54067
+ if (range.isFullCol && !options.useBoundedReference) {
54037
54068
  if (part === 0 && range.unboundedZone.hasHeader) {
54038
54069
  str = colFixed + col + rowFixed + row;
54039
54070
  }
@@ -54041,7 +54072,7 @@ stores.inject(MyMetaStore, storeInstance);
54041
54072
  str = colFixed + col;
54042
54073
  }
54043
54074
  }
54044
- else if (range.isFullRow && !options.useFixedReference) {
54075
+ else if (range.isFullRow && !options.useBoundedReference) {
54045
54076
  if (part === 0 && range.unboundedZone.hasHeader) {
54046
54077
  str = colFixed + col + rowFixed + row;
54047
54078
  }
@@ -61241,6 +61272,7 @@ stores.inject(MyMetaStore, storeInstance);
61241
61272
  waitingUndoRedoAck = false;
61242
61273
  isReplayingInitialRevisions = false;
61243
61274
  processedRevisions = new Set();
61275
+ lastRevisionMessage = undefined;
61244
61276
  uuidGenerator = new UuidGenerator();
61245
61277
  lastLocalOperation;
61246
61278
  /**
@@ -61341,7 +61373,10 @@ stores.inject(MyMetaStore, storeInstance);
61341
61373
  * Notify the server that the user client left the collaborative session
61342
61374
  */
61343
61375
  async leave(data) {
61344
- if (data && Object.keys(this.clients).length === 1 && this.processedRevisions.size) {
61376
+ if (data &&
61377
+ Object.keys(this.clients).length === 1 &&
61378
+ this.lastRevisionMessage &&
61379
+ this.lastRevisionMessage?.type !== "SNAPSHOT_CREATED") {
61345
61380
  await this.snapshot(data());
61346
61381
  }
61347
61382
  delete this.clients[this.clientId];
@@ -61562,6 +61597,7 @@ stores.inject(MyMetaStore, storeInstance);
61562
61597
  this.pendingMessages = this.pendingMessages.filter((msg) => msg.nextRevisionId !== message.nextRevisionId);
61563
61598
  this.serverRevisionId = message.nextRevisionId;
61564
61599
  this.processedRevisions.add(message.nextRevisionId);
61600
+ this.lastRevisionMessage = message;
61565
61601
  this.sendPendingMessage();
61566
61602
  break;
61567
61603
  }
@@ -73053,9 +73089,9 @@ stores.inject(MyMetaStore, storeInstance);
73053
73089
  exports.tokenize = tokenize;
73054
73090
 
73055
73091
 
73056
- __info__.version = "18.0.11";
73057
- __info__.date = "2025-01-27T10:08:13.567Z";
73058
- __info__.hash = "e8c6bd1";
73092
+ __info__.version = "18.0.12";
73093
+ __info__.date = "2025-01-29T06:24:22.122Z";
73094
+ __info__.hash = "a881cff";
73059
73095
 
73060
73096
 
73061
73097
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);