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