@odoo/o-spreadsheet 18.1.10 → 18.1.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.1.10
6
- * @date 2025-03-07T10:34:41.861Z
7
- * @hash 31e4526
5
+ * @version 18.1.12
6
+ * @date 2025-03-19T08:23:50.676Z
7
+ * @hash 32f788f
8
8
  */
9
9
 
10
10
  'use strict';
@@ -424,7 +424,6 @@ function escapeRegExp(str) {
424
424
  * Sparse arrays remain sparse.
425
425
  */
426
426
  function deepCopy(obj) {
427
- const result = Array.isArray(obj) ? [] : {};
428
427
  switch (typeof obj) {
429
428
  case "object": {
430
429
  if (obj === null) {
@@ -436,8 +435,18 @@ function deepCopy(obj) {
436
435
  else if (!(isPlainObject(obj) || obj instanceof Array)) {
437
436
  throw new Error("Unsupported type: only objects and arrays are supported");
438
437
  }
439
- for (const key in obj) {
440
- result[key] = deepCopy(obj[key]);
438
+ const result = Array.isArray(obj) ? new Array(obj.length) : {};
439
+ if (Array.isArray(obj)) {
440
+ for (let i = 0, len = obj.length; i < len; i++) {
441
+ if (i in obj) {
442
+ result[i] = deepCopy(obj[i]);
443
+ }
444
+ }
445
+ }
446
+ else {
447
+ for (const key in obj) {
448
+ result[key] = deepCopy(obj[key]);
449
+ }
441
450
  }
442
451
  return result;
443
452
  }
@@ -2690,21 +2699,30 @@ function mergeContiguousZones(zones) {
2690
2699
  return mergedZones;
2691
2700
  }
2692
2701
 
2702
+ const globalReverseLookup$1 = new WeakMap();
2703
+ const globalIdCounter = new WeakMap();
2693
2704
  /**
2694
2705
  * Get the id of the given item (its key in the given dictionary).
2695
2706
  * If the given item does not exist in the dictionary, it creates one with a new id.
2696
2707
  */
2697
2708
  function getItemId(item, itemsDic) {
2698
- for (const key in itemsDic) {
2699
- if (deepEquals(itemsDic[key], item)) {
2700
- return parseInt(key, 10);
2701
- }
2709
+ if (!globalReverseLookup$1.has(itemsDic)) {
2710
+ globalReverseLookup$1.set(itemsDic, new Map());
2711
+ globalIdCounter.set(itemsDic, 0);
2712
+ }
2713
+ const reverseLookup = globalReverseLookup$1.get(itemsDic);
2714
+ const canonical = getCanonicalRepresentation(item);
2715
+ if (reverseLookup.has(canonical)) {
2716
+ const id = reverseLookup.get(canonical);
2717
+ itemsDic[id] = item;
2718
+ return id;
2702
2719
  }
2703
2720
  // Generate new Id if the item didn't exist in the dictionary
2704
- const ids = Object.keys(itemsDic);
2705
- const maxId = ids.length === 0 ? 0 : largeMax(ids.map((id) => parseInt(id, 10)));
2706
- itemsDic[maxId + 1] = item;
2707
- return maxId + 1;
2721
+ const newId = globalIdCounter.get(itemsDic) + 1;
2722
+ reverseLookup.set(canonical, newId);
2723
+ globalIdCounter.set(itemsDic, newId);
2724
+ itemsDic[newId] = item;
2725
+ return newId;
2708
2726
  }
2709
2727
  function groupItemIdsByZones(positionsByItemId) {
2710
2728
  const result = {};
@@ -2728,6 +2746,33 @@ function* iterateItemIdsPositions(sheetId, itemIdsByZones) {
2728
2746
  }
2729
2747
  }
2730
2748
  }
2749
+ function getCanonicalRepresentation(item) {
2750
+ if (item === null)
2751
+ return "null";
2752
+ if (item === undefined)
2753
+ return "undefined";
2754
+ if (typeof item !== "object")
2755
+ return String(item);
2756
+ if (Array.isArray(item)) {
2757
+ const len = item.length;
2758
+ let result = "[";
2759
+ for (let i = 0; i < len; i++) {
2760
+ if (i > 0)
2761
+ result += ",";
2762
+ result += getCanonicalRepresentation(item[i]);
2763
+ }
2764
+ return result + "]";
2765
+ }
2766
+ const keys = Object.keys(item).sort();
2767
+ let repr = "{";
2768
+ for (const key of keys) {
2769
+ if (item[key] !== undefined) {
2770
+ repr += `"${key}":${getCanonicalRepresentation(item[key])},`;
2771
+ }
2772
+ }
2773
+ repr += "}";
2774
+ return repr;
2775
+ }
2731
2776
 
2732
2777
  // -----------------------------------------------------------------------------
2733
2778
  // Date Type
@@ -6233,11 +6278,13 @@ function getDefaultCellHeight(ctx, cell, colSize) {
6233
6278
  if (!cell || (!cell.isFormula && !cell.content)) {
6234
6279
  return DEFAULT_CELL_HEIGHT;
6235
6280
  }
6236
- const maxWidth = cell.style?.wrapping === "wrap" ? colSize - 2 * MIN_CELL_TEXT_MARGIN : undefined;
6237
- const numberOfLines = cell.isFormula
6238
- ? 1
6239
- : splitTextToWidth(ctx, cell.content, cell.style, maxWidth).length;
6240
- const fontSize = computeTextFontSizeInPixels(cell.style);
6281
+ const content = cell.isFormula ? "" : cell.content;
6282
+ return getCellContentHeight(ctx, content, cell.style, colSize);
6283
+ }
6284
+ function getCellContentHeight(ctx, content, style, colSize) {
6285
+ const maxWidth = style?.wrapping === "wrap" ? colSize - 2 * MIN_CELL_TEXT_MARGIN : undefined;
6286
+ const numberOfLines = splitTextToWidth(ctx, content, style, maxWidth).length;
6287
+ const fontSize = computeTextFontSizeInPixels(style);
6241
6288
  return computeTextLinesHeight(fontSize, numberOfLines) + 2 * PADDING_AUTORESIZE_VERTICAL;
6242
6289
  }
6243
6290
  function getDefaultContextFont(fontSize, bold = false, italic = false) {
@@ -8281,7 +8328,8 @@ function isSortedColumnValid(sortedColumn, pivot) {
8281
8328
  const possibleValues = pivot
8282
8329
  .getPossibleFieldValues(columns[i])
8283
8330
  .map((v) => v.value);
8284
- if (!possibleValues.includes(sortedColumn.domain[i].value)) {
8331
+ if (!possibleValues.includes(sortedColumn.domain[i].value) &&
8332
+ !(sortedColumn.domain[i].value === null && possibleValues.includes(""))) {
8285
8333
  return false;
8286
8334
  }
8287
8335
  }
@@ -8432,13 +8480,6 @@ class CellClipboardHandler extends AbstractCellClipboardHandler {
8432
8480
  this.clearClippedZones(content);
8433
8481
  const selection = target[0];
8434
8482
  this.pasteZone(sheetId, selection.left, selection.top, content.cells, options);
8435
- this.dispatch("MOVE_RANGES", {
8436
- target: content.zones,
8437
- sheetId: content.sheetId,
8438
- targetSheetId: sheetId,
8439
- col: selection.left,
8440
- row: selection.top,
8441
- });
8442
8483
  }
8443
8484
  /**
8444
8485
  * Clear the clipped zones: remove the cells and clear the formatting
@@ -8947,14 +8988,15 @@ class MergeClipboardHandler extends AbstractCellClipboardHandler {
8947
8988
  }
8948
8989
  merges.push(mergesInRow);
8949
8990
  }
8950
- return { merges };
8991
+ return { merges, sheetId };
8951
8992
  }
8952
8993
  /**
8953
8994
  * Paste the clipboard content in the given target
8954
8995
  */
8955
8996
  paste(target, content, options) {
8956
8997
  if (options.isCutOperation) {
8957
- return;
8998
+ const copiedMerges = content.merges.flat().filter(isDefined);
8999
+ this.dispatch("REMOVE_MERGE", { sheetId: content.sheetId, target: copiedMerges });
8958
9000
  }
8959
9001
  this.pasteFromCopy(target.sheetId, target.zones, content.merges, options);
8960
9002
  }
@@ -8989,6 +9031,27 @@ class MergeClipboardHandler extends AbstractCellClipboardHandler {
8989
9031
  }
8990
9032
  }
8991
9033
 
9034
+ class ReferenceClipboardHandler extends AbstractCellClipboardHandler {
9035
+ copy(data) {
9036
+ return {
9037
+ zones: data.clippedZones,
9038
+ sheetId: data.sheetId,
9039
+ };
9040
+ }
9041
+ paste(target, content, options) {
9042
+ if (options.isCutOperation) {
9043
+ const selection = target.zones[0];
9044
+ this.dispatch("MOVE_RANGES", {
9045
+ target: content.zones,
9046
+ sheetId: content.sheetId,
9047
+ targetSheetId: target.sheetId,
9048
+ col: selection.left,
9049
+ row: selection.top,
9050
+ });
9051
+ }
9052
+ }
9053
+ }
9054
+
8992
9055
  class SheetClipboardHandler extends AbstractCellClipboardHandler {
8993
9056
  isPasteAllowed(sheetId, target, content, options) {
8994
9057
  if (!("cells" in content)) {
@@ -9152,7 +9215,8 @@ clipboardHandlersRegistries.cellHandlers
9152
9215
  .add("merge", MergeClipboardHandler)
9153
9216
  .add("border", BorderClipboardHandler)
9154
9217
  .add("table", TableClipboardHandler)
9155
- .add("conditionalFormat", ConditionalFormatClipboardHandler);
9218
+ .add("conditionalFormat", ConditionalFormatClipboardHandler)
9219
+ .add("references", ReferenceClipboardHandler);
9156
9220
 
9157
9221
  function transformZone(zone, executed) {
9158
9222
  if (executed.type === "REMOVE_COLUMNS_ROWS") {
@@ -11156,6 +11220,7 @@ class ScorecardChart extends owl.Component {
11156
11220
  const autoCompleteProviders = new Registry();
11157
11221
 
11158
11222
  autoCompleteProviders.add("dataValidation", {
11223
+ displayAllOnInitialContent: true,
11159
11224
  getProposals(tokenAtCursor, content) {
11160
11225
  if (content.startsWith("=")) {
11161
11226
  return [];
@@ -20948,8 +21013,8 @@ class AbstractComposerStore extends SpreadsheetStore {
20948
21013
  this.computeParenthesisRelatedToCursor();
20949
21014
  }
20950
21015
  cancelEdition() {
20951
- this.cancelEditionAndActivateSheet();
20952
21016
  this.resetContent();
21017
+ this.cancelEditionAndActivateSheet();
20953
21018
  }
20954
21019
  setCurrentContent(content, selection) {
20955
21020
  if (selection && !this.isSelectionValid(content.length, selection.start, selection.end)) {
@@ -20967,8 +21032,8 @@ class AbstractComposerStore extends SpreadsheetStore {
20967
21032
  switch (cmd.type) {
20968
21033
  case "SELECT_FIGURE":
20969
21034
  if (cmd.id) {
20970
- this.cancelEditionAndActivateSheet();
20971
21035
  this.resetContent();
21036
+ this.cancelEditionAndActivateSheet();
20972
21037
  }
20973
21038
  break;
20974
21039
  case "START_CHANGE_HIGHLIGHT":
@@ -21452,6 +21517,15 @@ class AbstractComposerStore extends SpreadsheetStore {
21452
21517
  const exactMatch = proposals?.find((p) => p.text === tokenAtCursor.value);
21453
21518
  // remove tokens that are likely to be other parts of the formula that slipped in the token if it's a string
21454
21519
  const searchTerm = tokenAtCursor.value.replace(/[ ,\(\)]/g, "");
21520
+ if (this._currentContent === this.initialContent &&
21521
+ provider.displayAllOnInitialContent &&
21522
+ proposals?.length) {
21523
+ return {
21524
+ proposals,
21525
+ selectProposal: provider.selectProposal,
21526
+ autoSelectFirstProposal: provider.autoSelectFirstProposal ?? false,
21527
+ };
21528
+ }
21455
21529
  if (exactMatch && this._currentContent !== this.initialContent) {
21456
21530
  // this means the user has chosen a proposal
21457
21531
  return;
@@ -22275,7 +22349,7 @@ autoCompleteProviders.add("pivot_group_values", {
22275
22349
  text,
22276
22350
  description: usedLabel,
22277
22351
  htmlContent: [{ value: text, color }],
22278
- fuzzySearchKey: value + usedLabel,
22352
+ fuzzySearchKey: text + usedLabel,
22279
22353
  };
22280
22354
  });
22281
22355
  },
@@ -24337,16 +24411,25 @@ function addRelsToFile(relsFiles, path, rel) {
24337
24411
  }
24338
24412
  return id;
24339
24413
  }
24414
+ const globalReverseLookup = new WeakMap();
24340
24415
  function pushElement(property, propertyList) {
24341
- let len = propertyList.length;
24342
- const operator = typeof property === "object" ? deepEquals : (a, b) => a === b;
24343
- for (let i = 0; i < len; i++) {
24344
- if (operator(property, propertyList[i])) {
24345
- return i;
24416
+ let reverseLookup = globalReverseLookup.get(propertyList);
24417
+ if (!reverseLookup) {
24418
+ reverseLookup = new Map();
24419
+ for (let i = 0; i < propertyList.length; i++) {
24420
+ const canonical = getCanonicalRepresentation(propertyList[i]);
24421
+ reverseLookup.set(canonical, i);
24346
24422
  }
24423
+ globalReverseLookup.set(propertyList, reverseLookup);
24424
+ }
24425
+ const canonical = getCanonicalRepresentation(property);
24426
+ if (reverseLookup.has(canonical)) {
24427
+ return reverseLookup.get(canonical);
24347
24428
  }
24348
- propertyList[propertyList.length] = property;
24349
- return propertyList.length - 1;
24429
+ const maxId = propertyList.length;
24430
+ propertyList.push(property);
24431
+ reverseLookup.set(canonical, maxId);
24432
+ return maxId;
24350
24433
  }
24351
24434
  const chartIds = [];
24352
24435
  /**
@@ -26193,7 +26276,7 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
26193
26276
  title: { text: chartTitle },
26194
26277
  type: CHART_TYPE_CONVERSION_MAP[chartType],
26195
26278
  dataSets: this.extractChartDatasets(this.querySelectorAll(rootChartElement, `c:${chartType}`), chartType),
26196
- labelRange: this.extractChildTextContent(rootChartElement, `c:ser ${chartType === "scatterChart" ? "c:numRef" : "c:cat"} c:f`),
26279
+ labelRange: this.extractLabelRange(chartType, rootChartElement),
26197
26280
  backgroundColor: this.extractChildAttr(rootChartElement, "c:chartSpace > c:spPr a:srgbClr", "val", {
26198
26281
  default: "ffffff",
26199
26282
  }).asString(),
@@ -26205,6 +26288,13 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
26205
26288
  };
26206
26289
  })[0];
26207
26290
  }
26291
+ extractLabelRange(chartType, rootChartElement) {
26292
+ if (chartType === "scatterChart") {
26293
+ return (this.extractChildTextContent(rootChartElement, `c:ser c:strRef c:f`) ||
26294
+ this.extractChildTextContent(rootChartElement, `c:ser c:numRef c:f`));
26295
+ }
26296
+ return this.extractChildTextContent(rootChartElement, `c:ser c:cat c:f`);
26297
+ }
26208
26298
  extractComboChart(chartElement) {
26209
26299
  // Title can be separated into multiple xml elements (for styling and such), we only import the text
26210
26300
  const chartTitle = this.mapOnElements({ parent: chartElement, query: "c:title a:t" }, (textElement) => {
@@ -36206,6 +36296,7 @@ const irregularityMap = {
36206
36296
  fingerprintStore.enable();
36207
36297
  }
36208
36298
  },
36299
+ isReadonlyAllowed: true,
36209
36300
  icon: "o-spreadsheet-Icon.IRREGULARITY_MAP",
36210
36301
  };
36211
36302
  const viewFormulas = {
@@ -46765,6 +46856,7 @@ class RemoveDuplicatesPanel extends owl.Component {
46765
46856
  columns: {},
46766
46857
  });
46767
46858
  setup() {
46859
+ this.updateColumns();
46768
46860
  owl.onWillUpdateProps(() => this.updateColumns());
46769
46861
  }
46770
46862
  toggleHasHeader() {
@@ -48552,8 +48644,8 @@ class CellComposerStore extends AbstractComposerStore {
48552
48644
  const sheetIdExists = !!this.getters.tryGetSheet(this.sheetId);
48553
48645
  if (!sheetIdExists && this.editionMode !== "inactive") {
48554
48646
  this.sheetId = this.getters.getActiveSheetId();
48555
- this.cancelEditionAndActivateSheet();
48556
48647
  this.resetContent();
48648
+ this.cancelEditionAndActivateSheet();
48557
48649
  this.notificationStore.raiseError(CELL_DELETED_MESSAGE);
48558
48650
  }
48559
48651
  break;
@@ -50411,6 +50503,9 @@ class ColResizer extends AbstractResizer {
50411
50503
  this.MAX_SIZE_MARGIN = 90;
50412
50504
  this.MIN_ELEMENT_SIZE = MIN_COL_WIDTH;
50413
50505
  }
50506
+ get sheetId() {
50507
+ return this.env.model.getters.getActiveSheetId();
50508
+ }
50414
50509
  _getEvOffset(ev) {
50415
50510
  return ev.offsetX;
50416
50511
  }
@@ -50433,10 +50528,10 @@ class ColResizer extends AbstractResizer {
50433
50528
  return this.env.model.getters.getEdgeScrollCol(position, position, position);
50434
50529
  }
50435
50530
  _getDimensionsInViewport(index) {
50436
- return this.env.model.getters.getColDimensionsInViewport(this.env.model.getters.getActiveSheetId(), index);
50531
+ return this.env.model.getters.getColDimensionsInViewport(this.sheetId, index);
50437
50532
  }
50438
50533
  _getElementSize(index) {
50439
- return this.env.model.getters.getColSize(this.env.model.getters.getActiveSheetId(), index);
50534
+ return this.env.model.getters.getColSize(this.sheetId, index);
50440
50535
  }
50441
50536
  _getMaxSize() {
50442
50537
  return this.colResizerRef.el.clientWidth;
@@ -50447,7 +50542,7 @@ class ColResizer extends AbstractResizer {
50447
50542
  const cols = this.env.model.getters.getActiveCols();
50448
50543
  this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
50449
50544
  dimension: "COL",
50450
- sheetId: this.env.model.getters.getActiveSheetId(),
50545
+ sheetId: this.sheetId,
50451
50546
  elements: cols.has(index) ? [...cols] : [index],
50452
50547
  size,
50453
50548
  });
@@ -50460,7 +50555,7 @@ class ColResizer extends AbstractResizer {
50460
50555
  elements.push(colIndex);
50461
50556
  }
50462
50557
  const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
50463
- sheetId: this.env.model.getters.getActiveSheetId(),
50558
+ sheetId: this.sheetId,
50464
50559
  dimension: "COL",
50465
50560
  base: this.state.base,
50466
50561
  elements,
@@ -50479,7 +50574,7 @@ class ColResizer extends AbstractResizer {
50479
50574
  _fitElementSize(index) {
50480
50575
  const cols = this.env.model.getters.getActiveCols();
50481
50576
  this.env.model.dispatch("AUTORESIZE_COLUMNS", {
50482
- sheetId: this.env.model.getters.getActiveSheetId(),
50577
+ sheetId: this.sheetId,
50483
50578
  cols: cols.has(index) ? [...cols] : [index],
50484
50579
  });
50485
50580
  }
@@ -50490,7 +50585,7 @@ class ColResizer extends AbstractResizer {
50490
50585
  return this.env.model.getters.getActiveCols();
50491
50586
  }
50492
50587
  _getPreviousVisibleElement(index) {
50493
- const sheetId = this.env.model.getters.getActiveSheetId();
50588
+ const sheetId = this.sheetId;
50494
50589
  let row;
50495
50590
  for (row = index - 1; row >= 0; row--) {
50496
50591
  if (!this.env.model.getters.isColHidden(sheetId, row)) {
@@ -50501,7 +50596,7 @@ class ColResizer extends AbstractResizer {
50501
50596
  }
50502
50597
  unhide(hiddenElements) {
50503
50598
  this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50504
- sheetId: this.env.model.getters.getActiveSheetId(),
50599
+ sheetId: this.sheetId,
50505
50600
  elements: hiddenElements,
50506
50601
  dimension: "COL",
50507
50602
  });
@@ -50517,7 +50612,7 @@ css /* scss */ `
50517
50612
  left: 0;
50518
50613
  right: 0;
50519
50614
  width: ${HEADER_WIDTH}px;
50520
- height: 100%;
50615
+ height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
50521
50616
  &.o-dragging {
50522
50617
  cursor: grabbing;
50523
50618
  }
@@ -50575,6 +50670,9 @@ class RowResizer extends AbstractResizer {
50575
50670
  this.MIN_ELEMENT_SIZE = MIN_ROW_HEIGHT;
50576
50671
  }
50577
50672
  rowResizerRef;
50673
+ get sheetId() {
50674
+ return this.env.model.getters.getActiveSheetId();
50675
+ }
50578
50676
  _getEvOffset(ev) {
50579
50677
  return ev.offsetY;
50580
50678
  }
@@ -50597,10 +50695,10 @@ class RowResizer extends AbstractResizer {
50597
50695
  return this.env.model.getters.getEdgeScrollRow(position, position, position);
50598
50696
  }
50599
50697
  _getDimensionsInViewport(index) {
50600
- return this.env.model.getters.getRowDimensionsInViewport(this.env.model.getters.getActiveSheetId(), index);
50698
+ return this.env.model.getters.getRowDimensionsInViewport(this.sheetId, index);
50601
50699
  }
50602
50700
  _getElementSize(index) {
50603
- return this.env.model.getters.getRowSize(this.env.model.getters.getActiveSheetId(), index);
50701
+ return this.env.model.getters.getRowSize(this.sheetId, index);
50604
50702
  }
50605
50703
  _getMaxSize() {
50606
50704
  return this.rowResizerRef.el.clientHeight;
@@ -50611,7 +50709,7 @@ class RowResizer extends AbstractResizer {
50611
50709
  const rows = this.env.model.getters.getActiveRows();
50612
50710
  this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
50613
50711
  dimension: "ROW",
50614
- sheetId: this.env.model.getters.getActiveSheetId(),
50712
+ sheetId: this.sheetId,
50615
50713
  elements: rows.has(index) ? [...rows] : [index],
50616
50714
  size,
50617
50715
  });
@@ -50624,7 +50722,7 @@ class RowResizer extends AbstractResizer {
50624
50722
  elements.push(rowIndex);
50625
50723
  }
50626
50724
  const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
50627
- sheetId: this.env.model.getters.getActiveSheetId(),
50725
+ sheetId: this.sheetId,
50628
50726
  dimension: "ROW",
50629
50727
  base: this.state.base,
50630
50728
  elements,
@@ -50643,7 +50741,7 @@ class RowResizer extends AbstractResizer {
50643
50741
  _fitElementSize(index) {
50644
50742
  const rows = this.env.model.getters.getActiveRows();
50645
50743
  this.env.model.dispatch("AUTORESIZE_ROWS", {
50646
- sheetId: this.env.model.getters.getActiveSheetId(),
50744
+ sheetId: this.sheetId,
50647
50745
  rows: rows.has(index) ? [...rows] : [index],
50648
50746
  });
50649
50747
  }
@@ -50654,7 +50752,7 @@ class RowResizer extends AbstractResizer {
50654
50752
  return this.env.model.getters.getActiveRows();
50655
50753
  }
50656
50754
  _getPreviousVisibleElement(index) {
50657
- const sheetId = this.env.model.getters.getActiveSheetId();
50755
+ const sheetId = this.sheetId;
50658
50756
  let row;
50659
50757
  for (row = index - 1; row >= 0; row--) {
50660
50758
  if (!this.env.model.getters.isRowHidden(sheetId, row)) {
@@ -50665,7 +50763,7 @@ class RowResizer extends AbstractResizer {
50665
50763
  }
50666
50764
  unhide(hiddenElements) {
50667
50765
  this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50668
- sheetId: this.env.model.getters.getActiveSheetId(),
50766
+ sheetId: this.sheetId,
50669
50767
  dimension: "ROW",
50670
50768
  elements: hiddenElements,
50671
50769
  });
@@ -64834,12 +64932,7 @@ class SheetUIPlugin extends UIPlugin {
64834
64932
  }
64835
64933
  break;
64836
64934
  case "AUTORESIZE_ROWS":
64837
- this.dispatch("RESIZE_COLUMNS_ROWS", {
64838
- elements: cmd.rows,
64839
- dimension: "ROW",
64840
- size: null,
64841
- sheetId: cmd.sheetId,
64842
- });
64935
+ this.autoResizeRows(cmd.sheetId, cmd.rows);
64843
64936
  break;
64844
64937
  }
64845
64938
  }
@@ -65003,6 +65096,48 @@ class SheetUIPlugin extends UIPlugin {
65003
65096
  }
65004
65097
  return "Success" /* CommandResult.Success */;
65005
65098
  }
65099
+ autoResizeRows(sheetId, rows) {
65100
+ const rowSizes = [];
65101
+ for (const row of rows) {
65102
+ let evaluatedRowSize = 0;
65103
+ for (const cellId of this.getters.getRowCells(sheetId, row)) {
65104
+ const cell = this.getters.getCellById(cellId);
65105
+ if (!cell) {
65106
+ continue;
65107
+ }
65108
+ const position = this.getters.getCellPosition(cell.id);
65109
+ const colSize = this.getters.getColSize(sheetId, position.col);
65110
+ if (cell.isFormula) {
65111
+ const content = this.getters.getEvaluatedCell(position).formattedValue;
65112
+ const evaluatedSize = getCellContentHeight(this.ctx, content, cell?.style, colSize);
65113
+ if (evaluatedSize > evaluatedRowSize && evaluatedSize > DEFAULT_CELL_HEIGHT) {
65114
+ evaluatedRowSize = evaluatedSize;
65115
+ }
65116
+ }
65117
+ else {
65118
+ const content = cell.content;
65119
+ const dynamicRowSize = getCellContentHeight(this.ctx, content, cell?.style, colSize);
65120
+ // Only keep the size of evaluated cells if it's bigger than the dynamic row size
65121
+ if (dynamicRowSize >= evaluatedRowSize && dynamicRowSize > DEFAULT_CELL_HEIGHT) {
65122
+ evaluatedRowSize = 0;
65123
+ }
65124
+ }
65125
+ }
65126
+ rowSizes.push(evaluatedRowSize || null);
65127
+ }
65128
+ const groupedSizes = new Map(rowSizes.map((size) => [size, []]));
65129
+ for (let i = 0; i < rowSizes.length; i++) {
65130
+ groupedSizes.get(rowSizes[i])?.push(rows[i]);
65131
+ }
65132
+ for (const [size, rows] of groupedSizes) {
65133
+ this.dispatch("RESIZE_COLUMNS_ROWS", {
65134
+ elements: rows,
65135
+ dimension: "ROW",
65136
+ size,
65137
+ sheetId,
65138
+ });
65139
+ }
65140
+ }
65006
65141
  }
65007
65142
 
65008
65143
  class TableComputedStylePlugin extends UIPlugin {
@@ -67904,7 +68039,8 @@ class SheetViewPlugin extends UIPlugin {
67904
68039
  ? this.getters.getSheetViewVisibleCols()
67905
68040
  : this.getters.getSheetViewVisibleRows();
67906
68041
  const startIndex = visibleHeaders.findIndex((header) => referenceHeaderIndex >= header);
67907
- const endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
68042
+ let endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
68043
+ endIndex = endIndex === -1 ? visibleHeaders.length : endIndex;
67908
68044
  const relevantIndexes = visibleHeaders.slice(startIndex, endIndex);
67909
68045
  let offset = 0;
67910
68046
  for (const i of relevantIndexes) {
@@ -74011,7 +74147,7 @@ function addStyles(styles) {
74011
74147
  }
74012
74148
  if (alignAttrs.length > 0) {
74013
74149
  attributes.push(["applyAlignment", "1"]); // for Libre Office
74014
- styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}>${escapeXml /*xml*/ `<alignment ${formatAttributes(alignAttrs)} />`}</xf> `);
74150
+ styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}><alignment ${formatAttributes(alignAttrs)} /></xf> `);
74015
74151
  }
74016
74152
  else {
74017
74153
  styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)} />`);
@@ -74179,6 +74315,9 @@ function addColumns(cols) {
74179
74315
  }
74180
74316
  function addRows(construct, data, sheet) {
74181
74317
  const rowNodes = [];
74318
+ const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
74319
+ const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
74320
+ const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
74182
74321
  for (let r = 0; r < sheet.rowNumber; r++) {
74183
74322
  const rowAttrs = [["r", r + 1]];
74184
74323
  const row = sheet.rows[r] || {};
@@ -74194,9 +74333,6 @@ function addRows(construct, data, sheet) {
74194
74333
  if (row.collapsed) {
74195
74334
  rowAttrs.push(["collapsed", 1]);
74196
74335
  }
74197
- const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
74198
- const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
74199
- const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
74200
74336
  const cellNodes = [];
74201
74337
  for (let c = 0; c < sheet.colNumber; c++) {
74202
74338
  const xc = toXC(c, r);
@@ -75468,6 +75604,6 @@ exports.tokenColors = tokenColors;
75468
75604
  exports.tokenize = tokenize;
75469
75605
 
75470
75606
 
75471
- __info__.version = "18.1.10";
75472
- __info__.date = "2025-03-07T10:34:41.861Z";
75473
- __info__.hash = "31e4526";
75607
+ __info__.version = "18.1.12";
75608
+ __info__.date = "2025-03-19T08:23:50.676Z";
75609
+ __info__.hash = "32f788f";
@@ -5732,6 +5732,7 @@ declare class SheetUIPlugin extends UIPlugin {
5732
5732
  * not outside the sheet.
5733
5733
  */
5734
5734
  private checkZonesAreInSheet;
5735
+ private autoResizeRows;
5735
5736
  }
5736
5737
 
5737
5738
  declare class CellComputedStylePlugin extends UIPlugin {
@@ -8493,11 +8494,12 @@ interface ComposerStoreInterface {
8493
8494
  * We declare the providers in the registry as an object (rather than a class)
8494
8495
  * to allow a type-safe way to declare the provider.
8495
8496
  * We still want to be able to use `this` for the getters and dispatch for simplicity.
8496
- * Binding happens at runtime in the edition plugin.
8497
+ * Binding happens at runtime in the composer store.
8497
8498
  */
8498
8499
  interface AutoCompleteProviderDefinition {
8499
8500
  sequence?: number;
8500
8501
  autoSelectFirstProposal?: boolean;
8502
+ displayAllOnInitialContent?: boolean;
8501
8503
  maxDisplayedProposals?: number;
8502
8504
  getProposals(this: {
8503
8505
  composer: ComposerStoreInterface;
@@ -9219,6 +9221,7 @@ declare class ColResizer extends AbstractResizer {
9219
9221
  static template: string;
9220
9222
  private colResizerRef;
9221
9223
  setup(): void;
9224
+ get sheetId(): UID;
9222
9225
  _getEvOffset(ev: MouseEvent): Pixel;
9223
9226
  _getViewportOffset(): Pixel;
9224
9227
  _getClientPosition(ev: MouseEvent): Pixel;
@@ -9247,6 +9250,7 @@ declare class RowResizer extends AbstractResizer {
9247
9250
  static template: string;
9248
9251
  setup(): void;
9249
9252
  private rowResizerRef;
9253
+ get sheetId(): UID;
9250
9254
  _getEvOffset(ev: MouseEvent): Pixel;
9251
9255
  _getViewportOffset(): Pixel;
9252
9256
  _getClientPosition(ev: MouseEvent): Pixel;