@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
  import { useEnv, useSubEnv, onWillUnmount, useComponent, status, Component, useRef, onMounted, useEffect, useState, onPatched, onWillPatch, onWillUpdateProps, useExternalListener, onWillStart, xml, useChildSubEnv, markRaw, toRaw } from '@odoo/owl';
@@ -422,7 +422,6 @@ function escapeRegExp(str) {
422
422
  * Sparse arrays remain sparse.
423
423
  */
424
424
  function deepCopy(obj) {
425
- const result = Array.isArray(obj) ? [] : {};
426
425
  switch (typeof obj) {
427
426
  case "object": {
428
427
  if (obj === null) {
@@ -434,8 +433,18 @@ function deepCopy(obj) {
434
433
  else if (!(isPlainObject(obj) || obj instanceof Array)) {
435
434
  throw new Error("Unsupported type: only objects and arrays are supported");
436
435
  }
437
- for (const key in obj) {
438
- result[key] = deepCopy(obj[key]);
436
+ const result = Array.isArray(obj) ? new Array(obj.length) : {};
437
+ if (Array.isArray(obj)) {
438
+ for (let i = 0, len = obj.length; i < len; i++) {
439
+ if (i in obj) {
440
+ result[i] = deepCopy(obj[i]);
441
+ }
442
+ }
443
+ }
444
+ else {
445
+ for (const key in obj) {
446
+ result[key] = deepCopy(obj[key]);
447
+ }
439
448
  }
440
449
  return result;
441
450
  }
@@ -2688,21 +2697,30 @@ function mergeContiguousZones(zones) {
2688
2697
  return mergedZones;
2689
2698
  }
2690
2699
 
2700
+ const globalReverseLookup$1 = new WeakMap();
2701
+ const globalIdCounter = new WeakMap();
2691
2702
  /**
2692
2703
  * Get the id of the given item (its key in the given dictionary).
2693
2704
  * If the given item does not exist in the dictionary, it creates one with a new id.
2694
2705
  */
2695
2706
  function getItemId(item, itemsDic) {
2696
- for (const key in itemsDic) {
2697
- if (deepEquals(itemsDic[key], item)) {
2698
- return parseInt(key, 10);
2699
- }
2707
+ if (!globalReverseLookup$1.has(itemsDic)) {
2708
+ globalReverseLookup$1.set(itemsDic, new Map());
2709
+ globalIdCounter.set(itemsDic, 0);
2710
+ }
2711
+ const reverseLookup = globalReverseLookup$1.get(itemsDic);
2712
+ const canonical = getCanonicalRepresentation(item);
2713
+ if (reverseLookup.has(canonical)) {
2714
+ const id = reverseLookup.get(canonical);
2715
+ itemsDic[id] = item;
2716
+ return id;
2700
2717
  }
2701
2718
  // Generate new Id if the item didn't exist in the dictionary
2702
- const ids = Object.keys(itemsDic);
2703
- const maxId = ids.length === 0 ? 0 : largeMax(ids.map((id) => parseInt(id, 10)));
2704
- itemsDic[maxId + 1] = item;
2705
- return maxId + 1;
2719
+ const newId = globalIdCounter.get(itemsDic) + 1;
2720
+ reverseLookup.set(canonical, newId);
2721
+ globalIdCounter.set(itemsDic, newId);
2722
+ itemsDic[newId] = item;
2723
+ return newId;
2706
2724
  }
2707
2725
  function groupItemIdsByZones(positionsByItemId) {
2708
2726
  const result = {};
@@ -2726,6 +2744,33 @@ function* iterateItemIdsPositions(sheetId, itemIdsByZones) {
2726
2744
  }
2727
2745
  }
2728
2746
  }
2747
+ function getCanonicalRepresentation(item) {
2748
+ if (item === null)
2749
+ return "null";
2750
+ if (item === undefined)
2751
+ return "undefined";
2752
+ if (typeof item !== "object")
2753
+ return String(item);
2754
+ if (Array.isArray(item)) {
2755
+ const len = item.length;
2756
+ let result = "[";
2757
+ for (let i = 0; i < len; i++) {
2758
+ if (i > 0)
2759
+ result += ",";
2760
+ result += getCanonicalRepresentation(item[i]);
2761
+ }
2762
+ return result + "]";
2763
+ }
2764
+ const keys = Object.keys(item).sort();
2765
+ let repr = "{";
2766
+ for (const key of keys) {
2767
+ if (item[key] !== undefined) {
2768
+ repr += `"${key}":${getCanonicalRepresentation(item[key])},`;
2769
+ }
2770
+ }
2771
+ repr += "}";
2772
+ return repr;
2773
+ }
2729
2774
 
2730
2775
  // -----------------------------------------------------------------------------
2731
2776
  // Date Type
@@ -6231,11 +6276,13 @@ function getDefaultCellHeight(ctx, cell, colSize) {
6231
6276
  if (!cell || (!cell.isFormula && !cell.content)) {
6232
6277
  return DEFAULT_CELL_HEIGHT;
6233
6278
  }
6234
- const maxWidth = cell.style?.wrapping === "wrap" ? colSize - 2 * MIN_CELL_TEXT_MARGIN : undefined;
6235
- const numberOfLines = cell.isFormula
6236
- ? 1
6237
- : splitTextToWidth(ctx, cell.content, cell.style, maxWidth).length;
6238
- const fontSize = computeTextFontSizeInPixels(cell.style);
6279
+ const content = cell.isFormula ? "" : cell.content;
6280
+ return getCellContentHeight(ctx, content, cell.style, colSize);
6281
+ }
6282
+ function getCellContentHeight(ctx, content, style, colSize) {
6283
+ const maxWidth = style?.wrapping === "wrap" ? colSize - 2 * MIN_CELL_TEXT_MARGIN : undefined;
6284
+ const numberOfLines = splitTextToWidth(ctx, content, style, maxWidth).length;
6285
+ const fontSize = computeTextFontSizeInPixels(style);
6239
6286
  return computeTextLinesHeight(fontSize, numberOfLines) + 2 * PADDING_AUTORESIZE_VERTICAL;
6240
6287
  }
6241
6288
  function getDefaultContextFont(fontSize, bold = false, italic = false) {
@@ -8279,7 +8326,8 @@ function isSortedColumnValid(sortedColumn, pivot) {
8279
8326
  const possibleValues = pivot
8280
8327
  .getPossibleFieldValues(columns[i])
8281
8328
  .map((v) => v.value);
8282
- if (!possibleValues.includes(sortedColumn.domain[i].value)) {
8329
+ if (!possibleValues.includes(sortedColumn.domain[i].value) &&
8330
+ !(sortedColumn.domain[i].value === null && possibleValues.includes(""))) {
8283
8331
  return false;
8284
8332
  }
8285
8333
  }
@@ -8430,13 +8478,6 @@ class CellClipboardHandler extends AbstractCellClipboardHandler {
8430
8478
  this.clearClippedZones(content);
8431
8479
  const selection = target[0];
8432
8480
  this.pasteZone(sheetId, selection.left, selection.top, content.cells, options);
8433
- this.dispatch("MOVE_RANGES", {
8434
- target: content.zones,
8435
- sheetId: content.sheetId,
8436
- targetSheetId: sheetId,
8437
- col: selection.left,
8438
- row: selection.top,
8439
- });
8440
8481
  }
8441
8482
  /**
8442
8483
  * Clear the clipped zones: remove the cells and clear the formatting
@@ -8945,14 +8986,15 @@ class MergeClipboardHandler extends AbstractCellClipboardHandler {
8945
8986
  }
8946
8987
  merges.push(mergesInRow);
8947
8988
  }
8948
- return { merges };
8989
+ return { merges, sheetId };
8949
8990
  }
8950
8991
  /**
8951
8992
  * Paste the clipboard content in the given target
8952
8993
  */
8953
8994
  paste(target, content, options) {
8954
8995
  if (options.isCutOperation) {
8955
- return;
8996
+ const copiedMerges = content.merges.flat().filter(isDefined);
8997
+ this.dispatch("REMOVE_MERGE", { sheetId: content.sheetId, target: copiedMerges });
8956
8998
  }
8957
8999
  this.pasteFromCopy(target.sheetId, target.zones, content.merges, options);
8958
9000
  }
@@ -8987,6 +9029,27 @@ class MergeClipboardHandler extends AbstractCellClipboardHandler {
8987
9029
  }
8988
9030
  }
8989
9031
 
9032
+ class ReferenceClipboardHandler extends AbstractCellClipboardHandler {
9033
+ copy(data) {
9034
+ return {
9035
+ zones: data.clippedZones,
9036
+ sheetId: data.sheetId,
9037
+ };
9038
+ }
9039
+ paste(target, content, options) {
9040
+ if (options.isCutOperation) {
9041
+ const selection = target.zones[0];
9042
+ this.dispatch("MOVE_RANGES", {
9043
+ target: content.zones,
9044
+ sheetId: content.sheetId,
9045
+ targetSheetId: target.sheetId,
9046
+ col: selection.left,
9047
+ row: selection.top,
9048
+ });
9049
+ }
9050
+ }
9051
+ }
9052
+
8990
9053
  class SheetClipboardHandler extends AbstractCellClipboardHandler {
8991
9054
  isPasteAllowed(sheetId, target, content, options) {
8992
9055
  if (!("cells" in content)) {
@@ -9150,7 +9213,8 @@ clipboardHandlersRegistries.cellHandlers
9150
9213
  .add("merge", MergeClipboardHandler)
9151
9214
  .add("border", BorderClipboardHandler)
9152
9215
  .add("table", TableClipboardHandler)
9153
- .add("conditionalFormat", ConditionalFormatClipboardHandler);
9216
+ .add("conditionalFormat", ConditionalFormatClipboardHandler)
9217
+ .add("references", ReferenceClipboardHandler);
9154
9218
 
9155
9219
  function transformZone(zone, executed) {
9156
9220
  if (executed.type === "REMOVE_COLUMNS_ROWS") {
@@ -11154,6 +11218,7 @@ class ScorecardChart extends Component {
11154
11218
  const autoCompleteProviders = new Registry();
11155
11219
 
11156
11220
  autoCompleteProviders.add("dataValidation", {
11221
+ displayAllOnInitialContent: true,
11157
11222
  getProposals(tokenAtCursor, content) {
11158
11223
  if (content.startsWith("=")) {
11159
11224
  return [];
@@ -20946,8 +21011,8 @@ class AbstractComposerStore extends SpreadsheetStore {
20946
21011
  this.computeParenthesisRelatedToCursor();
20947
21012
  }
20948
21013
  cancelEdition() {
20949
- this.cancelEditionAndActivateSheet();
20950
21014
  this.resetContent();
21015
+ this.cancelEditionAndActivateSheet();
20951
21016
  }
20952
21017
  setCurrentContent(content, selection) {
20953
21018
  if (selection && !this.isSelectionValid(content.length, selection.start, selection.end)) {
@@ -20965,8 +21030,8 @@ class AbstractComposerStore extends SpreadsheetStore {
20965
21030
  switch (cmd.type) {
20966
21031
  case "SELECT_FIGURE":
20967
21032
  if (cmd.id) {
20968
- this.cancelEditionAndActivateSheet();
20969
21033
  this.resetContent();
21034
+ this.cancelEditionAndActivateSheet();
20970
21035
  }
20971
21036
  break;
20972
21037
  case "START_CHANGE_HIGHLIGHT":
@@ -21450,6 +21515,15 @@ class AbstractComposerStore extends SpreadsheetStore {
21450
21515
  const exactMatch = proposals?.find((p) => p.text === tokenAtCursor.value);
21451
21516
  // remove tokens that are likely to be other parts of the formula that slipped in the token if it's a string
21452
21517
  const searchTerm = tokenAtCursor.value.replace(/[ ,\(\)]/g, "");
21518
+ if (this._currentContent === this.initialContent &&
21519
+ provider.displayAllOnInitialContent &&
21520
+ proposals?.length) {
21521
+ return {
21522
+ proposals,
21523
+ selectProposal: provider.selectProposal,
21524
+ autoSelectFirstProposal: provider.autoSelectFirstProposal ?? false,
21525
+ };
21526
+ }
21453
21527
  if (exactMatch && this._currentContent !== this.initialContent) {
21454
21528
  // this means the user has chosen a proposal
21455
21529
  return;
@@ -22273,7 +22347,7 @@ autoCompleteProviders.add("pivot_group_values", {
22273
22347
  text,
22274
22348
  description: usedLabel,
22275
22349
  htmlContent: [{ value: text, color }],
22276
- fuzzySearchKey: value + usedLabel,
22350
+ fuzzySearchKey: text + usedLabel,
22277
22351
  };
22278
22352
  });
22279
22353
  },
@@ -24335,16 +24409,25 @@ function addRelsToFile(relsFiles, path, rel) {
24335
24409
  }
24336
24410
  return id;
24337
24411
  }
24412
+ const globalReverseLookup = new WeakMap();
24338
24413
  function pushElement(property, propertyList) {
24339
- let len = propertyList.length;
24340
- const operator = typeof property === "object" ? deepEquals : (a, b) => a === b;
24341
- for (let i = 0; i < len; i++) {
24342
- if (operator(property, propertyList[i])) {
24343
- return i;
24414
+ let reverseLookup = globalReverseLookup.get(propertyList);
24415
+ if (!reverseLookup) {
24416
+ reverseLookup = new Map();
24417
+ for (let i = 0; i < propertyList.length; i++) {
24418
+ const canonical = getCanonicalRepresentation(propertyList[i]);
24419
+ reverseLookup.set(canonical, i);
24344
24420
  }
24421
+ globalReverseLookup.set(propertyList, reverseLookup);
24422
+ }
24423
+ const canonical = getCanonicalRepresentation(property);
24424
+ if (reverseLookup.has(canonical)) {
24425
+ return reverseLookup.get(canonical);
24345
24426
  }
24346
- propertyList[propertyList.length] = property;
24347
- return propertyList.length - 1;
24427
+ const maxId = propertyList.length;
24428
+ propertyList.push(property);
24429
+ reverseLookup.set(canonical, maxId);
24430
+ return maxId;
24348
24431
  }
24349
24432
  const chartIds = [];
24350
24433
  /**
@@ -26191,7 +26274,7 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
26191
26274
  title: { text: chartTitle },
26192
26275
  type: CHART_TYPE_CONVERSION_MAP[chartType],
26193
26276
  dataSets: this.extractChartDatasets(this.querySelectorAll(rootChartElement, `c:${chartType}`), chartType),
26194
- labelRange: this.extractChildTextContent(rootChartElement, `c:ser ${chartType === "scatterChart" ? "c:numRef" : "c:cat"} c:f`),
26277
+ labelRange: this.extractLabelRange(chartType, rootChartElement),
26195
26278
  backgroundColor: this.extractChildAttr(rootChartElement, "c:chartSpace > c:spPr a:srgbClr", "val", {
26196
26279
  default: "ffffff",
26197
26280
  }).asString(),
@@ -26203,6 +26286,13 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
26203
26286
  };
26204
26287
  })[0];
26205
26288
  }
26289
+ extractLabelRange(chartType, rootChartElement) {
26290
+ if (chartType === "scatterChart") {
26291
+ return (this.extractChildTextContent(rootChartElement, `c:ser c:strRef c:f`) ||
26292
+ this.extractChildTextContent(rootChartElement, `c:ser c:numRef c:f`));
26293
+ }
26294
+ return this.extractChildTextContent(rootChartElement, `c:ser c:cat c:f`);
26295
+ }
26206
26296
  extractComboChart(chartElement) {
26207
26297
  // Title can be separated into multiple xml elements (for styling and such), we only import the text
26208
26298
  const chartTitle = this.mapOnElements({ parent: chartElement, query: "c:title a:t" }, (textElement) => {
@@ -36204,6 +36294,7 @@ const irregularityMap = {
36204
36294
  fingerprintStore.enable();
36205
36295
  }
36206
36296
  },
36297
+ isReadonlyAllowed: true,
36207
36298
  icon: "o-spreadsheet-Icon.IRREGULARITY_MAP",
36208
36299
  };
36209
36300
  const viewFormulas = {
@@ -46763,6 +46854,7 @@ class RemoveDuplicatesPanel extends Component {
46763
46854
  columns: {},
46764
46855
  });
46765
46856
  setup() {
46857
+ this.updateColumns();
46766
46858
  onWillUpdateProps(() => this.updateColumns());
46767
46859
  }
46768
46860
  toggleHasHeader() {
@@ -48550,8 +48642,8 @@ class CellComposerStore extends AbstractComposerStore {
48550
48642
  const sheetIdExists = !!this.getters.tryGetSheet(this.sheetId);
48551
48643
  if (!sheetIdExists && this.editionMode !== "inactive") {
48552
48644
  this.sheetId = this.getters.getActiveSheetId();
48553
- this.cancelEditionAndActivateSheet();
48554
48645
  this.resetContent();
48646
+ this.cancelEditionAndActivateSheet();
48555
48647
  this.notificationStore.raiseError(CELL_DELETED_MESSAGE);
48556
48648
  }
48557
48649
  break;
@@ -50409,6 +50501,9 @@ class ColResizer extends AbstractResizer {
50409
50501
  this.MAX_SIZE_MARGIN = 90;
50410
50502
  this.MIN_ELEMENT_SIZE = MIN_COL_WIDTH;
50411
50503
  }
50504
+ get sheetId() {
50505
+ return this.env.model.getters.getActiveSheetId();
50506
+ }
50412
50507
  _getEvOffset(ev) {
50413
50508
  return ev.offsetX;
50414
50509
  }
@@ -50431,10 +50526,10 @@ class ColResizer extends AbstractResizer {
50431
50526
  return this.env.model.getters.getEdgeScrollCol(position, position, position);
50432
50527
  }
50433
50528
  _getDimensionsInViewport(index) {
50434
- return this.env.model.getters.getColDimensionsInViewport(this.env.model.getters.getActiveSheetId(), index);
50529
+ return this.env.model.getters.getColDimensionsInViewport(this.sheetId, index);
50435
50530
  }
50436
50531
  _getElementSize(index) {
50437
- return this.env.model.getters.getColSize(this.env.model.getters.getActiveSheetId(), index);
50532
+ return this.env.model.getters.getColSize(this.sheetId, index);
50438
50533
  }
50439
50534
  _getMaxSize() {
50440
50535
  return this.colResizerRef.el.clientWidth;
@@ -50445,7 +50540,7 @@ class ColResizer extends AbstractResizer {
50445
50540
  const cols = this.env.model.getters.getActiveCols();
50446
50541
  this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
50447
50542
  dimension: "COL",
50448
- sheetId: this.env.model.getters.getActiveSheetId(),
50543
+ sheetId: this.sheetId,
50449
50544
  elements: cols.has(index) ? [...cols] : [index],
50450
50545
  size,
50451
50546
  });
@@ -50458,7 +50553,7 @@ class ColResizer extends AbstractResizer {
50458
50553
  elements.push(colIndex);
50459
50554
  }
50460
50555
  const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
50461
- sheetId: this.env.model.getters.getActiveSheetId(),
50556
+ sheetId: this.sheetId,
50462
50557
  dimension: "COL",
50463
50558
  base: this.state.base,
50464
50559
  elements,
@@ -50477,7 +50572,7 @@ class ColResizer extends AbstractResizer {
50477
50572
  _fitElementSize(index) {
50478
50573
  const cols = this.env.model.getters.getActiveCols();
50479
50574
  this.env.model.dispatch("AUTORESIZE_COLUMNS", {
50480
- sheetId: this.env.model.getters.getActiveSheetId(),
50575
+ sheetId: this.sheetId,
50481
50576
  cols: cols.has(index) ? [...cols] : [index],
50482
50577
  });
50483
50578
  }
@@ -50488,7 +50583,7 @@ class ColResizer extends AbstractResizer {
50488
50583
  return this.env.model.getters.getActiveCols();
50489
50584
  }
50490
50585
  _getPreviousVisibleElement(index) {
50491
- const sheetId = this.env.model.getters.getActiveSheetId();
50586
+ const sheetId = this.sheetId;
50492
50587
  let row;
50493
50588
  for (row = index - 1; row >= 0; row--) {
50494
50589
  if (!this.env.model.getters.isColHidden(sheetId, row)) {
@@ -50499,7 +50594,7 @@ class ColResizer extends AbstractResizer {
50499
50594
  }
50500
50595
  unhide(hiddenElements) {
50501
50596
  this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50502
- sheetId: this.env.model.getters.getActiveSheetId(),
50597
+ sheetId: this.sheetId,
50503
50598
  elements: hiddenElements,
50504
50599
  dimension: "COL",
50505
50600
  });
@@ -50515,7 +50610,7 @@ css /* scss */ `
50515
50610
  left: 0;
50516
50611
  right: 0;
50517
50612
  width: ${HEADER_WIDTH}px;
50518
- height: 100%;
50613
+ height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
50519
50614
  &.o-dragging {
50520
50615
  cursor: grabbing;
50521
50616
  }
@@ -50573,6 +50668,9 @@ class RowResizer extends AbstractResizer {
50573
50668
  this.MIN_ELEMENT_SIZE = MIN_ROW_HEIGHT;
50574
50669
  }
50575
50670
  rowResizerRef;
50671
+ get sheetId() {
50672
+ return this.env.model.getters.getActiveSheetId();
50673
+ }
50576
50674
  _getEvOffset(ev) {
50577
50675
  return ev.offsetY;
50578
50676
  }
@@ -50595,10 +50693,10 @@ class RowResizer extends AbstractResizer {
50595
50693
  return this.env.model.getters.getEdgeScrollRow(position, position, position);
50596
50694
  }
50597
50695
  _getDimensionsInViewport(index) {
50598
- return this.env.model.getters.getRowDimensionsInViewport(this.env.model.getters.getActiveSheetId(), index);
50696
+ return this.env.model.getters.getRowDimensionsInViewport(this.sheetId, index);
50599
50697
  }
50600
50698
  _getElementSize(index) {
50601
- return this.env.model.getters.getRowSize(this.env.model.getters.getActiveSheetId(), index);
50699
+ return this.env.model.getters.getRowSize(this.sheetId, index);
50602
50700
  }
50603
50701
  _getMaxSize() {
50604
50702
  return this.rowResizerRef.el.clientHeight;
@@ -50609,7 +50707,7 @@ class RowResizer extends AbstractResizer {
50609
50707
  const rows = this.env.model.getters.getActiveRows();
50610
50708
  this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
50611
50709
  dimension: "ROW",
50612
- sheetId: this.env.model.getters.getActiveSheetId(),
50710
+ sheetId: this.sheetId,
50613
50711
  elements: rows.has(index) ? [...rows] : [index],
50614
50712
  size,
50615
50713
  });
@@ -50622,7 +50720,7 @@ class RowResizer extends AbstractResizer {
50622
50720
  elements.push(rowIndex);
50623
50721
  }
50624
50722
  const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
50625
- sheetId: this.env.model.getters.getActiveSheetId(),
50723
+ sheetId: this.sheetId,
50626
50724
  dimension: "ROW",
50627
50725
  base: this.state.base,
50628
50726
  elements,
@@ -50641,7 +50739,7 @@ class RowResizer extends AbstractResizer {
50641
50739
  _fitElementSize(index) {
50642
50740
  const rows = this.env.model.getters.getActiveRows();
50643
50741
  this.env.model.dispatch("AUTORESIZE_ROWS", {
50644
- sheetId: this.env.model.getters.getActiveSheetId(),
50742
+ sheetId: this.sheetId,
50645
50743
  rows: rows.has(index) ? [...rows] : [index],
50646
50744
  });
50647
50745
  }
@@ -50652,7 +50750,7 @@ class RowResizer extends AbstractResizer {
50652
50750
  return this.env.model.getters.getActiveRows();
50653
50751
  }
50654
50752
  _getPreviousVisibleElement(index) {
50655
- const sheetId = this.env.model.getters.getActiveSheetId();
50753
+ const sheetId = this.sheetId;
50656
50754
  let row;
50657
50755
  for (row = index - 1; row >= 0; row--) {
50658
50756
  if (!this.env.model.getters.isRowHidden(sheetId, row)) {
@@ -50663,7 +50761,7 @@ class RowResizer extends AbstractResizer {
50663
50761
  }
50664
50762
  unhide(hiddenElements) {
50665
50763
  this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50666
- sheetId: this.env.model.getters.getActiveSheetId(),
50764
+ sheetId: this.sheetId,
50667
50765
  dimension: "ROW",
50668
50766
  elements: hiddenElements,
50669
50767
  });
@@ -64832,12 +64930,7 @@ class SheetUIPlugin extends UIPlugin {
64832
64930
  }
64833
64931
  break;
64834
64932
  case "AUTORESIZE_ROWS":
64835
- this.dispatch("RESIZE_COLUMNS_ROWS", {
64836
- elements: cmd.rows,
64837
- dimension: "ROW",
64838
- size: null,
64839
- sheetId: cmd.sheetId,
64840
- });
64933
+ this.autoResizeRows(cmd.sheetId, cmd.rows);
64841
64934
  break;
64842
64935
  }
64843
64936
  }
@@ -65001,6 +65094,48 @@ class SheetUIPlugin extends UIPlugin {
65001
65094
  }
65002
65095
  return "Success" /* CommandResult.Success */;
65003
65096
  }
65097
+ autoResizeRows(sheetId, rows) {
65098
+ const rowSizes = [];
65099
+ for (const row of rows) {
65100
+ let evaluatedRowSize = 0;
65101
+ for (const cellId of this.getters.getRowCells(sheetId, row)) {
65102
+ const cell = this.getters.getCellById(cellId);
65103
+ if (!cell) {
65104
+ continue;
65105
+ }
65106
+ const position = this.getters.getCellPosition(cell.id);
65107
+ const colSize = this.getters.getColSize(sheetId, position.col);
65108
+ if (cell.isFormula) {
65109
+ const content = this.getters.getEvaluatedCell(position).formattedValue;
65110
+ const evaluatedSize = getCellContentHeight(this.ctx, content, cell?.style, colSize);
65111
+ if (evaluatedSize > evaluatedRowSize && evaluatedSize > DEFAULT_CELL_HEIGHT) {
65112
+ evaluatedRowSize = evaluatedSize;
65113
+ }
65114
+ }
65115
+ else {
65116
+ const content = cell.content;
65117
+ const dynamicRowSize = getCellContentHeight(this.ctx, content, cell?.style, colSize);
65118
+ // Only keep the size of evaluated cells if it's bigger than the dynamic row size
65119
+ if (dynamicRowSize >= evaluatedRowSize && dynamicRowSize > DEFAULT_CELL_HEIGHT) {
65120
+ evaluatedRowSize = 0;
65121
+ }
65122
+ }
65123
+ }
65124
+ rowSizes.push(evaluatedRowSize || null);
65125
+ }
65126
+ const groupedSizes = new Map(rowSizes.map((size) => [size, []]));
65127
+ for (let i = 0; i < rowSizes.length; i++) {
65128
+ groupedSizes.get(rowSizes[i])?.push(rows[i]);
65129
+ }
65130
+ for (const [size, rows] of groupedSizes) {
65131
+ this.dispatch("RESIZE_COLUMNS_ROWS", {
65132
+ elements: rows,
65133
+ dimension: "ROW",
65134
+ size,
65135
+ sheetId,
65136
+ });
65137
+ }
65138
+ }
65004
65139
  }
65005
65140
 
65006
65141
  class TableComputedStylePlugin extends UIPlugin {
@@ -67902,7 +68037,8 @@ class SheetViewPlugin extends UIPlugin {
67902
68037
  ? this.getters.getSheetViewVisibleCols()
67903
68038
  : this.getters.getSheetViewVisibleRows();
67904
68039
  const startIndex = visibleHeaders.findIndex((header) => referenceHeaderIndex >= header);
67905
- const endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
68040
+ let endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
68041
+ endIndex = endIndex === -1 ? visibleHeaders.length : endIndex;
67906
68042
  const relevantIndexes = visibleHeaders.slice(startIndex, endIndex);
67907
68043
  let offset = 0;
67908
68044
  for (const i of relevantIndexes) {
@@ -74009,7 +74145,7 @@ function addStyles(styles) {
74009
74145
  }
74010
74146
  if (alignAttrs.length > 0) {
74011
74147
  attributes.push(["applyAlignment", "1"]); // for Libre Office
74012
- styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}>${escapeXml /*xml*/ `<alignment ${formatAttributes(alignAttrs)} />`}</xf> `);
74148
+ styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}><alignment ${formatAttributes(alignAttrs)} /></xf> `);
74013
74149
  }
74014
74150
  else {
74015
74151
  styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)} />`);
@@ -74177,6 +74313,9 @@ function addColumns(cols) {
74177
74313
  }
74178
74314
  function addRows(construct, data, sheet) {
74179
74315
  const rowNodes = [];
74316
+ const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
74317
+ const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
74318
+ const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
74180
74319
  for (let r = 0; r < sheet.rowNumber; r++) {
74181
74320
  const rowAttrs = [["r", r + 1]];
74182
74321
  const row = sheet.rows[r] || {};
@@ -74192,9 +74331,6 @@ function addRows(construct, data, sheet) {
74192
74331
  if (row.collapsed) {
74193
74332
  rowAttrs.push(["collapsed", 1]);
74194
74333
  }
74195
- const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
74196
- const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
74197
- const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
74198
74334
  const cellNodes = [];
74199
74335
  for (let c = 0; c < sheet.colNumber; c++) {
74200
74336
  const xc = toXC(c, r);
@@ -75422,6 +75558,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
75422
75558
  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 };
75423
75559
 
75424
75560
 
75425
- __info__.version = "18.1.10";
75426
- __info__.date = "2025-03-07T10:34:41.861Z";
75427
- __info__.hash = "31e4526";
75561
+ __info__.version = "18.1.12";
75562
+ __info__.date = "2025-03-19T08:23:50.676Z";
75563
+ __info__.hash = "32f788f";