@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
  'use strict';
@@ -425,7 +425,6 @@ function escapeRegExp(str) {
425
425
  * Sparse arrays remain sparse.
426
426
  */
427
427
  function deepCopy(obj) {
428
- const result = Array.isArray(obj) ? [] : {};
429
428
  switch (typeof obj) {
430
429
  case "object": {
431
430
  if (obj === null) {
@@ -437,8 +436,18 @@ function deepCopy(obj) {
437
436
  else if (!(isPlainObject(obj) || obj instanceof Array)) {
438
437
  throw new Error("Unsupported type: only objects and arrays are supported");
439
438
  }
440
- for (const key in obj) {
441
- result[key] = deepCopy(obj[key]);
439
+ const result = Array.isArray(obj) ? new Array(obj.length) : {};
440
+ if (Array.isArray(obj)) {
441
+ for (let i = 0, len = obj.length; i < len; i++) {
442
+ if (i in obj) {
443
+ result[i] = deepCopy(obj[i]);
444
+ }
445
+ }
446
+ }
447
+ else {
448
+ for (const key in obj) {
449
+ result[key] = deepCopy(obj[key]);
450
+ }
442
451
  }
443
452
  return result;
444
453
  }
@@ -2701,21 +2710,30 @@ function mergeContiguousZones(zones) {
2701
2710
  return mergedZones;
2702
2711
  }
2703
2712
 
2713
+ const globalReverseLookup$1 = new WeakMap();
2714
+ const globalIdCounter = new WeakMap();
2704
2715
  /**
2705
2716
  * Get the id of the given item (its key in the given dictionary).
2706
2717
  * If the given item does not exist in the dictionary, it creates one with a new id.
2707
2718
  */
2708
2719
  function getItemId(item, itemsDic) {
2709
- for (const key in itemsDic) {
2710
- if (deepEquals(itemsDic[key], item)) {
2711
- return parseInt(key, 10);
2712
- }
2720
+ if (!globalReverseLookup$1.has(itemsDic)) {
2721
+ globalReverseLookup$1.set(itemsDic, new Map());
2722
+ globalIdCounter.set(itemsDic, 0);
2723
+ }
2724
+ const reverseLookup = globalReverseLookup$1.get(itemsDic);
2725
+ const canonical = getCanonicalRepresentation(item);
2726
+ if (reverseLookup.has(canonical)) {
2727
+ const id = reverseLookup.get(canonical);
2728
+ itemsDic[id] = item;
2729
+ return id;
2713
2730
  }
2714
2731
  // Generate new Id if the item didn't exist in the dictionary
2715
- const ids = Object.keys(itemsDic);
2716
- const maxId = ids.length === 0 ? 0 : largeMax(ids.map((id) => parseInt(id, 10)));
2717
- itemsDic[maxId + 1] = item;
2718
- return maxId + 1;
2732
+ const newId = globalIdCounter.get(itemsDic) + 1;
2733
+ reverseLookup.set(canonical, newId);
2734
+ globalIdCounter.set(itemsDic, newId);
2735
+ itemsDic[newId] = item;
2736
+ return newId;
2719
2737
  }
2720
2738
  function groupItemIdsByZones(positionsByItemId) {
2721
2739
  const result = {};
@@ -2739,6 +2757,33 @@ function* iterateItemIdsPositions(sheetId, itemIdsByZones) {
2739
2757
  }
2740
2758
  }
2741
2759
  }
2760
+ function getCanonicalRepresentation(item) {
2761
+ if (item === null)
2762
+ return "null";
2763
+ if (item === undefined)
2764
+ return "undefined";
2765
+ if (typeof item !== "object")
2766
+ return String(item);
2767
+ if (Array.isArray(item)) {
2768
+ const len = item.length;
2769
+ let result = "[";
2770
+ for (let i = 0; i < len; i++) {
2771
+ if (i > 0)
2772
+ result += ",";
2773
+ result += getCanonicalRepresentation(item[i]);
2774
+ }
2775
+ return result + "]";
2776
+ }
2777
+ const keys = Object.keys(item).sort();
2778
+ let repr = "{";
2779
+ for (const key of keys) {
2780
+ if (item[key] !== undefined) {
2781
+ repr += `"${key}":${getCanonicalRepresentation(item[key])},`;
2782
+ }
2783
+ }
2784
+ repr += "}";
2785
+ return repr;
2786
+ }
2742
2787
 
2743
2788
  // -----------------------------------------------------------------------------
2744
2789
  // Date Type
@@ -8291,7 +8336,8 @@ function isSortedColumnValid(sortedColumn, pivot) {
8291
8336
  const possibleValues = pivot
8292
8337
  .getPossibleFieldValues(columns[i])
8293
8338
  .map((v) => v.value);
8294
- if (!possibleValues.includes(sortedColumn.domain[i].value)) {
8339
+ if (!possibleValues.includes(sortedColumn.domain[i].value) &&
8340
+ !(sortedColumn.domain[i].value === null && possibleValues.includes(""))) {
8295
8341
  return false;
8296
8342
  }
8297
8343
  }
@@ -11320,6 +11366,7 @@ class ScorecardChart extends owl.Component {
11320
11366
  const autoCompleteProviders = new Registry();
11321
11367
 
11322
11368
  autoCompleteProviders.add("dataValidation", {
11369
+ displayAllOnInitialContent: true,
11323
11370
  getProposals(tokenAtCursor, content) {
11324
11371
  if (content.startsWith("=")) {
11325
11372
  return [];
@@ -21616,6 +21663,15 @@ class AbstractComposerStore extends SpreadsheetStore {
21616
21663
  const exactMatch = proposals?.find((p) => p.text === tokenAtCursor.value);
21617
21664
  // remove tokens that are likely to be other parts of the formula that slipped in the token if it's a string
21618
21665
  const searchTerm = tokenAtCursor.value.replace(/[ ,\(\)]/g, "");
21666
+ if (this._currentContent === this.initialContent &&
21667
+ provider.displayAllOnInitialContent &&
21668
+ proposals?.length) {
21669
+ return {
21670
+ proposals,
21671
+ selectProposal: provider.selectProposal,
21672
+ autoSelectFirstProposal: provider.autoSelectFirstProposal ?? false,
21673
+ };
21674
+ }
21619
21675
  if (exactMatch && this._currentContent !== this.initialContent) {
21620
21676
  // this means the user has chosen a proposal
21621
21677
  return;
@@ -24361,16 +24417,25 @@ function addRelsToFile(relsFiles, path, rel) {
24361
24417
  }
24362
24418
  return id;
24363
24419
  }
24420
+ const globalReverseLookup = new WeakMap();
24364
24421
  function pushElement(property, propertyList) {
24365
- let len = propertyList.length;
24366
- const operator = typeof property === "object" ? deepEquals : (a, b) => a === b;
24367
- for (let i = 0; i < len; i++) {
24368
- if (operator(property, propertyList[i])) {
24369
- return i;
24422
+ let reverseLookup = globalReverseLookup.get(propertyList);
24423
+ if (!reverseLookup) {
24424
+ reverseLookup = new Map();
24425
+ for (let i = 0; i < propertyList.length; i++) {
24426
+ const canonical = getCanonicalRepresentation(propertyList[i]);
24427
+ reverseLookup.set(canonical, i);
24370
24428
  }
24429
+ globalReverseLookup.set(propertyList, reverseLookup);
24371
24430
  }
24372
- propertyList[propertyList.length] = property;
24373
- return propertyList.length - 1;
24431
+ const canonical = getCanonicalRepresentation(property);
24432
+ if (reverseLookup.has(canonical)) {
24433
+ return reverseLookup.get(canonical);
24434
+ }
24435
+ const maxId = propertyList.length;
24436
+ propertyList.push(property);
24437
+ reverseLookup.set(canonical, maxId);
24438
+ return maxId;
24374
24439
  }
24375
24440
  const chartIds = [];
24376
24441
  /**
@@ -26217,7 +26282,7 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
26217
26282
  title: { text: chartTitle },
26218
26283
  type: CHART_TYPE_CONVERSION_MAP[chartType],
26219
26284
  dataSets: this.extractChartDatasets(this.querySelectorAll(rootChartElement, `c:${chartType}`), chartType),
26220
- labelRange: this.extractChildTextContent(rootChartElement, `c:ser ${chartType === "scatterChart" ? "c:numRef" : "c:cat"} c:f`),
26285
+ labelRange: this.extractLabelRange(chartType, rootChartElement),
26221
26286
  backgroundColor: this.extractChildAttr(rootChartElement, "c:chartSpace > c:spPr a:srgbClr", "val", {
26222
26287
  default: "ffffff",
26223
26288
  }).asString(),
@@ -26229,6 +26294,13 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
26229
26294
  };
26230
26295
  })[0];
26231
26296
  }
26297
+ extractLabelRange(chartType, rootChartElement) {
26298
+ if (chartType === "scatterChart") {
26299
+ return (this.extractChildTextContent(rootChartElement, `c:ser c:strRef c:f`) ||
26300
+ this.extractChildTextContent(rootChartElement, `c:ser c:numRef c:f`));
26301
+ }
26302
+ return this.extractChildTextContent(rootChartElement, `c:ser c:cat c:f`);
26303
+ }
26232
26304
  extractComboChart(chartElement) {
26233
26305
  // Title can be separated into multiple xml elements (for styling and such), we only import the text
26234
26306
  const chartTitle = this.mapOnElements({ parent: chartElement, query: "c:title a:t" }, (textElement) => {
@@ -36401,6 +36473,7 @@ const irregularityMap = {
36401
36473
  fingerprintStore.enable();
36402
36474
  }
36403
36475
  },
36476
+ isReadonlyAllowed: true,
36404
36477
  icon: "o-spreadsheet-Icon.IRREGULARITY_MAP",
36405
36478
  };
36406
36479
  const viewFormulas = {
@@ -50462,6 +50535,71 @@ class GridPopover extends owl.Component {
50462
50535
  }
50463
50536
  }
50464
50537
 
50538
+ class UnhideRowHeaders extends owl.Component {
50539
+ static template = "o-spreadsheet-UnhideRowHeaders";
50540
+ static props = {
50541
+ headersGroups: Array,
50542
+ headerRange: Object,
50543
+ offset: { type: Number, optional: true },
50544
+ };
50545
+ static defaultProps = { offset: 0 };
50546
+ get sheetId() {
50547
+ return this.env.model.getters.getActiveSheetId();
50548
+ }
50549
+ getUnhidePreviousButtonStyle(hiddenIndex) {
50550
+ const rect = this.env.model.getters.getRect(positionToZone({ col: 0, row: hiddenIndex }));
50551
+ const y = rect.y + rect.height - HEADER_HEIGHT;
50552
+ return cssPropertiesToCss({ top: y - this.props.offset + "px", "margin-right": "1px" });
50553
+ }
50554
+ getUnhideNextButtonStyle(hiddenIndex) {
50555
+ const rect = this.env.model.getters.getRect(positionToZone({ col: 0, row: hiddenIndex }));
50556
+ const y = rect.y - HEADER_HEIGHT;
50557
+ return cssPropertiesToCss({ top: y - this.props.offset + "px", "margin-right": "1px" });
50558
+ }
50559
+ unhide(hiddenElements) {
50560
+ this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50561
+ sheetId: this.sheetId,
50562
+ dimension: "ROW",
50563
+ elements: hiddenElements,
50564
+ });
50565
+ }
50566
+ isVisible(header) {
50567
+ return header >= this.props.headerRange.start && header <= this.props.headerRange.end;
50568
+ }
50569
+ }
50570
+ class UnhideColumnHeaders extends owl.Component {
50571
+ static template = "o-spreadsheet-UnhideColumnHeaders";
50572
+ static props = {
50573
+ headersGroups: Array,
50574
+ headerRange: Object,
50575
+ offset: { type: Number, optional: true },
50576
+ };
50577
+ static defaultProps = { offset: 0 };
50578
+ get sheetId() {
50579
+ return this.env.model.getters.getActiveSheetId();
50580
+ }
50581
+ getUnhidePreviousButtonStyle(hiddenIndex) {
50582
+ const rect = this.env.model.getters.getRect(positionToZone({ col: hiddenIndex, row: 0 }));
50583
+ const x = rect.x + rect.width - HEADER_WIDTH;
50584
+ return cssPropertiesToCss({ left: x - this.props.offset + "px" });
50585
+ }
50586
+ getUnhideNextButtonStyle(hiddenIndex) {
50587
+ const rect = this.env.model.getters.getRect(positionToZone({ col: hiddenIndex, row: 0 }));
50588
+ const x = rect.x - HEADER_WIDTH;
50589
+ return cssPropertiesToCss({ left: x - this.props.offset + "px" });
50590
+ }
50591
+ unhide(hiddenElements) {
50592
+ this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50593
+ sheetId: this.sheetId,
50594
+ dimension: "COL",
50595
+ elements: hiddenElements,
50596
+ });
50597
+ }
50598
+ isVisible(header) {
50599
+ return header >= this.props.headerRange.start && header <= this.props.headerRange.end;
50600
+ }
50601
+ }
50602
+
50465
50603
  class AbstractResizer extends owl.Component {
50466
50604
  static props = {
50467
50605
  onOpenContextMenu: Function,
@@ -50680,6 +50818,7 @@ css /* scss */ `
50680
50818
  left: ${HEADER_WIDTH}px;
50681
50819
  right: 0;
50682
50820
  height: ${HEADER_HEIGHT}px;
50821
+ width: calc(100% - ${HEADER_WIDTH + SCROLLBAR_WIDTH}px);
50683
50822
  &.o-dragging {
50684
50823
  cursor: grabbing;
50685
50824
  }
@@ -50729,6 +50868,7 @@ class ColResizer extends AbstractResizer {
50729
50868
  onOpenContextMenu: Function,
50730
50869
  };
50731
50870
  static template = "o-spreadsheet-ColResizer";
50871
+ static components = { UnhideColumnHeaders };
50732
50872
  colResizerRef;
50733
50873
  setup() {
50734
50874
  super.setup();
@@ -50737,6 +50877,9 @@ class ColResizer extends AbstractResizer {
50737
50877
  this.MAX_SIZE_MARGIN = 90;
50738
50878
  this.MIN_ELEMENT_SIZE = MIN_COL_WIDTH;
50739
50879
  }
50880
+ get sheetId() {
50881
+ return this.env.model.getters.getActiveSheetId();
50882
+ }
50740
50883
  _getEvOffset(ev) {
50741
50884
  return ev.offsetX;
50742
50885
  }
@@ -50759,10 +50902,10 @@ class ColResizer extends AbstractResizer {
50759
50902
  return this.env.model.getters.getEdgeScrollCol(position, position, position);
50760
50903
  }
50761
50904
  _getDimensionsInViewport(index) {
50762
- return this.env.model.getters.getColDimensionsInViewport(this.env.model.getters.getActiveSheetId(), index);
50905
+ return this.env.model.getters.getColDimensionsInViewport(this.sheetId, index);
50763
50906
  }
50764
50907
  _getElementSize(index) {
50765
- return this.env.model.getters.getColSize(this.env.model.getters.getActiveSheetId(), index);
50908
+ return this.env.model.getters.getColSize(this.sheetId, index);
50766
50909
  }
50767
50910
  _getMaxSize() {
50768
50911
  return this.colResizerRef.el.clientWidth;
@@ -50773,7 +50916,7 @@ class ColResizer extends AbstractResizer {
50773
50916
  const cols = this.env.model.getters.getActiveCols();
50774
50917
  this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
50775
50918
  dimension: "COL",
50776
- sheetId: this.env.model.getters.getActiveSheetId(),
50919
+ sheetId: this.sheetId,
50777
50920
  elements: cols.has(index) ? [...cols] : [index],
50778
50921
  size,
50779
50922
  });
@@ -50786,7 +50929,7 @@ class ColResizer extends AbstractResizer {
50786
50929
  elements.push(colIndex);
50787
50930
  }
50788
50931
  const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
50789
- sheetId: this.env.model.getters.getActiveSheetId(),
50932
+ sheetId: this.sheetId,
50790
50933
  dimension: "COL",
50791
50934
  base: this.state.base,
50792
50935
  elements,
@@ -50805,7 +50948,7 @@ class ColResizer extends AbstractResizer {
50805
50948
  _fitElementSize(index) {
50806
50949
  const cols = this.env.model.getters.getActiveCols();
50807
50950
  this.env.model.dispatch("AUTORESIZE_COLUMNS", {
50808
- sheetId: this.env.model.getters.getActiveSheetId(),
50951
+ sheetId: this.sheetId,
50809
50952
  cols: cols.has(index) ? [...cols] : [index],
50810
50953
  });
50811
50954
  }
@@ -50816,7 +50959,7 @@ class ColResizer extends AbstractResizer {
50816
50959
  return this.env.model.getters.getActiveCols();
50817
50960
  }
50818
50961
  _getPreviousVisibleElement(index) {
50819
- const sheetId = this.env.model.getters.getActiveSheetId();
50962
+ const sheetId = this.sheetId;
50820
50963
  let row;
50821
50964
  for (row = index - 1; row >= 0; row--) {
50822
50965
  if (!this.env.model.getters.isColHidden(sheetId, row)) {
@@ -50827,13 +50970,38 @@ class ColResizer extends AbstractResizer {
50827
50970
  }
50828
50971
  unhide(hiddenElements) {
50829
50972
  this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50830
- sheetId: this.env.model.getters.getActiveSheetId(),
50973
+ sheetId: this.sheetId,
50831
50974
  elements: hiddenElements,
50832
50975
  dimension: "COL",
50833
50976
  });
50834
50977
  }
50835
- getUnhideButtonStyle(hiddenIndex) {
50836
- return cssPropertiesToCss({ left: this._getDimensionsInViewport(hiddenIndex).start + "px" });
50978
+ get mainUnhideHeadersProps() {
50979
+ const { left, right } = this.env.model.getters.getActiveMainViewport();
50980
+ const { xSplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
50981
+ const hiddenGroups = this.env.model.getters.getHiddenColsGroups(this.sheetId);
50982
+ const index = hiddenGroups.findIndex((group) => group[0] >= xSplit - 1);
50983
+ return {
50984
+ headersGroups: hiddenGroups.slice(index),
50985
+ offset: this.env.model.getters.getMainViewportCoordinates().x,
50986
+ headerRange: { start: left, end: right },
50987
+ };
50988
+ }
50989
+ get frozenUnhideHeadersProps() {
50990
+ const { xSplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
50991
+ const hiddenGroups = this.env.model.getters.getHiddenColsGroups(this.sheetId);
50992
+ const index = hiddenGroups.findIndex((group) => group[0] >= xSplit - 1);
50993
+ return {
50994
+ headersGroups: hiddenGroups.slice(0, index + 1),
50995
+ headerRange: { start: 0, end: xSplit - 1 },
50996
+ };
50997
+ }
50998
+ get frozenContainerStyle() {
50999
+ return cssPropertiesToCss({
51000
+ width: this.env.model.getters.getMainViewportCoordinates().x + "px",
51001
+ });
51002
+ }
51003
+ get hasFrozenPane() {
51004
+ return this.env.model.getters.getPaneDivisions(this.sheetId).xSplit > 0;
50837
51005
  }
50838
51006
  }
50839
51007
  css /* scss */ `
@@ -50843,7 +51011,7 @@ css /* scss */ `
50843
51011
  left: 0;
50844
51012
  right: 0;
50845
51013
  width: ${HEADER_WIDTH}px;
50846
- height: 100%;
51014
+ height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
50847
51015
  &.o-dragging {
50848
51016
  cursor: grabbing;
50849
51017
  }
@@ -50893,6 +51061,7 @@ class RowResizer extends AbstractResizer {
50893
51061
  onOpenContextMenu: Function,
50894
51062
  };
50895
51063
  static template = "o-spreadsheet-RowResizer";
51064
+ static components = { UnhideRowHeaders };
50896
51065
  setup() {
50897
51066
  super.setup();
50898
51067
  this.rowResizerRef = owl.useRef("rowResizer");
@@ -50901,6 +51070,9 @@ class RowResizer extends AbstractResizer {
50901
51070
  this.MIN_ELEMENT_SIZE = MIN_ROW_HEIGHT;
50902
51071
  }
50903
51072
  rowResizerRef;
51073
+ get sheetId() {
51074
+ return this.env.model.getters.getActiveSheetId();
51075
+ }
50904
51076
  _getEvOffset(ev) {
50905
51077
  return ev.offsetY;
50906
51078
  }
@@ -50923,10 +51095,10 @@ class RowResizer extends AbstractResizer {
50923
51095
  return this.env.model.getters.getEdgeScrollRow(position, position, position);
50924
51096
  }
50925
51097
  _getDimensionsInViewport(index) {
50926
- return this.env.model.getters.getRowDimensionsInViewport(this.env.model.getters.getActiveSheetId(), index);
51098
+ return this.env.model.getters.getRowDimensionsInViewport(this.sheetId, index);
50927
51099
  }
50928
51100
  _getElementSize(index) {
50929
- return this.env.model.getters.getRowSize(this.env.model.getters.getActiveSheetId(), index);
51101
+ return this.env.model.getters.getRowSize(this.sheetId, index);
50930
51102
  }
50931
51103
  _getMaxSize() {
50932
51104
  return this.rowResizerRef.el.clientHeight;
@@ -50937,7 +51109,7 @@ class RowResizer extends AbstractResizer {
50937
51109
  const rows = this.env.model.getters.getActiveRows();
50938
51110
  this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
50939
51111
  dimension: "ROW",
50940
- sheetId: this.env.model.getters.getActiveSheetId(),
51112
+ sheetId: this.sheetId,
50941
51113
  elements: rows.has(index) ? [...rows] : [index],
50942
51114
  size,
50943
51115
  });
@@ -50950,7 +51122,7 @@ class RowResizer extends AbstractResizer {
50950
51122
  elements.push(rowIndex);
50951
51123
  }
50952
51124
  const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
50953
- sheetId: this.env.model.getters.getActiveSheetId(),
51125
+ sheetId: this.sheetId,
50954
51126
  dimension: "ROW",
50955
51127
  base: this.state.base,
50956
51128
  elements,
@@ -50969,7 +51141,7 @@ class RowResizer extends AbstractResizer {
50969
51141
  _fitElementSize(index) {
50970
51142
  const rows = this.env.model.getters.getActiveRows();
50971
51143
  this.env.model.dispatch("AUTORESIZE_ROWS", {
50972
- sheetId: this.env.model.getters.getActiveSheetId(),
51144
+ sheetId: this.sheetId,
50973
51145
  rows: rows.has(index) ? [...rows] : [index],
50974
51146
  });
50975
51147
  }
@@ -50980,7 +51152,7 @@ class RowResizer extends AbstractResizer {
50980
51152
  return this.env.model.getters.getActiveRows();
50981
51153
  }
50982
51154
  _getPreviousVisibleElement(index) {
50983
- const sheetId = this.env.model.getters.getActiveSheetId();
51155
+ const sheetId = this.sheetId;
50984
51156
  let row;
50985
51157
  for (row = index - 1; row >= 0; row--) {
50986
51158
  if (!this.env.model.getters.isRowHidden(sheetId, row)) {
@@ -50989,15 +51161,33 @@ class RowResizer extends AbstractResizer {
50989
51161
  }
50990
51162
  return row;
50991
51163
  }
50992
- unhide(hiddenElements) {
50993
- this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50994
- sheetId: this.env.model.getters.getActiveSheetId(),
50995
- dimension: "ROW",
50996
- elements: hiddenElements,
51164
+ get mainUnhideHeadersProps() {
51165
+ const { top, bottom } = this.env.model.getters.getActiveMainViewport();
51166
+ const { ySplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
51167
+ const hiddenGroups = this.env.model.getters.getHiddenRowsGroups(this.sheetId);
51168
+ const index = hiddenGroups.findIndex((group) => group[0] >= ySplit - 1);
51169
+ return {
51170
+ headersGroups: hiddenGroups.slice(index),
51171
+ offset: this.env.model.getters.getMainViewportCoordinates().y,
51172
+ headerRange: { start: top, end: bottom },
51173
+ };
51174
+ }
51175
+ get frozenUnhideHeadersProps() {
51176
+ const { ySplit } = this.env.model.getters.getPaneDivisions(this.sheetId);
51177
+ const hiddenGroups = this.env.model.getters.getHiddenRowsGroups(this.sheetId);
51178
+ const index = hiddenGroups.findIndex((group) => group[0] >= ySplit - 1);
51179
+ return {
51180
+ headersGroups: hiddenGroups.slice(0, index + 1),
51181
+ headerRange: { start: 0, end: ySplit - 1 },
51182
+ };
51183
+ }
51184
+ get frozenContainerStyle() {
51185
+ return cssPropertiesToCss({
51186
+ height: this.env.model.getters.getMainViewportCoordinates().y + "px",
50997
51187
  });
50998
51188
  }
50999
- getUnhideButtonStyle(hiddenIndex) {
51000
- return cssPropertiesToCss({ top: this._getDimensionsInViewport(hiddenIndex).start + "px" });
51189
+ get hasFrozenPane() {
51190
+ return this.env.model.getters.getPaneDivisions(this.sheetId).ySplit > 0;
51001
51191
  }
51002
51192
  }
51003
51193
  css /* scss */ `
@@ -67767,7 +67957,7 @@ class InternalViewport {
67767
67957
  *
67768
67958
  */
67769
67959
  getFullRect(zone) {
67770
- const targetZone = intersection(zone, this);
67960
+ const targetZone = intersection(zone, this.boundaries);
67771
67961
  const scrollDeltaX = this.snapCorrection.x;
67772
67962
  const scrollDeltaY = this.snapCorrection.y;
67773
67963
  if (targetZone) {
@@ -68235,7 +68425,8 @@ class SheetViewPlugin extends UIPlugin {
68235
68425
  ? this.getters.getSheetViewVisibleCols()
68236
68426
  : this.getters.getSheetViewVisibleRows();
68237
68427
  const startIndex = visibleHeaders.findIndex((header) => referenceHeaderIndex >= header);
68238
- const endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
68428
+ let endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
68429
+ endIndex = endIndex === -1 ? visibleHeaders.length : endIndex;
68239
68430
  const relevantIndexes = visibleHeaders.slice(startIndex, endIndex);
68240
68431
  let offset = 0;
68241
68432
  for (const i of relevantIndexes) {
@@ -68360,11 +68551,12 @@ class SheetViewPlugin extends UIPlugin {
68360
68551
  * column of the current viewport
68361
68552
  */
68362
68553
  getColDimensionsInViewport(sheetId, col) {
68554
+ const { top } = this.getMainInternalViewport(sheetId);
68363
68555
  const zone = {
68364
68556
  left: col,
68365
68557
  right: col,
68366
- top: 0,
68367
- bottom: this.getters.getNumberRows(sheetId) - 1,
68558
+ top: top,
68559
+ bottom: top,
68368
68560
  };
68369
68561
  const { x, width } = this.getVisibleRect(zone);
68370
68562
  const start = x - this.gridOffsetX;
@@ -68375,9 +68567,10 @@ class SheetViewPlugin extends UIPlugin {
68375
68567
  * of the current viewport
68376
68568
  */
68377
68569
  getRowDimensionsInViewport(sheetId, row) {
68570
+ const { left } = this.getMainInternalViewport(sheetId);
68378
68571
  const zone = {
68379
68572
  left: 0,
68380
- right: this.getters.getNumberCols(sheetId) - 1,
68573
+ right: left,
68381
68574
  top: row,
68382
68575
  bottom: row,
68383
68576
  };
@@ -74329,7 +74522,7 @@ function addStyles(styles) {
74329
74522
  }
74330
74523
  if (alignAttrs.length > 0) {
74331
74524
  attributes.push(["applyAlignment", "1"]); // for Libre Office
74332
- styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}>${escapeXml /*xml*/ `<alignment ${formatAttributes(alignAttrs)} />`}</xf> `);
74525
+ styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}><alignment ${formatAttributes(alignAttrs)} /></xf> `);
74333
74526
  }
74334
74527
  else {
74335
74528
  styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)} />`);
@@ -74497,6 +74690,9 @@ function addColumns(cols) {
74497
74690
  }
74498
74691
  function addRows(construct, data, sheet) {
74499
74692
  const rowNodes = [];
74693
+ const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
74694
+ const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
74695
+ const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
74500
74696
  for (let r = 0; r < sheet.rowNumber; r++) {
74501
74697
  const rowAttrs = [["r", r + 1]];
74502
74698
  const row = sheet.rows[r] || {};
@@ -74512,9 +74708,6 @@ function addRows(construct, data, sheet) {
74512
74708
  if (row.collapsed) {
74513
74709
  rowAttrs.push(["collapsed", 1]);
74514
74710
  }
74515
- const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
74516
- const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
74517
- const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
74518
74711
  const cellNodes = [];
74519
74712
  for (let c = 0; c < sheet.colNumber; c++) {
74520
74713
  const xc = toXC(c, r);
@@ -75819,6 +76012,6 @@ exports.tokenColors = tokenColors;
75819
76012
  exports.tokenize = tokenize;
75820
76013
 
75821
76014
 
75822
- __info__.version = "18.2.2";
75823
- __info__.date = "2025-03-07T10:41:04.411Z";
75824
- __info__.hash = "f567932";
76015
+ __info__.version = "18.2.3";
76016
+ __info__.date = "2025-03-12T15:32:36.274Z";
76017
+ __info__.hash = "81b0e08";