@odoo/o-spreadsheet 18.1.3 → 18.1.5

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.5
6
+ * @date 2025-01-31T08:00:10.263Z
7
+ * @hash 97acb8b
8
8
  */
9
9
 
10
10
  'use strict';
@@ -3350,11 +3350,11 @@ const getInvaluableSymbolsRegexp = memoize(function getInvaluableSymbolsRegexp(l
3350
3350
  * number from the point of view of the isNumber function.
3351
3351
  */
3352
3352
  function parseNumber(str, locale) {
3353
+ // remove invaluable characters
3354
+ str = str.replace(getInvaluableSymbolsRegexp(locale), "");
3353
3355
  if (locale.decimalSeparator !== ".") {
3354
3356
  str = str.replace(locale.decimalSeparator, ".");
3355
3357
  }
3356
- // remove invaluable characters
3357
- str = str.replace(getInvaluableSymbolsRegexp(locale), "");
3358
3358
  let n = Number(str);
3359
3359
  if (isNaN(n) && str.includes("%")) {
3360
3360
  n = Number(str.split("%")[0]);
@@ -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)
@@ -40369,6 +40369,12 @@ class Composer extends owl.Component {
40369
40369
  }
40370
40370
  this.contentHelper.updateEl(el);
40371
40371
  });
40372
+ this.env.model.selection.observe(this, {
40373
+ handleEvent: () => this.autoCompleteState.hide(),
40374
+ });
40375
+ owl.onWillUnmount(() => {
40376
+ this.env.model.selection.detachObserver(this);
40377
+ });
40372
40378
  owl.useEffect(() => {
40373
40379
  this.processContent();
40374
40380
  if (document.activeElement === this.contentHelper.el &&
@@ -53313,7 +53319,7 @@ class CellPlugin extends CorePlugin {
53313
53319
  /*
53314
53320
  * Reconstructs the original formula string based on new dependencies
53315
53321
  */
53316
- getFormulaString(sheetId, tokens, dependencies, useFixedReference = false) {
53322
+ getFormulaString(sheetId, tokens, dependencies, useBoundedReference = false) {
53317
53323
  if (!dependencies.length) {
53318
53324
  return concat(tokens.map((token) => token.value));
53319
53325
  }
@@ -53321,7 +53327,7 @@ class CellPlugin extends CorePlugin {
53321
53327
  return concat(tokens.map((token) => {
53322
53328
  if (token.type === "REFERENCE") {
53323
53329
  const range = dependencies[rangeIndex++];
53324
- return this.getters.getRangeString(range, sheetId, { useFixedReference });
53330
+ return this.getters.getRangeString(range, sheetId, { useBoundedReference });
53325
53331
  }
53326
53332
  return token.value;
53327
53333
  }));
@@ -53601,7 +53607,7 @@ class FormulaCellWithDependencies {
53601
53607
  if (token.type === "REFERENCE") {
53602
53608
  const index = rangeIndex++;
53603
53609
  return this.getRangeString(this.compiledFormula.dependencies[index], this.sheetId, {
53604
- useFixedReference: true,
53610
+ useBoundedReference: true,
53605
53611
  });
53606
53612
  }
53607
53613
  return token.value;
@@ -53938,7 +53944,7 @@ class ConditionalFormatPlugin extends CorePlugin {
53938
53944
  if (data.sheets) {
53939
53945
  for (let sheet of data.sheets) {
53940
53946
  if (this.cfRules[sheet.id]) {
53941
- sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useFixedReference: true }));
53947
+ sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useBoundedReference: true }));
53942
53948
  }
53943
53949
  }
53944
53950
  }
@@ -54007,9 +54013,9 @@ class ConditionalFormatPlugin extends CorePlugin {
54007
54013
  // ---------------------------------------------------------------------------
54008
54014
  // Private
54009
54015
  // ---------------------------------------------------------------------------
54010
- mapToConditionalFormat(sheetId, cf, { useFixedReference } = { useFixedReference: false }) {
54016
+ mapToConditionalFormat(sheetId, cf, { useBoundedReference } = { useBoundedReference: false }) {
54011
54017
  const ranges = cf.ranges.map((range) => {
54012
- return this.getters.getRangeString(range, sheetId, { useFixedReference });
54018
+ return this.getters.getRangeString(range, sheetId, { useBoundedReference });
54013
54019
  });
54014
54020
  if (cf.rule.type !== "DataBarRule") {
54015
54021
  return {
@@ -54024,7 +54030,7 @@ class ConditionalFormatPlugin extends CorePlugin {
54024
54030
  ...cf.rule,
54025
54031
  rangeValues: cf.rule.rangeValues &&
54026
54032
  this.getters.getRangeString(cf.rule.rangeValues, sheetId, {
54027
- useFixedReference,
54033
+ useBoundedReference,
54028
54034
  }),
54029
54035
  },
54030
54036
  ranges,
@@ -54465,10 +54471,20 @@ class DataValidationPlugin extends CorePlugin {
54465
54471
  for (const sheet of data.sheets) {
54466
54472
  sheet.dataValidationRules = [];
54467
54473
  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
- });
54474
+ const excelRule = {
54475
+ ...deepCopy(rule),
54476
+ ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useBoundedReference: true })),
54477
+ };
54478
+ if (rule.criterion.type === "isValueInRange") {
54479
+ excelRule.criterion.values = rule.criterion.values.map((value) => {
54480
+ const range = this.getters.getRangeFromSheetXC(sheet.id, value);
54481
+ return this.getters.getRangeString(range, sheet.id, {
54482
+ useBoundedReference: true,
54483
+ useFixedReference: true,
54484
+ });
54485
+ });
54486
+ }
54487
+ sheet.dataValidationRules.push(excelRule);
54472
54488
  }
54473
54489
  }
54474
54490
  }
@@ -55889,9 +55905,10 @@ class RangeAdapter {
55889
55905
  * @param range the range (received from getRangeFromXC or getRangeFromZone)
55890
55906
  * @param forSheetId the id of the sheet where the range string is supposed to be used.
55891
55907
  * @param options
55908
+ * @param options.useBoundedReference if true, the range will be returned with bounded row and column
55892
55909
  * @param options.useFixedReference if true, the range will be returned with fixed row and column
55893
55910
  */
55894
- getRangeString(range, forSheetId, options = { useFixedReference: false }) {
55911
+ getRangeString(range, forSheetId, options = { useBoundedReference: false, useFixedReference: false }) {
55895
55912
  if (!range) {
55896
55913
  return CellErrorType.InvalidReference;
55897
55914
  }
@@ -55994,13 +56011,13 @@ class RangeAdapter {
55994
56011
  /**
55995
56012
  * Get a Xc string that represent a part of a range
55996
56013
  */
55997
- getRangePartString(range, part, options = { useFixedReference: false }) {
55998
- const colFixed = range.parts && range.parts[part]?.colFixed ? "$" : "";
56014
+ getRangePartString(range, part, options = { useBoundedReference: false, useFixedReference: false }) {
56015
+ const colFixed = range.parts[part]?.colFixed || options.useFixedReference ? "$" : "";
55999
56016
  const col = part === 0 ? numberToLetters(range.zone.left) : numberToLetters(range.zone.right);
56000
- const rowFixed = range.parts && range.parts[part]?.rowFixed ? "$" : "";
56017
+ const rowFixed = range.parts[part]?.rowFixed || options.useFixedReference ? "$" : "";
56001
56018
  const row = part === 0 ? String(range.zone.top + 1) : String(range.zone.bottom + 1);
56002
56019
  let str = "";
56003
- if (range.isFullCol && !options.useFixedReference) {
56020
+ if (range.isFullCol && !options.useBoundedReference) {
56004
56021
  if (part === 0 && range.unboundedZone.hasHeader) {
56005
56022
  str = colFixed + col + rowFixed + row;
56006
56023
  }
@@ -56008,7 +56025,7 @@ class RangeAdapter {
56008
56025
  str = colFixed + col;
56009
56026
  }
56010
56027
  }
56011
- else if (range.isFullRow && !options.useFixedReference) {
56028
+ else if (range.isFullRow && !options.useBoundedReference) {
56012
56029
  if (part === 0 && range.unboundedZone.hasHeader) {
56013
56030
  str = colFixed + col + rowFixed + row;
56014
56031
  }
@@ -61309,7 +61326,7 @@ function withPivotPresentationLayer (PivotClass) {
61309
61326
  const symbolIndex = rowDomain.findIndex((row) => row.field === symbolName);
61310
61327
  return this.getPivotHeaderValueAndFormat(rowDomain.slice(0, symbolIndex + 1));
61311
61328
  }
61312
- return this._getPivotCellValueAndFormat(symbolName, domain);
61329
+ return this.getPivotCellValueAndFormat(symbolName, domain);
61313
61330
  };
61314
61331
  const result = this.getters.evaluateCompiledFormula(measure.computedBy.sheetId, formula, getSymbolValue);
61315
61332
  if (isMatrix(result)) {
@@ -63187,6 +63204,7 @@ class Session extends EventBus {
63187
63204
  waitingUndoRedoAck = false;
63188
63205
  isReplayingInitialRevisions = false;
63189
63206
  processedRevisions = new Set();
63207
+ lastRevisionMessage = undefined;
63190
63208
  uuidGenerator = new UuidGenerator();
63191
63209
  lastLocalOperation;
63192
63210
  /**
@@ -63287,7 +63305,10 @@ class Session extends EventBus {
63287
63305
  * Notify the server that the user client left the collaborative session
63288
63306
  */
63289
63307
  async leave(data) {
63290
- if (data && Object.keys(this.clients).length === 1 && this.processedRevisions.size) {
63308
+ if (data &&
63309
+ Object.keys(this.clients).length === 1 &&
63310
+ this.lastRevisionMessage &&
63311
+ this.lastRevisionMessage?.type !== "SNAPSHOT_CREATED") {
63291
63312
  await this.snapshot(data());
63292
63313
  }
63293
63314
  delete this.clients[this.clientId];
@@ -63508,6 +63529,7 @@ class Session extends EventBus {
63508
63529
  this.pendingMessages = this.pendingMessages.filter((msg) => msg.nextRevisionId !== message.nextRevisionId);
63509
63530
  this.serverRevisionId = message.nextRevisionId;
63510
63531
  this.processedRevisions.add(message.nextRevisionId);
63532
+ this.lastRevisionMessage = message;
63511
63533
  this.sendPendingMessage();
63512
63534
  break;
63513
63535
  }
@@ -64475,14 +64497,12 @@ class SheetUIPlugin extends UIPlugin {
64475
64497
  }
64476
64498
  break;
64477
64499
  case "AUTORESIZE_ROWS":
64478
- for (let row of cmd.rows) {
64479
- this.dispatch("RESIZE_COLUMNS_ROWS", {
64480
- elements: [row],
64481
- dimension: "ROW",
64482
- size: null,
64483
- sheetId: cmd.sheetId,
64484
- });
64485
- }
64500
+ this.dispatch("RESIZE_COLUMNS_ROWS", {
64501
+ elements: cmd.rows,
64502
+ dimension: "ROW",
64503
+ size: null,
64504
+ sheetId: cmd.sheetId,
64505
+ });
64486
64506
  break;
64487
64507
  }
64488
64508
  }
@@ -71506,6 +71526,9 @@ class EventStream {
71506
71526
  observe(owner, callbacks) {
71507
71527
  this.observers.set(owner, { owner, callbacks });
71508
71528
  }
71529
+ detachObserver(owner) {
71530
+ this.observers.delete(owner);
71531
+ }
71509
71532
  /**
71510
71533
  * Capture the stream for yourself
71511
71534
  */
@@ -71598,6 +71621,9 @@ class SelectionStreamProcessorImpl {
71598
71621
  observe(owner, callbacks) {
71599
71622
  this.stream.observe(owner, callbacks);
71600
71623
  }
71624
+ detachObserver(owner) {
71625
+ this.stream.detachObserver(owner);
71626
+ }
71601
71627
  release(owner) {
71602
71628
  if (this.stream.isListening(owner)) {
71603
71629
  this.stream.release(owner);
@@ -75017,6 +75043,6 @@ exports.tokenColors = tokenColors;
75017
75043
  exports.tokenize = tokenize;
75018
75044
 
75019
75045
 
75020
- __info__.version = "18.1.3";
75021
- __info__.date = "2025-01-27T10:50:23.000Z";
75022
- __info__.hash = "7ffac1e";
75046
+ __info__.version = "18.1.5";
75047
+ __info__.date = "2025-01-31T08:00:10.263Z";
75048
+ __info__.hash = "97acb8b";
@@ -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
  /**
@@ -1531,6 +1532,7 @@ type StatefulStream<Event, State> = {
1531
1532
  resetDefaultAnchor: (owner: unknown, state: State) => void;
1532
1533
  resetAnchor: (owner: unknown, state: State) => void;
1533
1534
  observe: (owner: unknown, callbacks: StreamCallbacks<Event>) => void;
1535
+ detachObserver: (owner: unknown) => void;
1534
1536
  release: (owner: unknown) => void;
1535
1537
  getBackToDefault(): void;
1536
1538
  };
@@ -3977,6 +3979,10 @@ interface SpreadsheetChildEnv extends NotificationStoreMethods {
3977
3979
  getStore: Get;
3978
3980
  }
3979
3981
 
3982
+ interface RangeStringOptions {
3983
+ useBoundedReference?: boolean;
3984
+ useFixedReference?: boolean;
3985
+ }
3980
3986
  declare class RangeAdapter implements CommandHandler<CoreCommand> {
3981
3987
  private getters;
3982
3988
  private providers;
@@ -4024,11 +4030,10 @@ declare class RangeAdapter implements CommandHandler<CoreCommand> {
4024
4030
  * @param range the range (received from getRangeFromXC or getRangeFromZone)
4025
4031
  * @param forSheetId the id of the sheet where the range string is supposed to be used.
4026
4032
  * @param options
4033
+ * @param options.useBoundedReference if true, the range will be returned with bounded row and column
4027
4034
  * @param options.useFixedReference if true, the range will be returned with fixed row and column
4028
4035
  */
4029
- getRangeString(range: Range, forSheetId: UID, options?: {
4030
- useFixedReference: boolean;
4031
- }): string;
4036
+ getRangeString(range: Range, forSheetId: UID, options?: RangeStringOptions): string;
4032
4037
  getRangeDataFromXc(sheetId: UID, xc: string): RangeData;
4033
4038
  getRangeDataFromZone(sheetId: UID, zone: Zone | UnboundedZone): RangeData;
4034
4039
  getRangeFromZone(sheetId: UID, zone: Zone | UnboundedZone): Range;
@@ -4262,7 +4267,7 @@ declare class CellPlugin extends CorePlugin<CoreState$1> implements CoreState$1
4262
4267
  * starting an async evaluation even if it has been moved or re-allocated
4263
4268
  */
4264
4269
  getCellById(cellId: UID): Cell | undefined;
4265
- getFormulaString(sheetId: UID, tokens: Token[], dependencies: Range[], useFixedReference?: boolean): string;
4270
+ getFormulaString(sheetId: UID, tokens: Token[], dependencies: Range[], useBoundedReference?: boolean): string;
4266
4271
  getTranslatedCellFormula(sheetId: UID, offsetX: number, offsetY: number, tokens: Token[]): string;
4267
4272
  getFormulaMovedInSheet(originSheetId: UID, targetSheetId: UID, tokens: Token[]): string;
4268
4273
  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.5
6
+ * @date 2025-01-31T08:00:10.263Z
7
+ * @hash 97acb8b
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';
@@ -3348,11 +3348,11 @@ const getInvaluableSymbolsRegexp = memoize(function getInvaluableSymbolsRegexp(l
3348
3348
  * number from the point of view of the isNumber function.
3349
3349
  */
3350
3350
  function parseNumber(str, locale) {
3351
+ // remove invaluable characters
3352
+ str = str.replace(getInvaluableSymbolsRegexp(locale), "");
3351
3353
  if (locale.decimalSeparator !== ".") {
3352
3354
  str = str.replace(locale.decimalSeparator, ".");
3353
3355
  }
3354
- // remove invaluable characters
3355
- str = str.replace(getInvaluableSymbolsRegexp(locale), "");
3356
3356
  let n = Number(str);
3357
3357
  if (isNaN(n) && str.includes("%")) {
3358
3358
  n = Number(str.split("%")[0]);
@@ -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)
@@ -40367,6 +40367,12 @@ class Composer extends Component {
40367
40367
  }
40368
40368
  this.contentHelper.updateEl(el);
40369
40369
  });
40370
+ this.env.model.selection.observe(this, {
40371
+ handleEvent: () => this.autoCompleteState.hide(),
40372
+ });
40373
+ onWillUnmount(() => {
40374
+ this.env.model.selection.detachObserver(this);
40375
+ });
40370
40376
  useEffect(() => {
40371
40377
  this.processContent();
40372
40378
  if (document.activeElement === this.contentHelper.el &&
@@ -53311,7 +53317,7 @@ class CellPlugin extends CorePlugin {
53311
53317
  /*
53312
53318
  * Reconstructs the original formula string based on new dependencies
53313
53319
  */
53314
- getFormulaString(sheetId, tokens, dependencies, useFixedReference = false) {
53320
+ getFormulaString(sheetId, tokens, dependencies, useBoundedReference = false) {
53315
53321
  if (!dependencies.length) {
53316
53322
  return concat(tokens.map((token) => token.value));
53317
53323
  }
@@ -53319,7 +53325,7 @@ class CellPlugin extends CorePlugin {
53319
53325
  return concat(tokens.map((token) => {
53320
53326
  if (token.type === "REFERENCE") {
53321
53327
  const range = dependencies[rangeIndex++];
53322
- return this.getters.getRangeString(range, sheetId, { useFixedReference });
53328
+ return this.getters.getRangeString(range, sheetId, { useBoundedReference });
53323
53329
  }
53324
53330
  return token.value;
53325
53331
  }));
@@ -53599,7 +53605,7 @@ class FormulaCellWithDependencies {
53599
53605
  if (token.type === "REFERENCE") {
53600
53606
  const index = rangeIndex++;
53601
53607
  return this.getRangeString(this.compiledFormula.dependencies[index], this.sheetId, {
53602
- useFixedReference: true,
53608
+ useBoundedReference: true,
53603
53609
  });
53604
53610
  }
53605
53611
  return token.value;
@@ -53936,7 +53942,7 @@ class ConditionalFormatPlugin extends CorePlugin {
53936
53942
  if (data.sheets) {
53937
53943
  for (let sheet of data.sheets) {
53938
53944
  if (this.cfRules[sheet.id]) {
53939
- sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useFixedReference: true }));
53945
+ sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useBoundedReference: true }));
53940
53946
  }
53941
53947
  }
53942
53948
  }
@@ -54005,9 +54011,9 @@ class ConditionalFormatPlugin extends CorePlugin {
54005
54011
  // ---------------------------------------------------------------------------
54006
54012
  // Private
54007
54013
  // ---------------------------------------------------------------------------
54008
- mapToConditionalFormat(sheetId, cf, { useFixedReference } = { useFixedReference: false }) {
54014
+ mapToConditionalFormat(sheetId, cf, { useBoundedReference } = { useBoundedReference: false }) {
54009
54015
  const ranges = cf.ranges.map((range) => {
54010
- return this.getters.getRangeString(range, sheetId, { useFixedReference });
54016
+ return this.getters.getRangeString(range, sheetId, { useBoundedReference });
54011
54017
  });
54012
54018
  if (cf.rule.type !== "DataBarRule") {
54013
54019
  return {
@@ -54022,7 +54028,7 @@ class ConditionalFormatPlugin extends CorePlugin {
54022
54028
  ...cf.rule,
54023
54029
  rangeValues: cf.rule.rangeValues &&
54024
54030
  this.getters.getRangeString(cf.rule.rangeValues, sheetId, {
54025
- useFixedReference,
54031
+ useBoundedReference,
54026
54032
  }),
54027
54033
  },
54028
54034
  ranges,
@@ -54463,10 +54469,20 @@ class DataValidationPlugin extends CorePlugin {
54463
54469
  for (const sheet of data.sheets) {
54464
54470
  sheet.dataValidationRules = [];
54465
54471
  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
- });
54472
+ const excelRule = {
54473
+ ...deepCopy(rule),
54474
+ ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useBoundedReference: true })),
54475
+ };
54476
+ if (rule.criterion.type === "isValueInRange") {
54477
+ excelRule.criterion.values = rule.criterion.values.map((value) => {
54478
+ const range = this.getters.getRangeFromSheetXC(sheet.id, value);
54479
+ return this.getters.getRangeString(range, sheet.id, {
54480
+ useBoundedReference: true,
54481
+ useFixedReference: true,
54482
+ });
54483
+ });
54484
+ }
54485
+ sheet.dataValidationRules.push(excelRule);
54470
54486
  }
54471
54487
  }
54472
54488
  }
@@ -55887,9 +55903,10 @@ class RangeAdapter {
55887
55903
  * @param range the range (received from getRangeFromXC or getRangeFromZone)
55888
55904
  * @param forSheetId the id of the sheet where the range string is supposed to be used.
55889
55905
  * @param options
55906
+ * @param options.useBoundedReference if true, the range will be returned with bounded row and column
55890
55907
  * @param options.useFixedReference if true, the range will be returned with fixed row and column
55891
55908
  */
55892
- getRangeString(range, forSheetId, options = { useFixedReference: false }) {
55909
+ getRangeString(range, forSheetId, options = { useBoundedReference: false, useFixedReference: false }) {
55893
55910
  if (!range) {
55894
55911
  return CellErrorType.InvalidReference;
55895
55912
  }
@@ -55992,13 +56009,13 @@ class RangeAdapter {
55992
56009
  /**
55993
56010
  * Get a Xc string that represent a part of a range
55994
56011
  */
55995
- getRangePartString(range, part, options = { useFixedReference: false }) {
55996
- const colFixed = range.parts && range.parts[part]?.colFixed ? "$" : "";
56012
+ getRangePartString(range, part, options = { useBoundedReference: false, useFixedReference: false }) {
56013
+ const colFixed = range.parts[part]?.colFixed || options.useFixedReference ? "$" : "";
55997
56014
  const col = part === 0 ? numberToLetters(range.zone.left) : numberToLetters(range.zone.right);
55998
- const rowFixed = range.parts && range.parts[part]?.rowFixed ? "$" : "";
56015
+ const rowFixed = range.parts[part]?.rowFixed || options.useFixedReference ? "$" : "";
55999
56016
  const row = part === 0 ? String(range.zone.top + 1) : String(range.zone.bottom + 1);
56000
56017
  let str = "";
56001
- if (range.isFullCol && !options.useFixedReference) {
56018
+ if (range.isFullCol && !options.useBoundedReference) {
56002
56019
  if (part === 0 && range.unboundedZone.hasHeader) {
56003
56020
  str = colFixed + col + rowFixed + row;
56004
56021
  }
@@ -56006,7 +56023,7 @@ class RangeAdapter {
56006
56023
  str = colFixed + col;
56007
56024
  }
56008
56025
  }
56009
- else if (range.isFullRow && !options.useFixedReference) {
56026
+ else if (range.isFullRow && !options.useBoundedReference) {
56010
56027
  if (part === 0 && range.unboundedZone.hasHeader) {
56011
56028
  str = colFixed + col + rowFixed + row;
56012
56029
  }
@@ -61307,7 +61324,7 @@ function withPivotPresentationLayer (PivotClass) {
61307
61324
  const symbolIndex = rowDomain.findIndex((row) => row.field === symbolName);
61308
61325
  return this.getPivotHeaderValueAndFormat(rowDomain.slice(0, symbolIndex + 1));
61309
61326
  }
61310
- return this._getPivotCellValueAndFormat(symbolName, domain);
61327
+ return this.getPivotCellValueAndFormat(symbolName, domain);
61311
61328
  };
61312
61329
  const result = this.getters.evaluateCompiledFormula(measure.computedBy.sheetId, formula, getSymbolValue);
61313
61330
  if (isMatrix(result)) {
@@ -63185,6 +63202,7 @@ class Session extends EventBus {
63185
63202
  waitingUndoRedoAck = false;
63186
63203
  isReplayingInitialRevisions = false;
63187
63204
  processedRevisions = new Set();
63205
+ lastRevisionMessage = undefined;
63188
63206
  uuidGenerator = new UuidGenerator();
63189
63207
  lastLocalOperation;
63190
63208
  /**
@@ -63285,7 +63303,10 @@ class Session extends EventBus {
63285
63303
  * Notify the server that the user client left the collaborative session
63286
63304
  */
63287
63305
  async leave(data) {
63288
- if (data && Object.keys(this.clients).length === 1 && this.processedRevisions.size) {
63306
+ if (data &&
63307
+ Object.keys(this.clients).length === 1 &&
63308
+ this.lastRevisionMessage &&
63309
+ this.lastRevisionMessage?.type !== "SNAPSHOT_CREATED") {
63289
63310
  await this.snapshot(data());
63290
63311
  }
63291
63312
  delete this.clients[this.clientId];
@@ -63506,6 +63527,7 @@ class Session extends EventBus {
63506
63527
  this.pendingMessages = this.pendingMessages.filter((msg) => msg.nextRevisionId !== message.nextRevisionId);
63507
63528
  this.serverRevisionId = message.nextRevisionId;
63508
63529
  this.processedRevisions.add(message.nextRevisionId);
63530
+ this.lastRevisionMessage = message;
63509
63531
  this.sendPendingMessage();
63510
63532
  break;
63511
63533
  }
@@ -64473,14 +64495,12 @@ class SheetUIPlugin extends UIPlugin {
64473
64495
  }
64474
64496
  break;
64475
64497
  case "AUTORESIZE_ROWS":
64476
- for (let row of cmd.rows) {
64477
- this.dispatch("RESIZE_COLUMNS_ROWS", {
64478
- elements: [row],
64479
- dimension: "ROW",
64480
- size: null,
64481
- sheetId: cmd.sheetId,
64482
- });
64483
- }
64498
+ this.dispatch("RESIZE_COLUMNS_ROWS", {
64499
+ elements: cmd.rows,
64500
+ dimension: "ROW",
64501
+ size: null,
64502
+ sheetId: cmd.sheetId,
64503
+ });
64484
64504
  break;
64485
64505
  }
64486
64506
  }
@@ -71504,6 +71524,9 @@ class EventStream {
71504
71524
  observe(owner, callbacks) {
71505
71525
  this.observers.set(owner, { owner, callbacks });
71506
71526
  }
71527
+ detachObserver(owner) {
71528
+ this.observers.delete(owner);
71529
+ }
71507
71530
  /**
71508
71531
  * Capture the stream for yourself
71509
71532
  */
@@ -71596,6 +71619,9 @@ class SelectionStreamProcessorImpl {
71596
71619
  observe(owner, callbacks) {
71597
71620
  this.stream.observe(owner, callbacks);
71598
71621
  }
71622
+ detachObserver(owner) {
71623
+ this.stream.detachObserver(owner);
71624
+ }
71599
71625
  release(owner) {
71600
71626
  if (this.stream.isListening(owner)) {
71601
71627
  this.stream.release(owner);
@@ -74971,6 +74997,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
74971
74997
  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
74998
 
74973
74999
 
74974
- __info__.version = "18.1.3";
74975
- __info__.date = "2025-01-27T10:50:23.000Z";
74976
- __info__.hash = "7ffac1e";
75000
+ __info__.version = "18.1.5";
75001
+ __info__.date = "2025-01-31T08:00:10.263Z";
75002
+ __info__.hash = "97acb8b";