@odoo/o-spreadsheet 17.4.5 → 17.4.7

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 17.4.5
6
- * @date 2024-08-19T08:12:00.492Z
7
- * @hash 28579ad
5
+ * @version 17.4.7
6
+ * @date 2024-09-05T09:32:00.461Z
7
+ * @hash c14a4c9
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -241,6 +241,7 @@
241
241
  bandedRows: true,
242
242
  bandedColumns: false,
243
243
  styleId: "TableStyleMedium5",
244
+ automaticAutofill: true,
244
245
  };
245
246
 
246
247
  //------------------------------------------------------------------------------
@@ -4559,6 +4560,17 @@
4559
4560
  }
4560
4561
  return zone;
4561
4562
  }
4563
+ function aggregatePositionsToZones(positions) {
4564
+ const result = {};
4565
+ for (const position of positions) {
4566
+ result[position.sheetId] ??= [];
4567
+ result[position.sheetId].push(positionToZone(position));
4568
+ }
4569
+ for (const sheetId in result) {
4570
+ result[sheetId] = recomputeZones(result[sheetId]);
4571
+ }
4572
+ return result;
4573
+ }
4562
4574
  /**
4563
4575
  * This function returns a zone with coordinates modified according to the change
4564
4576
  * applied to the zone. It may be possible to change the zone by resizing or moving
@@ -6774,9 +6786,11 @@
6774
6786
  const targetCell = this.getters.getEvaluatedCell(target);
6775
6787
  const originFormat = origin.cell?.format ?? origin.evaluatedCell.format;
6776
6788
  if (clipboardOption?.pasteOption === "asValue") {
6777
- const locale = this.getters.getLocale();
6778
- const content = formatValue(origin.evaluatedCell.value, { locale });
6779
- this.dispatch("UPDATE_CELL", { ...target, content, format: originFormat });
6789
+ this.dispatch("UPDATE_CELL", {
6790
+ ...target,
6791
+ content: origin.evaluatedCell.value?.toString() || "",
6792
+ format: originFormat,
6793
+ });
6780
6794
  return;
6781
6795
  }
6782
6796
  if (clipboardOption?.pasteOption === "onlyFormat") {
@@ -28378,8 +28392,26 @@ stores.inject(MyMetaStore, storeInstance);
28378
28392
  env.openSidePanel("PivotSidePanel", { pivotId });
28379
28393
  }
28380
28394
  };
28381
- const REINSERT_PIVOT_CHILDREN = (env) => env.model.getters.getPivotIds().map((pivotId, index) => ({
28382
- id: `reinsert_pivot_${env.model.getters.getPivotFormulaId(pivotId)}`,
28395
+ const REINSERT_DYNAMIC_PIVOT_CHILDREN = (env) => env.model.getters.getPivotIds().map((pivotId, index) => ({
28396
+ id: `reinsert_dynamic_pivot_${env.model.getters.getPivotFormulaId(pivotId)}`,
28397
+ name: env.model.getters.getPivotDisplayName(pivotId),
28398
+ sequence: index,
28399
+ execute: (env) => {
28400
+ const zone = env.model.getters.getSelectedZone();
28401
+ const table = env.model.getters.getPivot(pivotId).getTableStructure().export();
28402
+ env.model.dispatch("INSERT_PIVOT_WITH_TABLE", {
28403
+ pivotId,
28404
+ table,
28405
+ col: zone.left,
28406
+ row: zone.top,
28407
+ sheetId: env.model.getters.getActiveSheetId(),
28408
+ pivotMode: "dynamic",
28409
+ });
28410
+ env.model.dispatch("REFRESH_PIVOT", { id: pivotId });
28411
+ },
28412
+ }));
28413
+ const REINSERT_STATIC_PIVOT_CHILDREN = (env) => env.model.getters.getPivotIds().map((pivotId, index) => ({
28414
+ id: `reinsert_static_pivot_${env.model.getters.getPivotFormulaId(pivotId)}`,
28383
28415
  name: env.model.getters.getPivotDisplayName(pivotId),
28384
28416
  sequence: index,
28385
28417
  execute: (env) => {
@@ -28391,6 +28423,7 @@ stores.inject(MyMetaStore, storeInstance);
28391
28423
  col: zone.left,
28392
28424
  row: zone.top,
28393
28425
  sheetId: env.model.getters.getActiveSheetId(),
28426
+ pivotMode: "static",
28394
28427
  });
28395
28428
  env.model.dispatch("REFRESH_PIVOT", { id: pivotId });
28396
28429
  },
@@ -29259,12 +29292,20 @@ stores.inject(MyMetaStore, storeInstance);
29259
29292
  isEnabled: (env) => env.model.getters.isSingleColSelected(),
29260
29293
  icon: "o-spreadsheet-Icon.SPLIT_TEXT",
29261
29294
  };
29262
- const reinsertPivotMenu = {
29263
- id: "reinsert_pivot",
29264
- name: _t("Re-insert pivot"),
29295
+ const reinsertDynamicPivotMenu = {
29296
+ id: "reinsert_dynamic_pivot",
29297
+ name: _t("Re-insert dynamic pivot"),
29298
+ sequence: 1020,
29299
+ icon: "o-spreadsheet-Icon.INSERT_PIVOT",
29300
+ children: [REINSERT_DYNAMIC_PIVOT_CHILDREN],
29301
+ isVisible: (env) => env.model.getters.getPivotIds().length > 0,
29302
+ };
29303
+ const reinsertStaticPivotMenu = {
29304
+ id: "reinsert_static_pivot",
29305
+ name: _t("Re-insert static pivot"),
29265
29306
  sequence: 1020,
29266
29307
  icon: "o-spreadsheet-Icon.INSERT_PIVOT",
29267
- children: [REINSERT_PIVOT_CHILDREN],
29308
+ children: [REINSERT_STATIC_PIVOT_CHILDREN],
29268
29309
  isVisible: (env) => env.model.getters.getPivotIds().length > 0,
29269
29310
  };
29270
29311
 
@@ -29273,7 +29314,8 @@ stores.inject(MyMetaStore, storeInstance);
29273
29314
  createRemoveFilter: createRemoveFilter,
29274
29315
  createRemoveFilterTool: createRemoveFilterTool,
29275
29316
  dataCleanup: dataCleanup,
29276
- reinsertPivotMenu: reinsertPivotMenu,
29317
+ reinsertDynamicPivotMenu: reinsertDynamicPivotMenu,
29318
+ reinsertStaticPivotMenu: reinsertStaticPivotMenu,
29277
29319
  removeDuplicates: removeDuplicates,
29278
29320
  sortAscending: sortAscending,
29279
29321
  sortDescending: sortDescending,
@@ -30755,7 +30797,8 @@ stores.inject(MyMetaStore, storeInstance);
30755
30797
  };
30756
30798
  });
30757
30799
  })
30758
- .addChild("reinsert_pivot", ["data"], reinsertPivotMenu);
30800
+ .addChild("reinsert_dynamic_pivot", ["data"], reinsertDynamicPivotMenu)
30801
+ .addChild("reinsert_static_pivot", ["data"], reinsertStaticPivotMenu);
30759
30802
 
30760
30803
  class OTRegistry extends Registry {
30761
30804
  /**
@@ -35172,7 +35215,6 @@ stores.inject(MyMetaStore, storeInstance);
35172
35215
  searchScope: "activeSheet",
35173
35216
  specificRange: undefined,
35174
35217
  };
35175
- updateSearchContent = debounce(this._updateSearchContent.bind(this), 200);
35176
35218
  constructor(get) {
35177
35219
  super(get);
35178
35220
  this.initialShowFormulaState = this.model.getters.shouldShowFormulas();
@@ -35181,7 +35223,6 @@ stores.inject(MyMetaStore, storeInstance);
35181
35223
  highlightStore.register(this);
35182
35224
  this.onDispose(() => {
35183
35225
  this.model.dispatch("SET_FORMULA_VISIBILITY", { show: this.initialShowFormulaState });
35184
- this.updateSearchContent.stopDebounce();
35185
35226
  highlightStore.unRegister(this);
35186
35227
  });
35187
35228
  }
@@ -35195,7 +35236,7 @@ stores.inject(MyMetaStore, storeInstance);
35195
35236
  return this.specificRangeMatches;
35196
35237
  }
35197
35238
  }
35198
- _updateSearchContent(toSearch) {
35239
+ updateSearchContent(toSearch) {
35199
35240
  this._updateSearch(toSearch, this.searchOptions);
35200
35241
  }
35201
35242
  updateSearchOptions(searchOptions) {
@@ -35211,9 +35252,6 @@ stores.inject(MyMetaStore, storeInstance);
35211
35252
  selectNextMatch() {
35212
35253
  this.selectNextCell(Direction.next);
35213
35254
  }
35214
- get pendingSearch() {
35215
- return this.updateSearchContent.isDebouncePending();
35216
- }
35217
35255
  handle(cmd) {
35218
35256
  switch (cmd.type) {
35219
35257
  case "SET_FORMULA_VISIBILITY":
@@ -35539,6 +35577,7 @@ stores.inject(MyMetaStore, storeInstance);
35539
35577
  searchInput = owl.useRef("searchInput");
35540
35578
  store;
35541
35579
  state;
35580
+ updateSearchContent;
35542
35581
  get hasSearchResult() {
35543
35582
  return this.store.selectedMatchIndex !== null;
35544
35583
  }
@@ -35570,12 +35609,14 @@ stores.inject(MyMetaStore, storeInstance);
35570
35609
  this.store = useLocalStore(FindAndReplaceStore);
35571
35610
  this.state = owl.useState({ dataRange: "" });
35572
35611
  owl.onMounted(() => this.searchInput.el?.focus());
35612
+ owl.onWillUnmount(() => this.updateSearchContent.stopDebounce());
35613
+ this.updateSearchContent = debounce(this.store.updateSearchContent, 200);
35573
35614
  }
35574
35615
  onFocusSearch() {
35575
35616
  this.updateDataRange();
35576
35617
  }
35577
35618
  onSearchInput(ev) {
35578
- this.store.updateSearchContent(ev.target?.value || "");
35619
+ this.updateSearchContent(ev.target.value);
35579
35620
  }
35580
35621
  onKeydownSearch(ev) {
35581
35622
  if (ev.key === "Enter") {
@@ -35614,6 +35655,9 @@ stores.inject(MyMetaStore, storeInstance);
35614
35655
  const specificRange = this.env.model.getters.getRangeFromSheetXC(this.env.model.getters.getActiveSheetId(), this.state.dataRange);
35615
35656
  this.store.updateSearchOptions({ specificRange });
35616
35657
  }
35658
+ get pendingSearch() {
35659
+ return this.updateSearchContent.isDebouncePending();
35660
+ }
35617
35661
  }
35618
35662
 
35619
35663
  css /* scss */ `
@@ -36667,6 +36711,12 @@ stores.inject(MyMetaStore, storeInstance);
36667
36711
  * Used to order two values
36668
36712
  */
36669
36713
  function compareDimensionValues(dimension, a, b) {
36714
+ if (a === "null") {
36715
+ return dimension.order === "asc" ? 1 : -1;
36716
+ }
36717
+ if (b === "null") {
36718
+ return dimension.order === "asc" ? -1 : 1;
36719
+ }
36670
36720
  if (dimension.type === "integer" || dimension.type === "date") {
36671
36721
  return dimension.order === "asc" ? Number(a) - Number(b) : Number(b) - Number(a);
36672
36722
  }
@@ -37029,7 +37079,7 @@ stores.inject(MyMetaStore, storeInstance);
37029
37079
  if (cell.type === CellValueType.error) {
37030
37080
  throw new EvaluationError(_t("The pivot cannot be created because cell %s contains an error", toXC(col, row)));
37031
37081
  }
37032
- if (cell.type === CellValueType.empty) {
37082
+ if (cell.type === CellValueType.empty || cell.value === "") {
37033
37083
  throw new EvaluationError(_t("The pivot cannot be created because cell %s is empty", toXC(col, row)));
37034
37084
  }
37035
37085
  if (cell.value === "__count") {
@@ -37375,15 +37425,11 @@ stores.inject(MyMetaStore, storeInstance);
37375
37425
  }
37376
37426
  onSelectionConfirmed() {
37377
37427
  if (this.state.range) {
37378
- const { sheetName, xc } = splitReference(this.state.range);
37379
- const sheetId = sheetName
37380
- ? this.env.model.getters.getSheetIdByName(sheetName)
37381
- : this.env.model.getters.getActiveSheetId();
37382
- if (!sheetId) {
37428
+ const range = this.env.model.getters.getRangeFromSheetXC(this.env.model.getters.getActiveSheetId(), this.state.range);
37429
+ if (range.invalidSheetName || range.invalidXc) {
37383
37430
  return;
37384
37431
  }
37385
- const zone = toZone(xc);
37386
- const dataSet = { sheetId, zone };
37432
+ const dataSet = { sheetId: range.sheetId, zone: range.zone };
37387
37433
  this.store.update({ dataSet });
37388
37434
  // Immediately apply the update to recompute the pivot fields
37389
37435
  this.store.applyUpdate();
@@ -38316,10 +38362,6 @@ stores.inject(MyMetaStore, storeInstance);
38316
38362
  });
38317
38363
  }
38318
38364
  onRangeChanged(ranges) {
38319
- if (!ranges[0] || !ranges[0].match(rangeReference)) {
38320
- this.state.tableZoneErrors = ["InvalidRange" /* CommandResult.InvalidRange */];
38321
- return;
38322
- }
38323
38365
  const sheetId = this.env.model.getters.getActiveSheetId();
38324
38366
  this.state.tableXc = ranges[0];
38325
38367
  const newTableRange = this.env.model.getters.getRangeFromSheetXC(sheetId, this.state.tableXc);
@@ -38359,11 +38401,6 @@ stores.inject(MyMetaStore, storeInstance);
38359
38401
  const newTableRange = updatedTable.range;
38360
38402
  this.state.tableXc = this.env.model.getters.getRangeString(newTableRange, sheetId);
38361
38403
  }
38362
- else {
38363
- const oldTableRange = this.props.table.range;
38364
- this.state.tableXc = this.env.model.getters.getRangeString(oldTableRange, sheetId);
38365
- }
38366
- this.state.tableZoneErrors = [];
38367
38404
  }
38368
38405
  deleteTable() {
38369
38406
  const sheetId = this.env.model.getters.getActiveSheetId();
@@ -44071,6 +44108,18 @@ stores.inject(MyMetaStore, storeInstance);
44071
44108
  // -------------------------------------
44072
44109
  // WORKSHEET HELPERS
44073
44110
  // -------------------------------------
44111
+ function getCellType(value) {
44112
+ switch (typeof value) {
44113
+ case "boolean":
44114
+ return "b";
44115
+ case "string":
44116
+ return "str";
44117
+ case "number":
44118
+ return "n";
44119
+ default:
44120
+ return undefined;
44121
+ }
44122
+ }
44074
44123
  function convertHeightToExcel(height) {
44075
44124
  return Math.round(HEIGHT_FACTOR * height * 100) / 100;
44076
44125
  }
@@ -49250,7 +49299,10 @@ stores.inject(MyMetaStore, storeInstance);
49250
49299
  handle(cmd) {
49251
49300
  switch (cmd.type) {
49252
49301
  case "CREATE_SHEET": {
49253
- this.history.update("sizes", cmd.sheetId, { COL: [], ROW: [] });
49302
+ this.history.update("sizes", cmd.sheetId, {
49303
+ COL: Array(this.getters.getNumberCols(cmd.sheetId)).fill(undefined),
49304
+ ROW: Array(this.getters.getNumberRows(cmd.sheetId)).fill(undefined),
49305
+ });
49254
49306
  break;
49255
49307
  }
49256
49308
  case "DUPLICATE_SHEET":
@@ -54318,8 +54370,9 @@ stores.inject(MyMetaStore, storeInstance);
54318
54370
  }
54319
54371
  getCellsDependingOn(positions) {
54320
54372
  const ranges = [];
54321
- for (const position of positions) {
54322
- ranges.push({ sheetId: position.sheetId, zone: positionToZone(position) });
54373
+ const zonesBySheetIds = aggregatePositionsToZones(positions);
54374
+ for (const sheetId in zonesBySheetIds) {
54375
+ ranges.push(...zonesBySheetIds[sheetId].map((zone) => ({ sheetId, zone })));
54323
54376
  }
54324
54377
  return this.formulaDependencies().getCellsDependingOn(ranges);
54325
54378
  }
@@ -55794,10 +55847,6 @@ stores.inject(MyMetaStore, storeInstance);
55794
55847
  this.setupPivot(cmd.pivotId, { recreate: true });
55795
55848
  break;
55796
55849
  }
55797
- case "REMOVE_PIVOT": {
55798
- delete this.pivots[cmd.pivotId];
55799
- break;
55800
- }
55801
55850
  case "DELETE_SHEET":
55802
55851
  case "UPDATE_CELL": {
55803
55852
  this.unusedPivots = undefined;
@@ -55939,6 +55988,9 @@ stores.inject(MyMetaStore, storeInstance);
55939
55988
  }
55940
55989
  }
55941
55990
  getPivot(pivotId) {
55991
+ if (!this.getters.isExistingPivot(pivotId)) {
55992
+ throw new Error(`pivot ${pivotId} not found`);
55993
+ }
55942
55994
  return this.pivots[pivotId];
55943
55995
  }
55944
55996
  isPivotUnused(pivotId) {
@@ -57230,9 +57282,9 @@ stores.inject(MyMetaStore, storeInstance);
57230
57282
  /**
57231
57283
  * Notify the server that the user client left the collaborative session
57232
57284
  */
57233
- leave(data) {
57285
+ async leave(data) {
57234
57286
  if (Object.keys(this.clients).length === 1 && this.processedRevisions.size) {
57235
- this.snapshot(data());
57287
+ await this.snapshot(data());
57236
57288
  }
57237
57289
  delete this.clients[this.clientId];
57238
57290
  this.transportService.leave(this.clientId);
@@ -57245,12 +57297,12 @@ stores.inject(MyMetaStore, storeInstance);
57245
57297
  /**
57246
57298
  * Send a snapshot of the spreadsheet to the collaboration server
57247
57299
  */
57248
- snapshot(data) {
57300
+ async snapshot(data) {
57249
57301
  if (this.pendingMessages.length !== 0) {
57250
57302
  return;
57251
57303
  }
57252
57304
  const snapshotId = this.uuidGenerator.uuidv4();
57253
- this.transportService.sendMessage({
57305
+ await this.transportService.sendMessage({
57254
57306
  type: "SNAPSHOT",
57255
57307
  nextRevisionId: snapshotId,
57256
57308
  serverRevisionId: this.serverRevisionId,
@@ -57934,7 +57986,7 @@ stores.inject(MyMetaStore, storeInstance);
57934
57986
  this.duplicatePivotInNewSheet(cmd.pivotId, cmd.newPivotId, cmd.newSheetId);
57935
57987
  break;
57936
57988
  case "INSERT_PIVOT_WITH_TABLE":
57937
- this.insertPivotWithTable(cmd.sheetId, cmd.col, cmd.row, cmd.pivotId, cmd.table);
57989
+ this.insertPivotWithTable(cmd.sheetId, cmd.col, cmd.row, cmd.pivotId, cmd.table, cmd.pivotMode);
57938
57990
  break;
57939
57991
  }
57940
57992
  }
@@ -58010,26 +58062,44 @@ stores.inject(MyMetaStore, storeInstance);
58010
58062
  }
58011
58063
  return name;
58012
58064
  }
58013
- insertPivotWithTable(sheetId, col, row, pivotId, table) {
58065
+ insertPivotWithTable(sheetId, col, row, pivotId, table, mode) {
58014
58066
  const { cols, rows, measures, fieldsType } = table;
58015
58067
  const pivotTable = new SpreadsheetPivotTable(cols, rows, measures, fieldsType || {});
58068
+ const numberOfHeaders = pivotTable.columns.length - 1;
58016
58069
  this.resizeSheet(sheetId, col, row, pivotTable);
58017
58070
  const pivotFormulaId = this.getters.getPivotFormulaId(pivotId);
58018
- this.dispatch("UPDATE_CELL", {
58019
- sheetId,
58020
- col,
58021
- row,
58022
- content: `=PIVOT("${pivotFormulaId}")`,
58023
- });
58024
- const zone = {
58025
- left: col,
58026
- right: col,
58027
- top: row,
58028
- bottom: row,
58029
- };
58030
- const numberOfHeaders = pivotTable.columns.length - 1;
58071
+ let zone;
58072
+ if (mode === "dynamic") {
58073
+ this.dispatch("UPDATE_CELL", {
58074
+ sheetId,
58075
+ col,
58076
+ row,
58077
+ content: `=PIVOT(${pivotFormulaId})`,
58078
+ });
58079
+ zone = {
58080
+ left: col,
58081
+ right: col,
58082
+ top: row,
58083
+ bottom: row,
58084
+ };
58085
+ }
58086
+ else {
58087
+ this.dispatch("INSERT_PIVOT", {
58088
+ sheetId,
58089
+ col,
58090
+ row,
58091
+ pivotId,
58092
+ table: pivotTable.export(),
58093
+ });
58094
+ zone = {
58095
+ left: col,
58096
+ right: col + pivotTable.getNumberOfDataColumns(),
58097
+ top: row,
58098
+ bottom: row + numberOfHeaders + pivotTable.rows.length,
58099
+ };
58100
+ }
58031
58101
  this.dispatch("CREATE_TABLE", {
58032
- tableType: "dynamic",
58102
+ tableType: mode,
58033
58103
  sheetId,
58034
58104
  ranges: [this.getters.getRangeDataFromZone(sheetId, zone)],
58035
58105
  config: { ...PIVOT_TABLE_CONFIG, numberOfHeaders },
@@ -59410,6 +59480,7 @@ stores.inject(MyMetaStore, storeInstance);
59410
59480
  this.status = "invisible";
59411
59481
  if (this._isCutOperation) {
59412
59482
  this.copiedData = undefined;
59483
+ this._isCutOperation = false;
59413
59484
  }
59414
59485
  break;
59415
59486
  }
@@ -59507,6 +59578,7 @@ stores.inject(MyMetaStore, storeInstance);
59507
59578
  }
59508
59579
  case "ACTIVATE_PAINT_FORMAT": {
59509
59580
  const zones = this.getters.getSelectedZones();
59581
+ this._isCutOperation = false;
59510
59582
  this.copiedData = this.copy(zones);
59511
59583
  this.status = "visible";
59512
59584
  if (cmd.persistent) {
@@ -60229,6 +60301,8 @@ stores.inject(MyMetaStore, storeInstance);
60229
60301
  this.selectedFigureId = null;
60230
60302
  break;
60231
60303
  }
60304
+ }
60305
+ finalize() {
60232
60306
  /** Any change to the selection has to be reflected in the selection processor. */
60233
60307
  this.selection.resetDefaultAnchor(this, deepCopy(this.gridSelection.anchor));
60234
60308
  }
@@ -61010,7 +61084,6 @@ stores.inject(MyMetaStore, storeInstance);
61010
61084
  }
61011
61085
  }
61012
61086
  handle(cmd) {
61013
- this.cleanViewports();
61014
61087
  // changing the evaluation can hide/show rows because of data filters
61015
61088
  if (invalidateEvaluationCommands.has(cmd.type)) {
61016
61089
  for (const sheetId of this.getters.getSheetIds()) {
@@ -61026,6 +61099,7 @@ stores.inject(MyMetaStore, storeInstance);
61026
61099
  break;
61027
61100
  case "UNDO":
61028
61101
  case "REDO":
61102
+ this.cleanViewports();
61029
61103
  for (const sheetId of this.getters.getSheetIds()) {
61030
61104
  this.sheetsWithDirtyViewports.add(sheetId);
61031
61105
  }
@@ -61080,6 +61154,9 @@ stores.inject(MyMetaStore, storeInstance);
61080
61154
  }
61081
61155
  }
61082
61156
  break;
61157
+ case "DELETE_SHEET":
61158
+ this.cleanViewports();
61159
+ break;
61083
61160
  case "ACTIVATE_SHEET":
61084
61161
  this.sheetsWithDirtyViewports.add(cmd.sheetIdTo);
61085
61162
  break;
@@ -62367,6 +62444,17 @@ stores.inject(MyMetaStore, storeInstance);
62367
62444
  .o-bottom-bar-fade-in {
62368
62445
  background-image: linear-gradient(90deg, #cfcfcf, transparent 1%);
62369
62446
  }
62447
+
62448
+ .o-sheet-list {
62449
+ overflow-y: hidden;
62450
+ overflow-x: auto;
62451
+
62452
+ &::-webkit-scrollbar {
62453
+ display: none; /* Chrome */
62454
+ }
62455
+ -ms-overflow-style: none; /* IE and Edge */
62456
+ scrollbar-width: none; /* Firefox */
62457
+ }
62370
62458
  }
62371
62459
 
62372
62460
  .o-bottom-bar-arrows {
@@ -64340,7 +64428,7 @@ stores.inject(MyMetaStore, storeInstance);
64340
64428
 
64341
64429
  class LocalTransportService {
64342
64430
  listeners = [];
64343
- sendMessage(message) {
64431
+ async sendMessage(message) {
64344
64432
  for (const { callback } of this.listeners) {
64345
64433
  callback(message);
64346
64434
  }
@@ -66433,17 +66521,13 @@ stores.inject(MyMetaStore, storeInstance);
66433
66521
  if (!formula) {
66434
66522
  return { attrs: [], node: escapeXml `` };
66435
66523
  }
66436
- const attrs = [];
66437
- let node = escapeXml ``;
66438
- let cycle = escapeXml ``;
66439
- const XlsxFormula = adaptFormulaToExcel(formula);
66440
- // hack for cycles : if we don't set a value (be it 0 or #VALUE!), it will appear as invisible on excel,
66441
- // Making it very hard for the client to find where the recursion is.
66442
- if (cell.value === CellErrorType.CircularDependency) {
66443
- attrs.push(["t", "str"]);
66444
- cycle = escapeXml /*xml*/ `<v>${cell.value}</v>`;
66524
+ const type = getCellType(cell.value);
66525
+ if (type === undefined) {
66526
+ return { attrs: [], node: escapeXml `` };
66445
66527
  }
66446
- node = escapeXml /*xml*/ `<f>${XlsxFormula}</f>${cycle}`;
66528
+ const attrs = [["t", type]];
66529
+ const XlsxFormula = adaptFormulaToExcel(formula);
66530
+ const node = escapeXml /*xml*/ `<f>${XlsxFormula}</f><v>${cell.value}</v>`;
66447
66531
  return { attrs, node };
66448
66532
  }
66449
66533
  function addContent(content, sharedStrings, forceString = false) {
@@ -67857,8 +67941,8 @@ stores.inject(MyMetaStore, storeInstance);
67857
67941
  joinSession() {
67858
67942
  this.session.join(this.config.client);
67859
67943
  }
67860
- leaveSession() {
67861
- this.session.leave(lazy(() => this.exportData()));
67944
+ async leaveSession() {
67945
+ await this.session.leave(lazy(() => this.exportData()));
67862
67946
  }
67863
67947
  setupUiPlugin(Plugin) {
67864
67948
  const plugin = new Plugin(this.uiPluginConfig);
@@ -68460,9 +68544,9 @@ stores.inject(MyMetaStore, storeInstance);
68460
68544
  exports.tokenize = tokenize;
68461
68545
 
68462
68546
 
68463
- __info__.version = "17.4.5";
68464
- __info__.date = "2024-08-19T08:12:00.492Z";
68465
- __info__.hash = "28579ad";
68547
+ __info__.version = "17.4.7";
68548
+ __info__.date = "2024-09-05T09:32:00.461Z";
68549
+ __info__.hash = "c14a4c9";
68466
68550
 
68467
68551
 
68468
68552
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);