@odoo/o-spreadsheet 18.1.10 → 18.1.11

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.11
6
+ * @date 2025-03-12T15:31:44.276Z
7
+ * @hash 7de2363
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
@@ -8279,7 +8324,8 @@ function isSortedColumnValid(sortedColumn, pivot) {
8279
8324
  const possibleValues = pivot
8280
8325
  .getPossibleFieldValues(columns[i])
8281
8326
  .map((v) => v.value);
8282
- if (!possibleValues.includes(sortedColumn.domain[i].value)) {
8327
+ if (!possibleValues.includes(sortedColumn.domain[i].value) &&
8328
+ !(sortedColumn.domain[i].value === null && possibleValues.includes(""))) {
8283
8329
  return false;
8284
8330
  }
8285
8331
  }
@@ -11154,6 +11200,7 @@ class ScorecardChart extends Component {
11154
11200
  const autoCompleteProviders = new Registry();
11155
11201
 
11156
11202
  autoCompleteProviders.add("dataValidation", {
11203
+ displayAllOnInitialContent: true,
11157
11204
  getProposals(tokenAtCursor, content) {
11158
11205
  if (content.startsWith("=")) {
11159
11206
  return [];
@@ -21450,6 +21497,15 @@ class AbstractComposerStore extends SpreadsheetStore {
21450
21497
  const exactMatch = proposals?.find((p) => p.text === tokenAtCursor.value);
21451
21498
  // remove tokens that are likely to be other parts of the formula that slipped in the token if it's a string
21452
21499
  const searchTerm = tokenAtCursor.value.replace(/[ ,\(\)]/g, "");
21500
+ if (this._currentContent === this.initialContent &&
21501
+ provider.displayAllOnInitialContent &&
21502
+ proposals?.length) {
21503
+ return {
21504
+ proposals,
21505
+ selectProposal: provider.selectProposal,
21506
+ autoSelectFirstProposal: provider.autoSelectFirstProposal ?? false,
21507
+ };
21508
+ }
21453
21509
  if (exactMatch && this._currentContent !== this.initialContent) {
21454
21510
  // this means the user has chosen a proposal
21455
21511
  return;
@@ -24335,16 +24391,25 @@ function addRelsToFile(relsFiles, path, rel) {
24335
24391
  }
24336
24392
  return id;
24337
24393
  }
24394
+ const globalReverseLookup = new WeakMap();
24338
24395
  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;
24396
+ let reverseLookup = globalReverseLookup.get(propertyList);
24397
+ if (!reverseLookup) {
24398
+ reverseLookup = new Map();
24399
+ for (let i = 0; i < propertyList.length; i++) {
24400
+ const canonical = getCanonicalRepresentation(propertyList[i]);
24401
+ reverseLookup.set(canonical, i);
24344
24402
  }
24403
+ globalReverseLookup.set(propertyList, reverseLookup);
24404
+ }
24405
+ const canonical = getCanonicalRepresentation(property);
24406
+ if (reverseLookup.has(canonical)) {
24407
+ return reverseLookup.get(canonical);
24345
24408
  }
24346
- propertyList[propertyList.length] = property;
24347
- return propertyList.length - 1;
24409
+ const maxId = propertyList.length;
24410
+ propertyList.push(property);
24411
+ reverseLookup.set(canonical, maxId);
24412
+ return maxId;
24348
24413
  }
24349
24414
  const chartIds = [];
24350
24415
  /**
@@ -26191,7 +26256,7 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
26191
26256
  title: { text: chartTitle },
26192
26257
  type: CHART_TYPE_CONVERSION_MAP[chartType],
26193
26258
  dataSets: this.extractChartDatasets(this.querySelectorAll(rootChartElement, `c:${chartType}`), chartType),
26194
- labelRange: this.extractChildTextContent(rootChartElement, `c:ser ${chartType === "scatterChart" ? "c:numRef" : "c:cat"} c:f`),
26259
+ labelRange: this.extractLabelRange(chartType, rootChartElement),
26195
26260
  backgroundColor: this.extractChildAttr(rootChartElement, "c:chartSpace > c:spPr a:srgbClr", "val", {
26196
26261
  default: "ffffff",
26197
26262
  }).asString(),
@@ -26203,6 +26268,13 @@ class XlsxChartExtractor extends XlsxBaseExtractor {
26203
26268
  };
26204
26269
  })[0];
26205
26270
  }
26271
+ extractLabelRange(chartType, rootChartElement) {
26272
+ if (chartType === "scatterChart") {
26273
+ return (this.extractChildTextContent(rootChartElement, `c:ser c:strRef c:f`) ||
26274
+ this.extractChildTextContent(rootChartElement, `c:ser c:numRef c:f`));
26275
+ }
26276
+ return this.extractChildTextContent(rootChartElement, `c:ser c:cat c:f`);
26277
+ }
26206
26278
  extractComboChart(chartElement) {
26207
26279
  // Title can be separated into multiple xml elements (for styling and such), we only import the text
26208
26280
  const chartTitle = this.mapOnElements({ parent: chartElement, query: "c:title a:t" }, (textElement) => {
@@ -36204,6 +36276,7 @@ const irregularityMap = {
36204
36276
  fingerprintStore.enable();
36205
36277
  }
36206
36278
  },
36279
+ isReadonlyAllowed: true,
36207
36280
  icon: "o-spreadsheet-Icon.IRREGULARITY_MAP",
36208
36281
  };
36209
36282
  const viewFormulas = {
@@ -50409,6 +50482,9 @@ class ColResizer extends AbstractResizer {
50409
50482
  this.MAX_SIZE_MARGIN = 90;
50410
50483
  this.MIN_ELEMENT_SIZE = MIN_COL_WIDTH;
50411
50484
  }
50485
+ get sheetId() {
50486
+ return this.env.model.getters.getActiveSheetId();
50487
+ }
50412
50488
  _getEvOffset(ev) {
50413
50489
  return ev.offsetX;
50414
50490
  }
@@ -50431,10 +50507,10 @@ class ColResizer extends AbstractResizer {
50431
50507
  return this.env.model.getters.getEdgeScrollCol(position, position, position);
50432
50508
  }
50433
50509
  _getDimensionsInViewport(index) {
50434
- return this.env.model.getters.getColDimensionsInViewport(this.env.model.getters.getActiveSheetId(), index);
50510
+ return this.env.model.getters.getColDimensionsInViewport(this.sheetId, index);
50435
50511
  }
50436
50512
  _getElementSize(index) {
50437
- return this.env.model.getters.getColSize(this.env.model.getters.getActiveSheetId(), index);
50513
+ return this.env.model.getters.getColSize(this.sheetId, index);
50438
50514
  }
50439
50515
  _getMaxSize() {
50440
50516
  return this.colResizerRef.el.clientWidth;
@@ -50445,7 +50521,7 @@ class ColResizer extends AbstractResizer {
50445
50521
  const cols = this.env.model.getters.getActiveCols();
50446
50522
  this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
50447
50523
  dimension: "COL",
50448
- sheetId: this.env.model.getters.getActiveSheetId(),
50524
+ sheetId: this.sheetId,
50449
50525
  elements: cols.has(index) ? [...cols] : [index],
50450
50526
  size,
50451
50527
  });
@@ -50458,7 +50534,7 @@ class ColResizer extends AbstractResizer {
50458
50534
  elements.push(colIndex);
50459
50535
  }
50460
50536
  const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
50461
- sheetId: this.env.model.getters.getActiveSheetId(),
50537
+ sheetId: this.sheetId,
50462
50538
  dimension: "COL",
50463
50539
  base: this.state.base,
50464
50540
  elements,
@@ -50477,7 +50553,7 @@ class ColResizer extends AbstractResizer {
50477
50553
  _fitElementSize(index) {
50478
50554
  const cols = this.env.model.getters.getActiveCols();
50479
50555
  this.env.model.dispatch("AUTORESIZE_COLUMNS", {
50480
- sheetId: this.env.model.getters.getActiveSheetId(),
50556
+ sheetId: this.sheetId,
50481
50557
  cols: cols.has(index) ? [...cols] : [index],
50482
50558
  });
50483
50559
  }
@@ -50488,7 +50564,7 @@ class ColResizer extends AbstractResizer {
50488
50564
  return this.env.model.getters.getActiveCols();
50489
50565
  }
50490
50566
  _getPreviousVisibleElement(index) {
50491
- const sheetId = this.env.model.getters.getActiveSheetId();
50567
+ const sheetId = this.sheetId;
50492
50568
  let row;
50493
50569
  for (row = index - 1; row >= 0; row--) {
50494
50570
  if (!this.env.model.getters.isColHidden(sheetId, row)) {
@@ -50499,7 +50575,7 @@ class ColResizer extends AbstractResizer {
50499
50575
  }
50500
50576
  unhide(hiddenElements) {
50501
50577
  this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50502
- sheetId: this.env.model.getters.getActiveSheetId(),
50578
+ sheetId: this.sheetId,
50503
50579
  elements: hiddenElements,
50504
50580
  dimension: "COL",
50505
50581
  });
@@ -50515,7 +50591,7 @@ css /* scss */ `
50515
50591
  left: 0;
50516
50592
  right: 0;
50517
50593
  width: ${HEADER_WIDTH}px;
50518
- height: 100%;
50594
+ height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
50519
50595
  &.o-dragging {
50520
50596
  cursor: grabbing;
50521
50597
  }
@@ -50573,6 +50649,9 @@ class RowResizer extends AbstractResizer {
50573
50649
  this.MIN_ELEMENT_SIZE = MIN_ROW_HEIGHT;
50574
50650
  }
50575
50651
  rowResizerRef;
50652
+ get sheetId() {
50653
+ return this.env.model.getters.getActiveSheetId();
50654
+ }
50576
50655
  _getEvOffset(ev) {
50577
50656
  return ev.offsetY;
50578
50657
  }
@@ -50595,10 +50674,10 @@ class RowResizer extends AbstractResizer {
50595
50674
  return this.env.model.getters.getEdgeScrollRow(position, position, position);
50596
50675
  }
50597
50676
  _getDimensionsInViewport(index) {
50598
- return this.env.model.getters.getRowDimensionsInViewport(this.env.model.getters.getActiveSheetId(), index);
50677
+ return this.env.model.getters.getRowDimensionsInViewport(this.sheetId, index);
50599
50678
  }
50600
50679
  _getElementSize(index) {
50601
- return this.env.model.getters.getRowSize(this.env.model.getters.getActiveSheetId(), index);
50680
+ return this.env.model.getters.getRowSize(this.sheetId, index);
50602
50681
  }
50603
50682
  _getMaxSize() {
50604
50683
  return this.rowResizerRef.el.clientHeight;
@@ -50609,7 +50688,7 @@ class RowResizer extends AbstractResizer {
50609
50688
  const rows = this.env.model.getters.getActiveRows();
50610
50689
  this.env.model.dispatch("RESIZE_COLUMNS_ROWS", {
50611
50690
  dimension: "ROW",
50612
- sheetId: this.env.model.getters.getActiveSheetId(),
50691
+ sheetId: this.sheetId,
50613
50692
  elements: rows.has(index) ? [...rows] : [index],
50614
50693
  size,
50615
50694
  });
@@ -50622,7 +50701,7 @@ class RowResizer extends AbstractResizer {
50622
50701
  elements.push(rowIndex);
50623
50702
  }
50624
50703
  const result = this.env.model.dispatch("MOVE_COLUMNS_ROWS", {
50625
- sheetId: this.env.model.getters.getActiveSheetId(),
50704
+ sheetId: this.sheetId,
50626
50705
  dimension: "ROW",
50627
50706
  base: this.state.base,
50628
50707
  elements,
@@ -50641,7 +50720,7 @@ class RowResizer extends AbstractResizer {
50641
50720
  _fitElementSize(index) {
50642
50721
  const rows = this.env.model.getters.getActiveRows();
50643
50722
  this.env.model.dispatch("AUTORESIZE_ROWS", {
50644
- sheetId: this.env.model.getters.getActiveSheetId(),
50723
+ sheetId: this.sheetId,
50645
50724
  rows: rows.has(index) ? [...rows] : [index],
50646
50725
  });
50647
50726
  }
@@ -50652,7 +50731,7 @@ class RowResizer extends AbstractResizer {
50652
50731
  return this.env.model.getters.getActiveRows();
50653
50732
  }
50654
50733
  _getPreviousVisibleElement(index) {
50655
- const sheetId = this.env.model.getters.getActiveSheetId();
50734
+ const sheetId = this.sheetId;
50656
50735
  let row;
50657
50736
  for (row = index - 1; row >= 0; row--) {
50658
50737
  if (!this.env.model.getters.isRowHidden(sheetId, row)) {
@@ -50663,7 +50742,7 @@ class RowResizer extends AbstractResizer {
50663
50742
  }
50664
50743
  unhide(hiddenElements) {
50665
50744
  this.env.model.dispatch("UNHIDE_COLUMNS_ROWS", {
50666
- sheetId: this.env.model.getters.getActiveSheetId(),
50745
+ sheetId: this.sheetId,
50667
50746
  dimension: "ROW",
50668
50747
  elements: hiddenElements,
50669
50748
  });
@@ -67902,7 +67981,8 @@ class SheetViewPlugin extends UIPlugin {
67902
67981
  ? this.getters.getSheetViewVisibleCols()
67903
67982
  : this.getters.getSheetViewVisibleRows();
67904
67983
  const startIndex = visibleHeaders.findIndex((header) => referenceHeaderIndex >= header);
67905
- const endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
67984
+ let endIndex = visibleHeaders.findIndex((header) => targetHeaderIndex <= header);
67985
+ endIndex = endIndex === -1 ? visibleHeaders.length : endIndex;
67906
67986
  const relevantIndexes = visibleHeaders.slice(startIndex, endIndex);
67907
67987
  let offset = 0;
67908
67988
  for (const i of relevantIndexes) {
@@ -74009,7 +74089,7 @@ function addStyles(styles) {
74009
74089
  }
74010
74090
  if (alignAttrs.length > 0) {
74011
74091
  attributes.push(["applyAlignment", "1"]); // for Libre Office
74012
- styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}>${escapeXml /*xml*/ `<alignment ${formatAttributes(alignAttrs)} />`}</xf> `);
74092
+ styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)}><alignment ${formatAttributes(alignAttrs)} /></xf> `);
74013
74093
  }
74014
74094
  else {
74015
74095
  styleNodes.push(escapeXml /*xml*/ `<xf ${formatAttributes(attributes)} />`);
@@ -74177,6 +74257,9 @@ function addColumns(cols) {
74177
74257
  }
74178
74258
  function addRows(construct, data, sheet) {
74179
74259
  const rowNodes = [];
74260
+ const styles = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.styles));
74261
+ const borders = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.borders));
74262
+ const formats = new PositionMap(iterateItemIdsPositions(sheet.id, sheet.formats));
74180
74263
  for (let r = 0; r < sheet.rowNumber; r++) {
74181
74264
  const rowAttrs = [["r", r + 1]];
74182
74265
  const row = sheet.rows[r] || {};
@@ -74192,9 +74275,6 @@ function addRows(construct, data, sheet) {
74192
74275
  if (row.collapsed) {
74193
74276
  rowAttrs.push(["collapsed", 1]);
74194
74277
  }
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
74278
  const cellNodes = [];
74199
74279
  for (let c = 0; c < sheet.colNumber; c++) {
74200
74280
  const xc = toXC(c, r);
@@ -75422,6 +75502,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
75422
75502
  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
75503
 
75424
75504
 
75425
- __info__.version = "18.1.10";
75426
- __info__.date = "2025-03-07T10:34:41.861Z";
75427
- __info__.hash = "31e4526";
75505
+ __info__.version = "18.1.11";
75506
+ __info__.date = "2025-03-12T15:31:44.276Z";
75507
+ __info__.hash = "7de2363";