@odoo/o-spreadsheet 18.2.2 → 18.2.3

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.2.2
6
- * @date 2025-03-07T10:41:04.411Z
7
- * @hash f567932
5
+ * @version 18.2.3
6
+ * @date 2025-03-12T15:32:36.274Z
7
+ * @hash 81b0e08
8
8
  */
9
9
 
10
10
  import { useEnv, useSubEnv, onWillUnmount, useComponent, status, Component, useRef, onMounted, useEffect, App, blockDom, useState, onPatched, onWillPatch, onWillUpdateProps, useExternalListener, onWillStart, xml, useChildSubEnv, markRaw, toRaw } from '@odoo/owl';
@@ -423,7 +423,6 @@ function escapeRegExp(str) {
423
423
  * Sparse arrays remain sparse.
424
424
  */
425
425
  function deepCopy(obj) {
426
- const result = Array.isArray(obj) ? [] : {};
427
426
  switch (typeof obj) {
428
427
  case "object": {
429
428
  if (obj === null) {
@@ -435,8 +434,18 @@ function deepCopy(obj) {
435
434
  else if (!(isPlainObject(obj) || obj instanceof Array)) {
436
435
  throw new Error("Unsupported type: only objects and arrays are supported");
437
436
  }
438
- for (const key in obj) {
439
- result[key] = deepCopy(obj[key]);
437
+ const result = Array.isArray(obj) ? new Array(obj.length) : {};
438
+ if (Array.isArray(obj)) {
439
+ for (let i = 0, len = obj.length; i < len; i++) {
440
+ if (i in obj) {
441
+ result[i] = deepCopy(obj[i]);
442
+ }
443
+ }
444
+ }
445
+ else {
446
+ for (const key in obj) {
447
+ result[key] = deepCopy(obj[key]);
448
+ }
440
449
  }
441
450
  return result;
442
451
  }
@@ -2699,21 +2708,30 @@ function mergeContiguousZones(zones) {
2699
2708
  return mergedZones;
2700
2709
  }
2701
2710
 
2711
+ const globalReverseLookup$1 = new WeakMap();
2712
+ const globalIdCounter = new WeakMap();
2702
2713
  /**
2703
2714
  * Get the id of the given item (its key in the given dictionary).
2704
2715
  * If the given item does not exist in the dictionary, it creates one with a new id.
2705
2716
  */
2706
2717
  function getItemId(item, itemsDic) {
2707
- for (const key in itemsDic) {
2708
- if (deepEquals(itemsDic[key], item)) {
2709
- return parseInt(key, 10);
2710
- }
2718
+ if (!globalReverseLookup$1.has(itemsDic)) {
2719
+ globalReverseLookup$1.set(itemsDic, new Map());
2720
+ globalIdCounter.set(itemsDic, 0);
2721
+ }
2722
+ const reverseLookup = globalReverseLookup$1.get(itemsDic);
2723
+ const canonical = getCanonicalRepresentation(item);
2724
+ if (reverseLookup.has(canonical)) {
2725
+ const id = reverseLookup.get(canonical);
2726
+ itemsDic[id] = item;
2727
+ return id;
2711
2728
  }
2712
2729
  // Generate new Id if the item didn't exist in the dictionary
2713
- const ids = Object.keys(itemsDic);
2714
- const maxId = ids.length === 0 ? 0 : largeMax(ids.map((id) => parseInt(id, 10)));
2715
- itemsDic[maxId + 1] = item;
2716
- return maxId + 1;
2730
+ const newId = globalIdCounter.get(itemsDic) + 1;
2731
+ reverseLookup.set(canonical, newId);
2732
+ globalIdCounter.set(itemsDic, newId);
2733
+ itemsDic[newId] = item;
2734
+ return newId;
2717
2735
  }
2718
2736
  function groupItemIdsByZones(positionsByItemId) {
2719
2737
  const result = {};
@@ -2737,6 +2755,33 @@ function* iterateItemIdsPositions(sheetId, itemIdsByZones) {
2737
2755
  }
2738
2756
  }
2739
2757
  }
2758
+ function getCanonicalRepresentation(item) {
2759
+ if (item === null)
2760
+ return "null";
2761
+ if (item === undefined)
2762
+ return "undefined";
2763
+ if (typeof item !== "object")
2764
+ return String(item);
2765
+ if (Array.isArray(item)) {
2766
+ const len = item.length;
2767
+ let result = "[";
2768
+ for (let i = 0; i < len; i++) {
2769
+ if (i > 0)
2770
+ result += ",";
2771
+ result += getCanonicalRepresentation(item[i]);
2772
+ }
2773
+ return result + "]";
2774
+ }
2775
+ const keys = Object.keys(item).sort();
2776
+ let repr = "{";
2777
+ for (const key of keys) {
2778
+ if (item[key] !== undefined) {
2779
+ repr += `"${key}":${getCanonicalRepresentation(item[key])},`;
2780
+ }
2781
+ }
2782
+ repr += "}";
2783
+ return repr;
2784
+ }
2740
2785
 
2741
2786
  // -----------------------------------------------------------------------------
2742
2787
  // Date Type
@@ -8289,7 +8334,8 @@ function isSortedColumnValid(sortedColumn, pivot) {
8289
8334
  const possibleValues = pivot
8290
8335
  .getPossibleFieldValues(columns[i])
8291
8336
  .map((v) => v.value);
8292
- if (!possibleValues.includes(sortedColumn.domain[i].value)) {
8337
+ if (!possibleValues.includes(sortedColumn.domain[i].value) &&
8338
+ !(sortedColumn.domain[i].value === null && possibleValues.includes(""))) {
8293
8339
  return false;
8294
8340
  }
8295
8341
  }
@@ -11318,6 +11364,7 @@ class ScorecardChart extends Component {
11318
11364
  const autoCompleteProviders = new Registry();
11319
11365
 
11320
11366
  autoCompleteProviders.add("dataValidation", {
11367
+ displayAllOnInitialContent: true,
11321
11368
  getProposals(tokenAtCursor, content) {
11322
11369
  if (content.startsWith("=")) {
11323
11370
  return [];
@@ -21614,6 +21661,15 @@ class AbstractComposerStore extends SpreadsheetStore {
21614
21661
  const exactMatch = proposals?.find((p) => p.text === tokenAtCursor.value);
21615
21662
  // remove tokens that are likely to be other parts of the formula that slipped in the token if it's a string
21616
21663
  const searchTerm = tokenAtCursor.value.replace(/[ ,\(\)]/g, "");
21664
+ if (this._currentContent === this.initialContent &&
21665
+ provider.displayAllOnInitialContent &&
21666
+ proposals?.length) {
21667
+ return {
21668
+ proposals,
21669
+ selectProposal: provider.selectProposal,
21670
+ autoSelectFirstProposal: provider.autoSelectFirstProposal ?? false,
21671
+ };
21672
+ }
21617
21673
  if (exactMatch && this._currentContent !== this.initialContent) {
21618
21674
  // this means the user has chosen a proposal
21619
21675
  return;
@@ -24359,16 +24415,25 @@ function addRelsToFile(relsFiles, path, rel) {
24359
24415
  }
24360
24416
  return id;
24361
24417
  }
24418
+ const globalReverseLookup = new WeakMap();
24362
24419
  function pushElement(property, propertyList) {
24363
- let len = propertyList.length;
24364
- const operator = typeof property === "object" ? deepEquals : (a, b) => a === b;
24365
- for (let i = 0; i < len; i++) {
24366
- if (operator(property, propertyList[i])) {
24367
- return i;
24420
+ let reverseLookup = globalReverseLookup.get(propertyList);
24421
+ if (!reverseLookup) {
24422
+ reverseLookup = new Map();
24423
+ for (let i = 0; i < propertyList.length; i++) {
24424
+ const canonical = getCanonicalRepresentation(propertyList[i]);
24425
+ reverseLookup.set(canonical, i);
24368
24426
  }
24427
+ globalReverseLookup.set(propertyList, reverseLookup);
24369
24428
  }
24370
- propertyList[propertyList.length] = property;
24371
- return propertyList.length - 1;
24429
+ const canonical = getCanonicalRepresentation(property);
24430
+ if (reverseLookup.has(canonical)) {
24431
+ return reverseLookup.get(canonical);
24432
+ }
24433
+ const maxId = propertyList.length;
24434
+ propertyList.push(property);
24435
+ reverseLookup.set(canonical, maxId);
24436
+ return maxId;
24372
24437
  }
24373
24438
  const chartIds = [];
24374
24439
  /**
@@ -26215,7 +26280,7 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
26215
26280
  title: { text: chartTitle },
26216
26281
  type: CHART_TYPE_CONVERSION_MAP[chartType],
26217
26282
  dataSets: this.extractChartDatasets(this.querySelectorAll(rootChartElement, `c:${chartType}`), chartType),
26218
- labelRange: this.extractChildTextContent(rootChartElement, `c:ser ${chartType === "scatterChart" ? "c:numRef" : "c:cat"} c:f`),
26283
+ labelRange: this.extractLabelRange(chartType, rootChartElement),
26219
26284
  backgroundColor: this.extractChildAttr(rootChartElement, "c:chartSpace > c:spPr a:srgbClr", "val", {
26220
26285
  default: "ffffff",
26221
26286
  }).asString(),
@@ -26227,6 +26292,13 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
26227
26292
  };
26228
26293
  })[0];
26229
26294
  }
26295
+ extractLabelRange(chartType, rootChartElement) {
26296
+ if (chartType === "scatterChart") {
26297
+ return (this.extractChildTextContent(rootChartElement, `c:ser c:strRef c:f`) ||
26298
+ this.extractChildTextContent(rootChartElement, `c:ser c:numRef c:f`));
26299
+ }
26300
+ return this.extractChildTextContent(rootChartElement, `c:ser c:cat c:f`);
26301
+ }
26230
26302
  extractComboChart(chartElement) {
26231
26303
  // Title can be separated into multiple xml elements (for styling and such), we only import the text
26232
26304
  const chartTitle = this.mapOnElements({ parent: chartElement, query: "c:title a:t" }, (textElement) => {
@@ -36399,6 +36471,7 @@ const irregularityMap = {
36399
36471
  fingerprintStore.enable();
36400
36472
  }
36401
36473
  },
36474
+ isReadonlyAllowed: true,
36402
36475
  icon: "o-spreadsheet-Icon.IRREGULARITY_MAP",
36403
36476
  };
36404
36477
  const viewFormulas = {
@@ -50460,6 +50533,71 @@ class GridPopover extends Component {
50460
50533
  }
50461
50534
  }
50462
50535
 
50536
+ class UnhideRowHeaders extends Component {
50537
+ static template = "o-spreadsheet-UnhideRowHeaders";
50538
+ static props = {
50539
+ headersGroups: Array,
50540
+ headerRange: Object,
50541
+ offset: { type: Number, optional: true },
50542
+ };
50543
+ static defaultProps = { offset: 0 };
50544
+ get sheetId() {
50545
+ return this.env.model.getters.getActiveSheetId();
50546
+ }
50547
+ getUnhidePreviousButtonStyle(hiddenIndex) {
50548
+ const rect = this.env.model.getters.getRect(positionToZone({ col: 0, row: hiddenIndex }));
50549
+ const y = rect.y + rect.height - HEADER_HEIGHT;
50550
+ return cssPropertiesToCss({ top: y - this.props.offset + "px", "margin-right": "1px" });
50551
+ }
50552
+ getUnhideNextButtonStyle(hiddenIndex) {
50553
+ const rect = this.env.model.getters.getRect(positionToZone({ col: 0, row: hiddenIndex }));
50554
+ const y = rect.y - HEADER_HEIGHT;
50555
+ return cssPropertiesToCss({ top: y - this.props.offset + "px", "margin-right": "1px" });
50556
+ }
50557
+ unhide(hiddenElements) {
50558
+ this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50559
+ sheetId: this.sheetId,
50560
+ dimension: "ROW",
50561
+ elements: hiddenElements,
50562
+ });
50563
+ }
50564
+ isVisible(header) {
50565
+ return header >= this.props.headerRange.start && header <= this.props.headerRange.end;
50566
+ }
50567
+ }
50568
+ class UnhideColumnHeaders extends Component {
50569
+ static template = "o-spreadsheet-UnhideColumnHeaders";
50570
+ static props = {
50571
+ headersGroups: Array,
50572
+ headerRange: Object,
50573
+ offset: { type: Number, optional: true },
50574
+ };
50575
+ static defaultProps = { offset: 0 };
50576
+ get sheetId() {
50577
+ return this.env.model.getters.getActiveSheetId();
50578
+ }
50579
+ getUnhidePreviousButtonStyle(hiddenIndex) {
50580
+ const rect = this.env.model.getters.getRect(positionToZone({ col: hiddenIndex, row: 0 }));
50581
+ const x = rect.x + rect.width - HEADER_WIDTH;
50582
+ return cssPropertiesToCss({ left: x - this.props.offset + "px" });
50583
+ }
50584
+ getUnhideNextButtonStyle(hiddenIndex) {
50585
+ const rect = this.env.model.getters.getRect(positionToZone({ col: hiddenIndex, row: 0 }));
50586
+ const x = rect.x - HEADER_WIDTH;
50587
+ return cssPropertiesToCss({ left: x - this.props.offset + "px" });
50588
+ }
50589
+ unhide(hiddenElements) {
50590
+ this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50591
+ sheetId: this.sheetId,
50592
+ dimension: "COL",
50593
+ elements: hiddenElements,
50594
+ });
50595
+ }
50596
+ isVisible(header) {
50597
+ return header >= this.props.headerRange.start && header <= this.props.headerRange.end;
50598
+ }
50599
+ }
50600
+
50463
50601
  class AbstractResizer extends Component {
50464
50602
  static props = {
50465
50603
  onOpenContextMenu: Function,
@@ -50678,6 +50816,7 @@ css /* scss */ `
50678
50816
  left: ${HEADER_WIDTH}px;
50679
50817
  right: 0;
50680
50818
  height: ${HEADER_HEIGHT}px;
50819
+ width: calc(100% - ${HEADER_WIDTH + SCROLLBAR_WIDTH}px);
50681
50820
  &.o-dragging {
50682
50821
  cursor: grabbing;
50683
50822
  }
@@ -50727,6 +50866,7 @@ class ColResizer extends AbstractResizer {
50727
50866
  onOpenContextMenu: Function,
50728
50867
  };
50729
50868
  static template = "o-spreadsheet-ColResizer";
50869
+ static components = { UnhideColumnHeaders };
50730
50870
  colResizerRef;
50731
50871
  setup() {
50732
50872
  super.setup();
@@ -50735,6 +50875,9 @@ class ColResizer extends AbstractResizer {
50735
50875
  this.MAX_SIZE_MARGIN = 90;
50736
50876
  this.MIN_ELEMENT_SIZE = MIN_COL_WIDTH;
50737
50877
  }
50878
+ get sheetId() {
50879
+ return this.env.model.getters.getActiveSheetId();
50880
+ }
50738
50881
  _getEvOffset(ev) {
50739
50882
  return ev.offsetX;
50740
50883
  }
@@ -50757,10 +50900,10 @@ class ColResizer extends AbstractResizer {
50757
50900
  return this.env.model.getters.getEdgeScrollCol(position, position, position);
50758
50901
  }
50759
50902
  _getDimensionsInViewport(index) {
50760
- return this.env.model.getters.getColDimensionsInViewport(this.env.model.getters.getActiveSheetId(), index);
50903
+ return this.env.model.getters.getColDimensionsInViewport(this.sheetId, index);
50761
50904
  }
50762
50905
  _getElementSize(index) {
50763
- return this.env.model.getters.getColSize(this.env.model.getters.getActiveSheetId(), index);
50906
+ return this.env.model.getters.getColSize(this.sheetId, index);
50764
50907
  }
50765
50908
  _getMaxSize() {
50766
50909
  return this.colResizerRef.el.clientWidth;
@@ -50771,7 +50914,7 @@ class ColResizer extends AbstractResizer {
50771
50914
  const cols = this.env.model.getters.getActiveCols();
50772
50915
  this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
50773
50916
  dimension: "COL",
50774
- sheetId: this.env.model.getters.getActiveSheetId(),
50917
+ sheetId: this.sheetId,
50775
50918
  elements: cols.has(index) ? [...cols] : [index],
50776
50919
  size,
50777
50920
  });
@@ -50784,7 +50927,7 @@ class ColResizer extends AbstractResizer {
50784
50927
  elements.push(colIndex);
50785
50928
  }
50786
50929
  const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
50787
- sheetId: this.env.model.getters.getActiveSheetId(),
50930
+ sheetId: this.sheetId,
50788
50931
  dimension: "COL",
50789
50932
  base: this.state.base,
50790
50933
  elements,
@@ -50803,7 +50946,7 @@ class ColResizer extends AbstractResizer {
50803
50946
  _fitElementSize(index) {
50804
50947
  const cols = this.env.model.getters.getActiveCols();
50805
50948
  this.env.model.dispatch("AUTORESIZE_COLUMNS", {
50806
- sheetId: this.env.model.getters.getActiveSheetId(),
50949
+ sheetId: this.sheetId,
50807
50950
  cols: cols.has(index) ? [...cols] : [index],
50808
50951
  });
50809
50952
  }
@@ -50814,7 +50957,7 @@ class ColResizer extends AbstractResizer {
50814
50957
  return this.env.model.getters.getActiveCols();
50815
50958
  }
50816
50959
  _getPreviousVisibleElement(index) {
50817
- const sheetId = this.env.model.getters.getActiveSheetId();
50960
+ const sheetId = this.sheetId;
50818
50961
  let row;
50819
50962
  for (row = index - 1; row >= 0; row--) {
50820
50963
  if (!this.env.model.getters.isColHidden(sheetId, row)) {
@@ -50825,13 +50968,38 @@ class ColResizer extends AbstractResizer {
50825
50968
  }
50826
50969
  unhide(hiddenElements) {
50827
50970
  this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50828
- sheetId: this.env.model.getters.getActiveSheetId(),
50971
+ sheetId: this.sheetId,
50829
50972
  elements: hiddenElements,
50830
50973
  dimension: "COL",
50831
50974
  });
50832
50975
  }
50833
- getUnhideButtonStyle(hiddenIndex) {
50834
- return cssPropertiesToCss({ left: this._getDimensionsInViewport(hiddenIndex).start + "px" });
50976
+ get mainUnhideHeadersProps() {
50977
+ const { left, right } = this.env.model.getters.getActiveMainViewport();
50978
+ const { xSplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
50979
+ const hiddenGroups = this.env.model.getters.getHiddenColsGroups(this.sheetId);
50980
+ const index = hiddenGroups.findIndex((group) => group[0] >= xSplit - 1);
50981
+ return {
50982
+ headersGroups: hiddenGroups.slice(index),
50983
+ offset: this.env.model.getters.getMainViewportCoordinates().x,
50984
+ headerRange: { start: left, end: right },
50985
+ };
50986
+ }
50987
+ get frozenUnhideHeadersProps() {
50988
+ const { xSplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
50989
+ const hiddenGroups = this.env.model.getters.getHiddenColsGroups(this.sheetId);
50990
+ const index = hiddenGroups.findIndex((group) => group[0] >= xSplit - 1);
50991
+ return {
50992
+ headersGroups: hiddenGroups.slice(0, index + 1),
50993
+ headerRange: { start: 0, end: xSplit - 1 },
50994
+ };
50995
+ }
50996
+ get frozenContainerStyle() {
50997
+ return cssPropertiesToCss({
50998
+ width: this.env.model.getters.getMainViewportCoordinates().x + "px",
50999
+ });
51000
+ }
51001
+ get hasFrozenPane() {
51002
+ return this.env.model.getters.getPaneDivisions(this.sheetId).xSplit > 0;
50835
51003
  }
50836
51004
  }
50837
51005
  css /* scss */ `
@@ -50841,7 +51009,7 @@ css /* scss */ `
50841
51009
  left: 0;
50842
51010
  right: 0;
50843
51011
  width: ${HEADER_WIDTH}px;
50844
- height: 100%;
51012
+ height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
50845
51013
  &.o-dragging {
50846
51014
  cursor: grabbing;
50847
51015
  }
@@ -50891,6 +51059,7 @@ class RowResizer extends AbstractResizer {
50891
51059
  onOpenContextMenu: Function,
50892
51060
  };
50893
51061
  static template = "o-spreadsheet-RowResizer";
51062
+ static components = { UnhideRowHeaders };
50894
51063
  setup() {
50895
51064
  super.setup();
50896
51065
  this.rowResizerRef = useRef("rowResizer");
@@ -50899,6 +51068,9 @@ class RowResizer extends AbstractResizer {
50899
51068
  this.MIN_ELEMENT_SIZE = MIN_ROW_HEIGHT;
50900
51069
  }
50901
51070
  rowResizerRef;
51071
+ get sheetId() {
51072
+ return this.env.model.getters.getActiveSheetId();
51073
+ }
50902
51074
  _getEvOffset(ev) {
50903
51075
  return ev.offsetY;
50904
51076
  }
@@ -50921,10 +51093,10 @@ class RowResizer extends AbstractResizer {
50921
51093
  return this.env.model.getters.getEdgeScrollRow(position, position, position);
50922
51094
  }
50923
51095
  _getDimensionsInViewport(index) {
50924
- return this.env.model.getters.getRowDimensionsInViewport(this.env.model.getters.getActiveSheetId(), index);
51096
+ return this.env.model.getters.getRowDimensionsInViewport(this.sheetId, index);
50925
51097
  }
50926
51098
  _getElementSize(index) {
50927
- return this.env.model.getters.getRowSize(this.env.model.getters.getActiveSheetId(), index);
51099
+ return this.env.model.getters.getRowSize(this.sheetId, index);
50928
51100
  }
50929
51101
  _getMaxSize() {
50930
51102
  return this.rowResizerRef.el.clientHeight;
@@ -50935,7 +51107,7 @@ class RowResizer extends AbstractResizer {
50935
51107
  const rows = this.env.model.getters.getActiveRows();
50936
51108
  this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
50937
51109
  dimension: "ROW",
50938
- sheetId: this.env.model.getters.getActiveSheetId(),
51110
+ sheetId: this.sheetId,
50939
51111
  elements: rows.has(index) ? [...rows] : [index],
50940
51112
  size,
50941
51113
  });
@@ -50948,7 +51120,7 @@ class RowResizer extends AbstractResizer {
50948
51120
  elements.push(rowIndex);
50949
51121
  }
50950
51122
  const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
50951
- sheetId: this.env.model.getters.getActiveSheetId(),
51123
+ sheetId: this.sheetId,
50952
51124
  dimension: "ROW",
50953
51125
  base: this.state.base,
50954
51126
  elements,
@@ -50967,7 +51139,7 @@ class RowResizer extends AbstractResizer {
50967
51139
  _fitElementSize(index) {
50968
51140
  const rows = this.env.model.getters.getActiveRows();
50969
51141
  this.env.model.dispatch("AUTORESIZE_ROWS", {
50970
- sheetId: this.env.model.getters.getActiveSheetId(),
51142
+ sheetId: this.sheetId,
50971
51143
  rows: rows.has(index) ? [...rows] : [index],
50972
51144
  });
50973
51145
  }
@@ -50978,7 +51150,7 @@ class RowResizer extends AbstractResizer {
50978
51150
  return this.env.model.getters.getActiveRows();
50979
51151
  }
50980
51152
  _getPreviousVisibleElement(index) {
50981
- const sheetId = this.env.model.getters.getActiveSheetId();
51153
+ const sheetId = this.sheetId;
50982
51154
  let row;
50983
51155
  for (row = index - 1; row >= 0; row--) {
50984
51156
  if (!this.env.model.getters.isRowHidden(sheetId, row)) {
@@ -50987,15 +51159,33 @@ class RowResizer extends AbstractResizer {
50987
51159
  }
50988
51160
  return row;
50989
51161
  }
50990
- unhide(hiddenElements) {
50991
- this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50992
- sheetId: this.env.model.getters.getActiveSheetId(),
50993
- dimension: "ROW",
50994
- elements: hiddenElements,
51162
+ get mainUnhideHeadersProps() {
51163
+ const { top, bottom } = this.env.model.getters.getActiveMainViewport();
51164
+ const { ySplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
51165
+ const hiddenGroups = this.env.model.getters.getHiddenRowsGroups(this.sheetId);
51166
+ const index = hiddenGroups.findIndex((group) => group[0] >= ySplit - 1);
51167
+ return {
51168
+ headersGroups: hiddenGroups.slice(index),
51169
+ offset: this.env.model.getters.getMainViewportCoordinates().y,
51170
+ headerRange: { start: top, end: bottom },
51171
+ };
51172
+ }
51173
+ get frozenUnhideHeadersProps() {
51174
+ const { ySplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
51175
+ const hiddenGroups = this.env.model.getters.getHiddenRowsGroups(this.sheetId);
51176
+ const index = hiddenGroups.findIndex((group) => group[0] >= ySplit - 1);
51177
+ return {
51178
+ headersGroups: hiddenGroups.slice(0, index + 1),
51179
+ headerRange: { start: 0, end: ySplit - 1 },
51180
+ };
51181
+ }
51182
+ get frozenContainerStyle() {
51183
+ return cssPropertiesToCss({
51184
+ height: this.env.model.getters.getMainViewportCoordinates().y + "px",
50995
51185
  });
50996
51186
  }
50997
- getUnhideButtonStyle(hiddenIndex) {
50998
- return cssPropertiesToCss({ top: this._getDimensionsInViewport(hiddenIndex).start + "px" });
51187
+ get hasFrozenPane() {
51188
+ return this.env.model.getters.getPaneDivisions(this.sheetId).ySplit > 0;
50999
51189
  }
51000
51190
  }
51001
51191
  css /* scss */ `
@@ -67765,7 +67955,7 @@ class InternalViewport {
67765
67955
  *
67766
67956
  */
67767
67957
  getFullRect(zone) {
67768
- const targetZone = intersection(zone, this);
67958
+ const targetZone = intersection(zone, this.boundaries);
67769
67959
  const scrollDeltaX = this.snapCorrection.x;
67770
67960
  const scrollDeltaY = this.snapCorrection.y;
67771
67961
  if (targetZone) {
@@ -68233,7 +68423,8 @@ class SheetViewPlugin extends UIPlugin {
68233
68423
  ? this.getters.getSheetViewVisibleCols()
68234
68424
  : this.getters.getSheetViewVisibleRows();
68235
68425
  const startIndex = visibleHeaders.findIndex((header) => referenceHeaderIndex >= header);
68236
- const endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
68426
+ let endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
68427
+ endIndex = endIndex === -1 ? visibleHeaders.length : endIndex;
68237
68428
  const relevantIndexes = visibleHeaders.slice(startIndex, endIndex);
68238
68429
  let offset = 0;
68239
68430
  for (const i of relevantIndexes) {
@@ -68358,11 +68549,12 @@ class SheetViewPlugin extends UIPlugin {
68358
68549
  * column of the current viewport
68359
68550
  */
68360
68551
  getColDimensionsInViewport(sheetId, col) {
68552
+ const { top } = this.getMainInternalViewport(sheetId);
68361
68553
  const zone = {
68362
68554
  left: col,
68363
68555
  right: col,
68364
- top: 0,
68365
- bottom: this.getters.getNumberRows(sheetId) - 1,
68556
+ top: top,
68557
+ bottom: top,
68366
68558
  };
68367
68559
  const { x, width } = this.getVisibleRect(zone);
68368
68560
  const start = x - this.gridOffsetX;
@@ -68373,9 +68565,10 @@ class SheetViewPlugin extends UIPlugin {
68373
68565
  * of the current viewport
68374
68566
  */
68375
68567
  getRowDimensionsInViewport(sheetId, row) {
68568
+ const { left } = this.getMainInternalViewport(sheetId);
68376
68569
  const zone = {
68377
68570
  left: 0,
68378
- right: this.getters.getNumberCols(sheetId) - 1,
68571
+ right: left,
68379
68572
  top: row,
68380
68573
  bottom: row,
68381
68574
  };
@@ -74327,7 +74520,7 @@ function addStyles(styles) {
74327
74520
  }
74328
74521
  if (alignAttrs.length > 0) {
74329
74522
  attributes.push(["applyAlignment", "1"]); // for Libre Office
74330
- styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}>${escapeXml /*xml*/ `<alignment ${formatAttributes(alignAttrs)} />`}</xf> `);
74523
+ styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}><alignment ${formatAttributes(alignAttrs)} /></xf> `);
74331
74524
  }
74332
74525
  else {
74333
74526
  styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)} />`);
@@ -74495,6 +74688,9 @@ function addColumns(cols) {
74495
74688
  }
74496
74689
  function addRows(construct, data, sheet) {
74497
74690
  const rowNodes = [];
74691
+ const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
74692
+ const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
74693
+ const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
74498
74694
  for (let r = 0; r < sheet.rowNumber; r++) {
74499
74695
  const rowAttrs = [["r", r + 1]];
74500
74696
  const row = sheet.rows[r] || {};
@@ -74510,9 +74706,6 @@ function addRows(construct, data, sheet) {
74510
74706
  if (row.collapsed) {
74511
74707
  rowAttrs.push(["collapsed", 1]);
74512
74708
  }
74513
- const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
74514
- const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
74515
- const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
74516
74709
  const cellNodes = [];
74517
74710
  for (let c = 0; c < sheet.colNumber; c++) {
74518
74711
  const xc = toXC(c, r);
@@ -75772,6 +75965,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
75772
75965
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, CommandResult, CorePlugin, CoreViewPlugin, 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 };
75773
75966
 
75774
75967
 
75775
- __info__.version = "18.2.2";
75776
- __info__.date = "2025-03-07T10:41:04.411Z";
75777
- __info__.hash = "f567932";
75968
+ __info__.version = "18.2.3";
75969
+ __info__.date = "2025-03-12T15:32:36.274Z";
75970
+ __info__.hash = "81b0e08";