@odoo/o-spreadsheet 18.1.3 → 18.1.4

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.1.3
6
- * @date 2025-01-27T10:50:23.000Z
7
- * @hash 7ffac1e
5
+ * @version 18.1.4
6
+ * @date 2025-01-29T06:27:32.901Z
7
+ * @hash a11ef27
8
8
  */
9
9
 
10
10
  'use strict';
@@ -9658,13 +9658,13 @@ function toExcelDataset(getters, ds) {
9658
9658
  else if (ds.labelCell) {
9659
9659
  label = {
9660
9660
  reference: getters.getRangeString(ds.labelCell, "forceSheetReference", {
9661
- useFixedReference: true,
9661
+ useBoundedReference: true,
9662
9662
  }),
9663
9663
  };
9664
9664
  }
9665
9665
  return {
9666
9666
  label,
9667
- range: getters.getRangeString(dataRange, "forceSheetReference", { useFixedReference: true }),
9667
+ range: getters.getRangeString(dataRange, "forceSheetReference", { useBoundedReference: true }),
9668
9668
  backgroundColor: ds.backgroundColor,
9669
9669
  rightYAxis: ds.rightYAxis,
9670
9670
  };
@@ -9679,7 +9679,7 @@ function toExcelLabelRange(getters, labelRange, shouldRemoveFirstLabel) {
9679
9679
  zone.top = zone.top + 1;
9680
9680
  }
9681
9681
  const range = labelRange.clone({ zone });
9682
- return getters.getRangeString(range, "forceSheetReference", { useFixedReference: true });
9682
+ return getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
9683
9683
  }
9684
9684
  /**
9685
9685
  * Transform a chart definition which supports dataSets (dataSets and LabelRange)
@@ -53313,7 +53313,7 @@ class CellPlugin extends CorePlugin {
53313
53313
  /*
53314
53314
  * Reconstructs the original formula string based on new dependencies
53315
53315
  */
53316
- getFormulaString(sheetId, tokens, dependencies, useFixedReference = false) {
53316
+ getFormulaString(sheetId, tokens, dependencies, useBoundedReference = false) {
53317
53317
  if (!dependencies.length) {
53318
53318
  return concat(tokens.map((token) => token.value));
53319
53319
  }
@@ -53321,7 +53321,7 @@ class CellPlugin extends CorePlugin {
53321
53321
  return concat(tokens.map((token) => {
53322
53322
  if (token.type === "REFERENCE") {
53323
53323
  const range = dependencies[rangeIndex++];
53324
- return this.getters.getRangeString(range, sheetId, { useFixedReference });
53324
+ return this.getters.getRangeString(range, sheetId, { useBoundedReference });
53325
53325
  }
53326
53326
  return token.value;
53327
53327
  }));
@@ -53601,7 +53601,7 @@ class FormulaCellWithDependencies {
53601
53601
  if (token.type === "REFERENCE") {
53602
53602
  const index = rangeIndex++;
53603
53603
  return this.getRangeString(this.compiledFormula.dependencies[index], this.sheetId, {
53604
- useFixedReference: true,
53604
+ useBoundedReference: true,
53605
53605
  });
53606
53606
  }
53607
53607
  return token.value;
@@ -53938,7 +53938,7 @@ class ConditionalFormatPlugin extends CorePlugin {
53938
53938
  if (data.sheets) {
53939
53939
  for (let sheet of data.sheets) {
53940
53940
  if (this.cfRules[sheet.id]) {
53941
- sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useFixedReference: true }));
53941
+ sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useBoundedReference: true }));
53942
53942
  }
53943
53943
  }
53944
53944
  }
@@ -54007,9 +54007,9 @@ class ConditionalFormatPlugin extends CorePlugin {
54007
54007
  // ---------------------------------------------------------------------------
54008
54008
  // Private
54009
54009
  // ---------------------------------------------------------------------------
54010
- mapToConditionalFormat(sheetId, cf, { useFixedReference } = { useFixedReference: false }) {
54010
+ mapToConditionalFormat(sheetId, cf, { useBoundedReference } = { useBoundedReference: false }) {
54011
54011
  const ranges = cf.ranges.map((range) => {
54012
- return this.getters.getRangeString(range, sheetId, { useFixedReference });
54012
+ return this.getters.getRangeString(range, sheetId, { useBoundedReference });
54013
54013
  });
54014
54014
  if (cf.rule.type !== "DataBarRule") {
54015
54015
  return {
@@ -54024,7 +54024,7 @@ class ConditionalFormatPlugin extends CorePlugin {
54024
54024
  ...cf.rule,
54025
54025
  rangeValues: cf.rule.rangeValues &&
54026
54026
  this.getters.getRangeString(cf.rule.rangeValues, sheetId, {
54027
- useFixedReference,
54027
+ useBoundedReference,
54028
54028
  }),
54029
54029
  },
54030
54030
  ranges,
@@ -54465,10 +54465,20 @@ class DataValidationPlugin extends CorePlugin {
54465
54465
  for (const sheet of data.sheets) {
54466
54466
  sheet.dataValidationRules = [];
54467
54467
  for (const rule of this.rules[sheet.id]) {
54468
- sheet.dataValidationRules.push({
54469
- ...rule,
54470
- ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useFixedReference: true })),
54471
- });
54468
+ const excelRule = {
54469
+ ...deepCopy(rule),
54470
+ ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useBoundedReference: true })),
54471
+ };
54472
+ if (rule.criterion.type === "isValueInRange") {
54473
+ excelRule.criterion.values = rule.criterion.values.map((value) => {
54474
+ const range = this.getters.getRangeFromSheetXC(sheet.id, value);
54475
+ return this.getters.getRangeString(range, sheet.id, {
54476
+ useBoundedReference: true,
54477
+ useFixedReference: true,
54478
+ });
54479
+ });
54480
+ }
54481
+ sheet.dataValidationRules.push(excelRule);
54472
54482
  }
54473
54483
  }
54474
54484
  }
@@ -55889,9 +55899,10 @@ class RangeAdapter {
55889
55899
  * @param range the range (received from getRangeFromXC or getRangeFromZone)
55890
55900
  * @param forSheetId the id of the sheet where the range string is supposed to be used.
55891
55901
  * @param options
55902
+ * @param options.useBoundedReference if true, the range will be returned with bounded row and column
55892
55903
  * @param options.useFixedReference if true, the range will be returned with fixed row and column
55893
55904
  */
55894
- getRangeString(range, forSheetId, options = { useFixedReference: false }) {
55905
+ getRangeString(range, forSheetId, options = { useBoundedReference: false, useFixedReference: false }) {
55895
55906
  if (!range) {
55896
55907
  return CellErrorType.InvalidReference;
55897
55908
  }
@@ -55994,13 +56005,13 @@ class RangeAdapter {
55994
56005
  /**
55995
56006
  * Get a Xc string that represent a part of a range
55996
56007
  */
55997
- getRangePartString(range, part, options = { useFixedReference: false }) {
55998
- const colFixed = range.parts && range.parts[part]?.colFixed ? "$" : "";
56008
+ getRangePartString(range, part, options = { useBoundedReference: false, useFixedReference: false }) {
56009
+ const colFixed = range.parts[part]?.colFixed || options.useFixedReference ? "$" : "";
55999
56010
  const col = part === 0 ? numberToLetters(range.zone.left) : numberToLetters(range.zone.right);
56000
- const rowFixed = range.parts && range.parts[part]?.rowFixed ? "$" : "";
56011
+ const rowFixed = range.parts[part]?.rowFixed || options.useFixedReference ? "$" : "";
56001
56012
  const row = part === 0 ? String(range.zone.top + 1) : String(range.zone.bottom + 1);
56002
56013
  let str = "";
56003
- if (range.isFullCol && !options.useFixedReference) {
56014
+ if (range.isFullCol && !options.useBoundedReference) {
56004
56015
  if (part === 0 && range.unboundedZone.hasHeader) {
56005
56016
  str = colFixed + col + rowFixed + row;
56006
56017
  }
@@ -56008,7 +56019,7 @@ class RangeAdapter {
56008
56019
  str = colFixed + col;
56009
56020
  }
56010
56021
  }
56011
- else if (range.isFullRow && !options.useFixedReference) {
56022
+ else if (range.isFullRow && !options.useBoundedReference) {
56012
56023
  if (part === 0 && range.unboundedZone.hasHeader) {
56013
56024
  str = colFixed + col + rowFixed + row;
56014
56025
  }
@@ -63187,6 +63198,7 @@ class Session extends EventBus {
63187
63198
  waitingUndoRedoAck = false;
63188
63199
  isReplayingInitialRevisions = false;
63189
63200
  processedRevisions = new Set();
63201
+ lastRevisionMessage = undefined;
63190
63202
  uuidGenerator = new UuidGenerator();
63191
63203
  lastLocalOperation;
63192
63204
  /**
@@ -63287,7 +63299,10 @@ class Session extends EventBus {
63287
63299
  * Notify the server that the user client left the collaborative session
63288
63300
  */
63289
63301
  async leave(data) {
63290
- if (data && Object.keys(this.clients).length === 1 && this.processedRevisions.size) {
63302
+ if (data &&
63303
+ Object.keys(this.clients).length === 1 &&
63304
+ this.lastRevisionMessage &&
63305
+ this.lastRevisionMessage?.type !== "SNAPSHOT_CREATED") {
63291
63306
  await this.snapshot(data());
63292
63307
  }
63293
63308
  delete this.clients[this.clientId];
@@ -63508,6 +63523,7 @@ class Session extends EventBus {
63508
63523
  this.pendingMessages = this.pendingMessages.filter((msg) => msg.nextRevisionId !== message.nextRevisionId);
63509
63524
  this.serverRevisionId = message.nextRevisionId;
63510
63525
  this.processedRevisions.add(message.nextRevisionId);
63526
+ this.lastRevisionMessage = message;
63511
63527
  this.sendPendingMessage();
63512
63528
  break;
63513
63529
  }
@@ -75017,6 +75033,6 @@ exports.tokenColors = tokenColors;
75017
75033
  exports.tokenize = tokenize;
75018
75034
 
75019
75035
 
75020
- __info__.version = "18.1.3";
75021
- __info__.date = "2025-01-27T10:50:23.000Z";
75022
- __info__.hash = "7ffac1e";
75036
+ __info__.version = "18.1.4";
75037
+ __info__.date = "2025-01-29T06:27:32.901Z";
75038
+ __info__.hash = "a11ef27";
@@ -1186,6 +1186,7 @@ declare class Session extends EventBus<CollaborativeEvent> {
1186
1186
  private waitingUndoRedoAck;
1187
1187
  private isReplayingInitialRevisions;
1188
1188
  private processedRevisions;
1189
+ private lastRevisionMessage;
1189
1190
  private uuidGenerator;
1190
1191
  private lastLocalOperation;
1191
1192
  /**
@@ -3977,6 +3978,10 @@ interface SpreadsheetChildEnv extends NotificationStoreMethods {
3977
3978
  getStore: Get;
3978
3979
  }
3979
3980
 
3981
+ interface RangeStringOptions {
3982
+ useBoundedReference?: boolean;
3983
+ useFixedReference?: boolean;
3984
+ }
3980
3985
  declare class RangeAdapter implements CommandHandler<CoreCommand> {
3981
3986
  private getters;
3982
3987
  private providers;
@@ -4024,11 +4029,10 @@ declare class RangeAdapter implements CommandHandler<CoreCommand> {
4024
4029
  * @param range the range (received from getRangeFromXC or getRangeFromZone)
4025
4030
  * @param forSheetId the id of the sheet where the range string is supposed to be used.
4026
4031
  * @param options
4032
+ * @param options.useBoundedReference if true, the range will be returned with bounded row and column
4027
4033
  * @param options.useFixedReference if true, the range will be returned with fixed row and column
4028
4034
  */
4029
- getRangeString(range: Range, forSheetId: UID, options?: {
4030
- useFixedReference: boolean;
4031
- }): string;
4035
+ getRangeString(range: Range, forSheetId: UID, options?: RangeStringOptions): string;
4032
4036
  getRangeDataFromXc(sheetId: UID, xc: string): RangeData;
4033
4037
  getRangeDataFromZone(sheetId: UID, zone: Zone | UnboundedZone): RangeData;
4034
4038
  getRangeFromZone(sheetId: UID, zone: Zone | UnboundedZone): Range;
@@ -4262,7 +4266,7 @@ declare class CellPlugin extends CorePlugin<CoreState$1> implements CoreState$1
4262
4266
  * starting an async evaluation even if it has been moved or re-allocated
4263
4267
  */
4264
4268
  getCellById(cellId: UID): Cell | undefined;
4265
- getFormulaString(sheetId: UID, tokens: Token[], dependencies: Range[], useFixedReference?: boolean): string;
4269
+ getFormulaString(sheetId: UID, tokens: Token[], dependencies: Range[], useBoundedReference?: boolean): string;
4266
4270
  getTranslatedCellFormula(sheetId: UID, offsetX: number, offsetY: number, tokens: Token[]): string;
4267
4271
  getFormulaMovedInSheet(originSheetId: UID, targetSheetId: UID, tokens: Token[]): string;
4268
4272
  getCellStyle(position: CellPosition): Style;
@@ -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.1.3
6
- * @date 2025-01-27T10:50:23.000Z
7
- * @hash 7ffac1e
5
+ * @version 18.1.4
6
+ * @date 2025-01-29T06:27:32.901Z
7
+ * @hash a11ef27
8
8
  */
9
9
 
10
10
  import { useEnv, useSubEnv, onWillUnmount, useComponent, status, Component, useRef, onMounted, useEffect, useState, onPatched, onWillPatch, onWillUpdateProps, useExternalListener, onWillStart, xml, useChildSubEnv, markRaw, toRaw } from '@odoo/owl';
@@ -9656,13 +9656,13 @@ function toExcelDataset(getters, ds) {
9656
9656
  else if (ds.labelCell) {
9657
9657
  label = {
9658
9658
  reference: getters.getRangeString(ds.labelCell, "forceSheetReference", {
9659
- useFixedReference: true,
9659
+ useBoundedReference: true,
9660
9660
  }),
9661
9661
  };
9662
9662
  }
9663
9663
  return {
9664
9664
  label,
9665
- range: getters.getRangeString(dataRange, "forceSheetReference", { useFixedReference: true }),
9665
+ range: getters.getRangeString(dataRange, "forceSheetReference", { useBoundedReference: true }),
9666
9666
  backgroundColor: ds.backgroundColor,
9667
9667
  rightYAxis: ds.rightYAxis,
9668
9668
  };
@@ -9677,7 +9677,7 @@ function toExcelLabelRange(getters, labelRange, shouldRemoveFirstLabel) {
9677
9677
  zone.top = zone.top + 1;
9678
9678
  }
9679
9679
  const range = labelRange.clone({ zone });
9680
- return getters.getRangeString(range, "forceSheetReference", { useFixedReference: true });
9680
+ return getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
9681
9681
  }
9682
9682
  /**
9683
9683
  * Transform a chart definition which supports dataSets (dataSets and LabelRange)
@@ -53311,7 +53311,7 @@ class CellPlugin extends CorePlugin {
53311
53311
  /*
53312
53312
  * Reconstructs the original formula string based on new dependencies
53313
53313
  */
53314
- getFormulaString(sheetId, tokens, dependencies, useFixedReference = false) {
53314
+ getFormulaString(sheetId, tokens, dependencies, useBoundedReference = false) {
53315
53315
  if (!dependencies.length) {
53316
53316
  return concat(tokens.map((token) => token.value));
53317
53317
  }
@@ -53319,7 +53319,7 @@ class CellPlugin extends CorePlugin {
53319
53319
  return concat(tokens.map((token) => {
53320
53320
  if (token.type === "REFERENCE") {
53321
53321
  const range = dependencies[rangeIndex++];
53322
- return this.getters.getRangeString(range, sheetId, { useFixedReference });
53322
+ return this.getters.getRangeString(range, sheetId, { useBoundedReference });
53323
53323
  }
53324
53324
  return token.value;
53325
53325
  }));
@@ -53599,7 +53599,7 @@ class FormulaCellWithDependencies {
53599
53599
  if (token.type === "REFERENCE") {
53600
53600
  const index = rangeIndex++;
53601
53601
  return this.getRangeString(this.compiledFormula.dependencies[index], this.sheetId, {
53602
- useFixedReference: true,
53602
+ useBoundedReference: true,
53603
53603
  });
53604
53604
  }
53605
53605
  return token.value;
@@ -53936,7 +53936,7 @@ class ConditionalFormatPlugin extends CorePlugin {
53936
53936
  if (data.sheets) {
53937
53937
  for (let sheet of data.sheets) {
53938
53938
  if (this.cfRules[sheet.id]) {
53939
- sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useFixedReference: true }));
53939
+ sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useBoundedReference: true }));
53940
53940
  }
53941
53941
  }
53942
53942
  }
@@ -54005,9 +54005,9 @@ class ConditionalFormatPlugin extends CorePlugin {
54005
54005
  // ---------------------------------------------------------------------------
54006
54006
  // Private
54007
54007
  // ---------------------------------------------------------------------------
54008
- mapToConditionalFormat(sheetId, cf, { useFixedReference } = { useFixedReference: false }) {
54008
+ mapToConditionalFormat(sheetId, cf, { useBoundedReference } = { useBoundedReference: false }) {
54009
54009
  const ranges = cf.ranges.map((range) => {
54010
- return this.getters.getRangeString(range, sheetId, { useFixedReference });
54010
+ return this.getters.getRangeString(range, sheetId, { useBoundedReference });
54011
54011
  });
54012
54012
  if (cf.rule.type !== "DataBarRule") {
54013
54013
  return {
@@ -54022,7 +54022,7 @@ class ConditionalFormatPlugin extends CorePlugin {
54022
54022
  ...cf.rule,
54023
54023
  rangeValues: cf.rule.rangeValues &&
54024
54024
  this.getters.getRangeString(cf.rule.rangeValues, sheetId, {
54025
- useFixedReference,
54025
+ useBoundedReference,
54026
54026
  }),
54027
54027
  },
54028
54028
  ranges,
@@ -54463,10 +54463,20 @@ class DataValidationPlugin extends CorePlugin {
54463
54463
  for (const sheet of data.sheets) {
54464
54464
  sheet.dataValidationRules = [];
54465
54465
  for (const rule of this.rules[sheet.id]) {
54466
- sheet.dataValidationRules.push({
54467
- ...rule,
54468
- ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useFixedReference: true })),
54469
- });
54466
+ const excelRule = {
54467
+ ...deepCopy(rule),
54468
+ ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useBoundedReference: true })),
54469
+ };
54470
+ if (rule.criterion.type === "isValueInRange") {
54471
+ excelRule.criterion.values = rule.criterion.values.map((value) => {
54472
+ const range = this.getters.getRangeFromSheetXC(sheet.id, value);
54473
+ return this.getters.getRangeString(range, sheet.id, {
54474
+ useBoundedReference: true,
54475
+ useFixedReference: true,
54476
+ });
54477
+ });
54478
+ }
54479
+ sheet.dataValidationRules.push(excelRule);
54470
54480
  }
54471
54481
  }
54472
54482
  }
@@ -55887,9 +55897,10 @@ class RangeAdapter {
55887
55897
  * @param range the range (received from getRangeFromXC or getRangeFromZone)
55888
55898
  * @param forSheetId the id of the sheet where the range string is supposed to be used.
55889
55899
  * @param options
55900
+ * @param options.useBoundedReference if true, the range will be returned with bounded row and column
55890
55901
  * @param options.useFixedReference if true, the range will be returned with fixed row and column
55891
55902
  */
55892
- getRangeString(range, forSheetId, options = { useFixedReference: false }) {
55903
+ getRangeString(range, forSheetId, options = { useBoundedReference: false, useFixedReference: false }) {
55893
55904
  if (!range) {
55894
55905
  return CellErrorType.InvalidReference;
55895
55906
  }
@@ -55992,13 +56003,13 @@ class RangeAdapter {
55992
56003
  /**
55993
56004
  * Get a Xc string that represent a part of a range
55994
56005
  */
55995
- getRangePartString(range, part, options = { useFixedReference: false }) {
55996
- const colFixed = range.parts && range.parts[part]?.colFixed ? "$" : "";
56006
+ getRangePartString(range, part, options = { useBoundedReference: false, useFixedReference: false }) {
56007
+ const colFixed = range.parts[part]?.colFixed || options.useFixedReference ? "$" : "";
55997
56008
  const col = part === 0 ? numberToLetters(range.zone.left) : numberToLetters(range.zone.right);
55998
- const rowFixed = range.parts && range.parts[part]?.rowFixed ? "$" : "";
56009
+ const rowFixed = range.parts[part]?.rowFixed || options.useFixedReference ? "$" : "";
55999
56010
  const row = part === 0 ? String(range.zone.top + 1) : String(range.zone.bottom + 1);
56000
56011
  let str = "";
56001
- if (range.isFullCol && !options.useFixedReference) {
56012
+ if (range.isFullCol && !options.useBoundedReference) {
56002
56013
  if (part === 0 && range.unboundedZone.hasHeader) {
56003
56014
  str = colFixed + col + rowFixed + row;
56004
56015
  }
@@ -56006,7 +56017,7 @@ class RangeAdapter {
56006
56017
  str = colFixed + col;
56007
56018
  }
56008
56019
  }
56009
- else if (range.isFullRow && !options.useFixedReference) {
56020
+ else if (range.isFullRow && !options.useBoundedReference) {
56010
56021
  if (part === 0 && range.unboundedZone.hasHeader) {
56011
56022
  str = colFixed + col + rowFixed + row;
56012
56023
  }
@@ -63185,6 +63196,7 @@ class Session extends EventBus {
63185
63196
  waitingUndoRedoAck = false;
63186
63197
  isReplayingInitialRevisions = false;
63187
63198
  processedRevisions = new Set();
63199
+ lastRevisionMessage = undefined;
63188
63200
  uuidGenerator = new UuidGenerator();
63189
63201
  lastLocalOperation;
63190
63202
  /**
@@ -63285,7 +63297,10 @@ class Session extends EventBus {
63285
63297
  * Notify the server that the user client left the collaborative session
63286
63298
  */
63287
63299
  async leave(data) {
63288
- if (data && Object.keys(this.clients).length === 1 && this.processedRevisions.size) {
63300
+ if (data &&
63301
+ Object.keys(this.clients).length === 1 &&
63302
+ this.lastRevisionMessage &&
63303
+ this.lastRevisionMessage?.type !== "SNAPSHOT_CREATED") {
63289
63304
  await this.snapshot(data());
63290
63305
  }
63291
63306
  delete this.clients[this.clientId];
@@ -63506,6 +63521,7 @@ class Session extends EventBus {
63506
63521
  this.pendingMessages = this.pendingMessages.filter((msg) => msg.nextRevisionId !== message.nextRevisionId);
63507
63522
  this.serverRevisionId = message.nextRevisionId;
63508
63523
  this.processedRevisions.add(message.nextRevisionId);
63524
+ this.lastRevisionMessage = message;
63509
63525
  this.sendPendingMessage();
63510
63526
  break;
63511
63527
  }
@@ -74971,6 +74987,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
74971
74987
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, CommandResult, CorePlugin, DispatchResult, EvaluationError, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, chartHelpers, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, hooks, invalidateCFEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
74972
74988
 
74973
74989
 
74974
- __info__.version = "18.1.3";
74975
- __info__.date = "2025-01-27T10:50:23.000Z";
74976
- __info__.hash = "7ffac1e";
74990
+ __info__.version = "18.1.4";
74991
+ __info__.date = "2025-01-29T06:27:32.901Z";
74992
+ __info__.hash = "a11ef27";
@@ -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.1.3
6
- * @date 2025-01-27T10:50:23.000Z
7
- * @hash 7ffac1e
5
+ * @version 18.1.4
6
+ * @date 2025-01-29T06:27:32.901Z
7
+ * @hash a11ef27
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -9657,13 +9657,13 @@ stores.inject(MyMetaStore, storeInstance);
9657
9657
  else if (ds.labelCell) {
9658
9658
  label = {
9659
9659
  reference: getters.getRangeString(ds.labelCell, "forceSheetReference", {
9660
- useFixedReference: true,
9660
+ useBoundedReference: true,
9661
9661
  }),
9662
9662
  };
9663
9663
  }
9664
9664
  return {
9665
9665
  label,
9666
- range: getters.getRangeString(dataRange, "forceSheetReference", { useFixedReference: true }),
9666
+ range: getters.getRangeString(dataRange, "forceSheetReference", { useBoundedReference: true }),
9667
9667
  backgroundColor: ds.backgroundColor,
9668
9668
  rightYAxis: ds.rightYAxis,
9669
9669
  };
@@ -9678,7 +9678,7 @@ stores.inject(MyMetaStore, storeInstance);
9678
9678
  zone.top = zone.top + 1;
9679
9679
  }
9680
9680
  const range = labelRange.clone({ zone });
9681
- return getters.getRangeString(range, "forceSheetReference", { useFixedReference: true });
9681
+ return getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
9682
9682
  }
9683
9683
  /**
9684
9684
  * Transform a chart definition which supports dataSets (dataSets and LabelRange)
@@ -53312,7 +53312,7 @@ stores.inject(MyMetaStore, storeInstance);
53312
53312
  /*
53313
53313
  * Reconstructs the original formula string based on new dependencies
53314
53314
  */
53315
- getFormulaString(sheetId, tokens, dependencies, useFixedReference = false) {
53315
+ getFormulaString(sheetId, tokens, dependencies, useBoundedReference = false) {
53316
53316
  if (!dependencies.length) {
53317
53317
  return concat(tokens.map((token) => token.value));
53318
53318
  }
@@ -53320,7 +53320,7 @@ stores.inject(MyMetaStore, storeInstance);
53320
53320
  return concat(tokens.map((token) => {
53321
53321
  if (token.type === "REFERENCE") {
53322
53322
  const range = dependencies[rangeIndex++];
53323
- return this.getters.getRangeString(range, sheetId, { useFixedReference });
53323
+ return this.getters.getRangeString(range, sheetId, { useBoundedReference });
53324
53324
  }
53325
53325
  return token.value;
53326
53326
  }));
@@ -53600,7 +53600,7 @@ stores.inject(MyMetaStore, storeInstance);
53600
53600
  if (token.type === "REFERENCE") {
53601
53601
  const index = rangeIndex++;
53602
53602
  return this.getRangeString(this.compiledFormula.dependencies[index], this.sheetId, {
53603
- useFixedReference: true,
53603
+ useBoundedReference: true,
53604
53604
  });
53605
53605
  }
53606
53606
  return token.value;
@@ -53937,7 +53937,7 @@ stores.inject(MyMetaStore, storeInstance);
53937
53937
  if (data.sheets) {
53938
53938
  for (let sheet of data.sheets) {
53939
53939
  if (this.cfRules[sheet.id]) {
53940
- sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useFixedReference: true }));
53940
+ sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useBoundedReference: true }));
53941
53941
  }
53942
53942
  }
53943
53943
  }
@@ -54006,9 +54006,9 @@ stores.inject(MyMetaStore, storeInstance);
54006
54006
  // ---------------------------------------------------------------------------
54007
54007
  // Private
54008
54008
  // ---------------------------------------------------------------------------
54009
- mapToConditionalFormat(sheetId, cf, { useFixedReference } = { useFixedReference: false }) {
54009
+ mapToConditionalFormat(sheetId, cf, { useBoundedReference } = { useBoundedReference: false }) {
54010
54010
  const ranges = cf.ranges.map((range) => {
54011
- return this.getters.getRangeString(range, sheetId, { useFixedReference });
54011
+ return this.getters.getRangeString(range, sheetId, { useBoundedReference });
54012
54012
  });
54013
54013
  if (cf.rule.type !== "DataBarRule") {
54014
54014
  return {
@@ -54023,7 +54023,7 @@ stores.inject(MyMetaStore, storeInstance);
54023
54023
  ...cf.rule,
54024
54024
  rangeValues: cf.rule.rangeValues &&
54025
54025
  this.getters.getRangeString(cf.rule.rangeValues, sheetId, {
54026
- useFixedReference,
54026
+ useBoundedReference,
54027
54027
  }),
54028
54028
  },
54029
54029
  ranges,
@@ -54464,10 +54464,20 @@ stores.inject(MyMetaStore, storeInstance);
54464
54464
  for (const sheet of data.sheets) {
54465
54465
  sheet.dataValidationRules = [];
54466
54466
  for (const rule of this.rules[sheet.id]) {
54467
- sheet.dataValidationRules.push({
54468
- ...rule,
54469
- ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useFixedReference: true })),
54470
- });
54467
+ const excelRule = {
54468
+ ...deepCopy(rule),
54469
+ ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useBoundedReference: true })),
54470
+ };
54471
+ if (rule.criterion.type === "isValueInRange") {
54472
+ excelRule.criterion.values = rule.criterion.values.map((value) => {
54473
+ const range = this.getters.getRangeFromSheetXC(sheet.id, value);
54474
+ return this.getters.getRangeString(range, sheet.id, {
54475
+ useBoundedReference: true,
54476
+ useFixedReference: true,
54477
+ });
54478
+ });
54479
+ }
54480
+ sheet.dataValidationRules.push(excelRule);
54471
54481
  }
54472
54482
  }
54473
54483
  }
@@ -55888,9 +55898,10 @@ stores.inject(MyMetaStore, storeInstance);
55888
55898
  * @param range the range (received from getRangeFromXC or getRangeFromZone)
55889
55899
  * @param forSheetId the id of the sheet where the range string is supposed to be used.
55890
55900
  * @param options
55901
+ * @param options.useBoundedReference if true, the range will be returned with bounded row and column
55891
55902
  * @param options.useFixedReference if true, the range will be returned with fixed row and column
55892
55903
  */
55893
- getRangeString(range, forSheetId, options = { useFixedReference: false }) {
55904
+ getRangeString(range, forSheetId, options = { useBoundedReference: false, useFixedReference: false }) {
55894
55905
  if (!range) {
55895
55906
  return CellErrorType.InvalidReference;
55896
55907
  }
@@ -55993,13 +56004,13 @@ stores.inject(MyMetaStore, storeInstance);
55993
56004
  /**
55994
56005
  * Get a Xc string that represent a part of a range
55995
56006
  */
55996
- getRangePartString(range, part, options = { useFixedReference: false }) {
55997
- const colFixed = range.parts && range.parts[part]?.colFixed ? "$" : "";
56007
+ getRangePartString(range, part, options = { useBoundedReference: false, useFixedReference: false }) {
56008
+ const colFixed = range.parts[part]?.colFixed || options.useFixedReference ? "$" : "";
55998
56009
  const col = part === 0 ? numberToLetters(range.zone.left) : numberToLetters(range.zone.right);
55999
- const rowFixed = range.parts && range.parts[part]?.rowFixed ? "$" : "";
56010
+ const rowFixed = range.parts[part]?.rowFixed || options.useFixedReference ? "$" : "";
56000
56011
  const row = part === 0 ? String(range.zone.top + 1) : String(range.zone.bottom + 1);
56001
56012
  let str = "";
56002
- if (range.isFullCol && !options.useFixedReference) {
56013
+ if (range.isFullCol && !options.useBoundedReference) {
56003
56014
  if (part === 0 && range.unboundedZone.hasHeader) {
56004
56015
  str = colFixed + col + rowFixed + row;
56005
56016
  }
@@ -56007,7 +56018,7 @@ stores.inject(MyMetaStore, storeInstance);
56007
56018
  str = colFixed + col;
56008
56019
  }
56009
56020
  }
56010
- else if (range.isFullRow && !options.useFixedReference) {
56021
+ else if (range.isFullRow && !options.useBoundedReference) {
56011
56022
  if (part === 0 && range.unboundedZone.hasHeader) {
56012
56023
  str = colFixed + col + rowFixed + row;
56013
56024
  }
@@ -63186,6 +63197,7 @@ stores.inject(MyMetaStore, storeInstance);
63186
63197
  waitingUndoRedoAck = false;
63187
63198
  isReplayingInitialRevisions = false;
63188
63199
  processedRevisions = new Set();
63200
+ lastRevisionMessage = undefined;
63189
63201
  uuidGenerator = new UuidGenerator();
63190
63202
  lastLocalOperation;
63191
63203
  /**
@@ -63286,7 +63298,10 @@ stores.inject(MyMetaStore, storeInstance);
63286
63298
  * Notify the server that the user client left the collaborative session
63287
63299
  */
63288
63300
  async leave(data) {
63289
- if (data && Object.keys(this.clients).length === 1 && this.processedRevisions.size) {
63301
+ if (data &&
63302
+ Object.keys(this.clients).length === 1 &&
63303
+ this.lastRevisionMessage &&
63304
+ this.lastRevisionMessage?.type !== "SNAPSHOT_CREATED") {
63290
63305
  await this.snapshot(data());
63291
63306
  }
63292
63307
  delete this.clients[this.clientId];
@@ -63507,6 +63522,7 @@ stores.inject(MyMetaStore, storeInstance);
63507
63522
  this.pendingMessages = this.pendingMessages.filter((msg) => msg.nextRevisionId !== message.nextRevisionId);
63508
63523
  this.serverRevisionId = message.nextRevisionId;
63509
63524
  this.processedRevisions.add(message.nextRevisionId);
63525
+ this.lastRevisionMessage = message;
63510
63526
  this.sendPendingMessage();
63511
63527
  break;
63512
63528
  }
@@ -75016,9 +75032,9 @@ stores.inject(MyMetaStore, storeInstance);
75016
75032
  exports.tokenize = tokenize;
75017
75033
 
75018
75034
 
75019
- __info__.version = "18.1.3";
75020
- __info__.date = "2025-01-27T10:50:23.000Z";
75021
- __info__.hash = "7ffac1e";
75035
+ __info__.version = "18.1.4";
75036
+ __info__.date = "2025-01-29T06:27:32.901Z";
75037
+ __info__.hash = "a11ef27";
75022
75038
 
75023
75039
 
75024
75040
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);