@odoo/o-spreadsheet 18.2.8 → 18.2.10

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.8
6
- * @date 2025-04-18T16:26:20.673Z
7
- * @hash 5da9ddc
5
+ * @version 18.2.10
6
+ * @date 2025-05-02T12:34:39.632Z
7
+ * @hash e8ff3fc
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -3770,6 +3770,7 @@
3770
3770
  CommandResult["ValueCellIsInvalidFormula"] = "ValueCellIsInvalidFormula";
3771
3771
  CommandResult["InvalidDefinition"] = "InvalidDefinition";
3772
3772
  CommandResult["InvalidColor"] = "InvalidColor";
3773
+ CommandResult["InvalidPivotDataSet"] = "InvalidPivotDataSet";
3773
3774
  })(exports.CommandResult || (exports.CommandResult = {}));
3774
3775
 
3775
3776
  const DEFAULT_LOCALES = [
@@ -3842,11 +3843,13 @@
3842
3843
  NullError: "#NULL!",
3843
3844
  };
3844
3845
  const errorTypes = new Set(Object.values(CellErrorType));
3845
- class EvaluationError extends Error {
3846
+ class EvaluationError {
3847
+ message;
3846
3848
  value;
3847
3849
  constructor(message = _t("Error"), value = CellErrorType.GenericError) {
3848
- super(message);
3850
+ this.message = message;
3849
3851
  this.value = value;
3852
+ this.message = message.toString();
3850
3853
  }
3851
3854
  }
3852
3855
  class BadExpressionError extends EvaluationError {
@@ -10170,7 +10173,7 @@ stores.inject(MyMetaStore, storeInstance);
10170
10173
  const yMin = chart.chartArea.top;
10171
10174
  const textsPositions = {};
10172
10175
  for (const dataset of chart._metasets) {
10173
- if (isTrendLineAxis(dataset.axisID) || dataset.hidden) {
10176
+ if (isTrendLineAxis(dataset.xAxisID) || dataset.hidden) {
10174
10177
  continue;
10175
10178
  }
10176
10179
  for (let i = 0; i < dataset._parsed.length; i++) {
@@ -10213,7 +10216,7 @@ stores.inject(MyMetaStore, storeInstance);
10213
10216
  const xMin = chart.chartArea.left;
10214
10217
  const textsPositions = {};
10215
10218
  for (const dataset of chart._metasets) {
10216
- if (isTrendLineAxis(dataset.axisID)) {
10219
+ if (isTrendLineAxis(dataset.xAxisID)) {
10217
10220
  return; // ignore trend lines
10218
10221
  }
10219
10222
  for (let i = 0; i < dataset._parsed.length; i++) {
@@ -10338,6 +10341,7 @@ stores.inject(MyMetaStore, storeInstance);
10338
10341
  canvas = owl.useRef("graphContainer");
10339
10342
  chart;
10340
10343
  currentRuntime;
10344
+ currentDevicePixelRatio = window.devicePixelRatio;
10341
10345
  get background() {
10342
10346
  return this.chartRuntime.background;
10343
10347
  }
@@ -10371,6 +10375,10 @@ stores.inject(MyMetaStore, storeInstance);
10371
10375
  }
10372
10376
  this.currentRuntime = runtime;
10373
10377
  }
10378
+ else if (this.currentDevicePixelRatio !== window.devicePixelRatio) {
10379
+ this.currentDevicePixelRatio = window.devicePixelRatio;
10380
+ this.updateChartJs(deepCopy(this.currentRuntime.chartJsConfig));
10381
+ }
10374
10382
  });
10375
10383
  }
10376
10384
  createChart(chartData) {
@@ -10626,9 +10634,11 @@ stores.inject(MyMetaStore, storeInstance);
10626
10634
  };
10627
10635
  function drawScoreChart(structure, canvas) {
10628
10636
  const ctx = canvas.getContext("2d");
10629
- canvas.width = structure.canvas.width;
10630
- const availableWidth = canvas.width - CHART_PADDING$1 * 2;
10631
- canvas.height = structure.canvas.height;
10637
+ const dpr = window.devicePixelRatio || 1;
10638
+ canvas.width = dpr * structure.canvas.width;
10639
+ canvas.height = dpr * structure.canvas.height;
10640
+ ctx.scale(dpr, dpr);
10641
+ const availableWidth = structure.canvas.width - CHART_PADDING$1 * 2;
10632
10642
  ctx.fillStyle = structure.canvas.backgroundColor;
10633
10643
  ctx.fillRect(0, 0, structure.canvas.width, structure.canvas.height);
10634
10644
  if (structure.title) {
@@ -10991,7 +11001,7 @@ stores.inject(MyMetaStore, storeInstance);
10991
11001
  owl.useEffect(this.createChart.bind(this), () => {
10992
11002
  const canvas = this.canvas.el;
10993
11003
  const rect = canvas.getBoundingClientRect();
10994
- return [rect.width, rect.height, this.runtime, this.canvas.el];
11004
+ return [rect.width, rect.height, this.runtime, this.canvas.el, window.devicePixelRatio];
10995
11005
  });
10996
11006
  }
10997
11007
  createChart() {
@@ -13751,7 +13761,7 @@ stores.inject(MyMetaStore, storeInstance);
13751
13761
  }
13752
13762
  }
13753
13763
  if (!found) {
13754
- throw new NotAvailableError(_t("Value not found in the given data."));
13764
+ return new NotAvailableError(_t("Value not found in the given data."));
13755
13765
  }
13756
13766
  return rank;
13757
13767
  },
@@ -15491,7 +15501,7 @@ stores.inject(MyMetaStore, storeInstance);
15491
15501
  result.push(row.data);
15492
15502
  }
15493
15503
  if (!result.length)
15494
- throw new EvaluationError(_t("No unique values found"));
15504
+ return new EvaluationError(_t("No unique values found"));
15495
15505
  return _byColumn ? result : transposeMatrix(result);
15496
15506
  },
15497
15507
  isExported: true,
@@ -19270,7 +19280,7 @@ stores.inject(MyMetaStore, storeInstance);
19270
19280
  }
19271
19281
  const _cellReference = cellReference?.value;
19272
19282
  if (!_cellReference) {
19273
- throw new Error("In this context, the function OFFSET needs to have a cell or range in parameter.");
19283
+ return new EvaluationError("In this context, the function OFFSET needs to have a cell or range in parameter.");
19274
19284
  }
19275
19285
  const zone = toZone(_cellReference);
19276
19286
  let offsetHeight = zone.bottom - zone.top + 1;
@@ -22580,9 +22590,11 @@ stores.inject(MyMetaStore, storeInstance);
22580
22590
  const GAUGE_TITLE_SECTION_HEIGHT = 25;
22581
22591
  function drawGaugeChart(canvas, runtime) {
22582
22592
  const canvasBoundingRect = canvas.getBoundingClientRect();
22583
- canvas.width = canvasBoundingRect.width;
22584
- canvas.height = canvasBoundingRect.height;
22593
+ const dpr = window.devicePixelRatio || 1;
22594
+ canvas.width = dpr * canvasBoundingRect.width;
22595
+ canvas.height = dpr * canvasBoundingRect.height;
22585
22596
  const ctx = canvas.getContext("2d");
22597
+ ctx.scale(dpr, dpr);
22586
22598
  const config = getGaugeRenderingConfig(canvasBoundingRect, runtime, ctx);
22587
22599
  drawBackground(ctx, config);
22588
22600
  drawGauge(ctx, config);
@@ -22917,7 +22929,7 @@ stores.inject(MyMetaStore, storeInstance);
22917
22929
  owl.useEffect(() => drawGaugeChart(this.canvas.el, this.runtime), () => {
22918
22930
  const canvas = this.canvas.el;
22919
22931
  const rect = canvas.getBoundingClientRect();
22920
- return [rect.width, rect.height, this.runtime, this.canvas.el];
22932
+ return [rect.width, rect.height, this.runtime, this.canvas.el, window.devicePixelRatio];
22921
22933
  });
22922
22934
  }
22923
22935
  }
@@ -29580,7 +29592,7 @@ stores.inject(MyMetaStore, storeInstance);
29580
29592
  };
29581
29593
  scales[MOVING_AVERAGE_TREND_LINE_XAXIS_ID] = {
29582
29594
  ...scales.x,
29583
- offset: false,
29595
+ offset: true,
29584
29596
  display: false,
29585
29597
  };
29586
29598
  }
@@ -30300,9 +30312,6 @@ stores.inject(MyMetaStore, storeInstance);
30300
30312
  };
30301
30313
  }
30302
30314
  getDefinitionForExcel() {
30303
- // Excel does not support aggregating labels
30304
- if (this.aggregated)
30305
- return undefined;
30306
30315
  const dataSets = this.dataSets
30307
30316
  .map((ds) => toExcelDataset(this.getters, ds))
30308
30317
  .filter((ds) => ds.range !== "" && ds.range !== CellErrorType.InvalidReference);
@@ -31017,9 +31026,6 @@ stores.inject(MyMetaStore, storeInstance);
31017
31026
  return new LineChart(definition, this.sheetId, this.getters);
31018
31027
  }
31019
31028
  getDefinitionForExcel() {
31020
- // Excel does not support aggregating labels
31021
- if (this.aggregated)
31022
- return undefined;
31023
31029
  const dataSets = this.dataSets
31024
31030
  .map((ds) => toExcelDataset(this.getters, ds))
31025
31031
  .filter((ds) => ds.range !== "" && ds.range !== CellErrorType.InvalidReference);
@@ -31156,9 +31162,6 @@ stores.inject(MyMetaStore, storeInstance);
31156
31162
  return new PieChart(definition, sheetId, this.getters);
31157
31163
  }
31158
31164
  getDefinitionForExcel() {
31159
- // Excel does not support aggregating labels
31160
- if (this.aggregated)
31161
- return undefined;
31162
31165
  const dataSets = this.dataSets
31163
31166
  .map((ds) => toExcelDataset(this.getters, ds))
31164
31167
  .filter((ds) => ds.range !== "" && ds.range !== CellErrorType.InvalidReference);
@@ -33657,18 +33660,28 @@ stores.inject(MyMetaStore, storeInstance);
33657
33660
  function useInterval(callback, delay) {
33658
33661
  let intervalId;
33659
33662
  const { setInterval, clearInterval } = window;
33663
+ const pause = () => {
33664
+ clearInterval(intervalId);
33665
+ intervalId = undefined;
33666
+ };
33667
+ const safeCallback = () => {
33668
+ try {
33669
+ callback();
33670
+ }
33671
+ catch (e) {
33672
+ pause();
33673
+ throw e;
33674
+ }
33675
+ };
33660
33676
  owl.useEffect(() => {
33661
- intervalId = setInterval(callback, delay);
33677
+ intervalId = setInterval(safeCallback, delay);
33662
33678
  return () => clearInterval(intervalId);
33663
33679
  }, () => [delay]);
33664
33680
  return {
33665
- pause: () => {
33666
- clearInterval(intervalId);
33667
- intervalId = undefined;
33668
- },
33681
+ pause,
33669
33682
  resume: () => {
33670
33683
  if (intervalId === undefined) {
33671
- intervalId = setInterval(callback, delay);
33684
+ intervalId = setInterval(safeCallback, delay);
33672
33685
  }
33673
33686
  },
33674
33687
  };
@@ -38449,8 +38462,11 @@ stores.inject(MyMetaStore, storeInstance);
38449
38462
  }
38450
38463
  removeInput(rangeId) {
38451
38464
  const index = this.store.selectionInputs.findIndex((range) => range.id === rangeId);
38452
- this.props.onSelectionRemoved?.(index);
38453
- this.props.onSelectionConfirmed?.();
38465
+ if (this.ranges.find((range) => range.id === rangeId)?.xc) {
38466
+ this.props.onSelectionRemoved?.(index);
38467
+ this.props.onSelectionConfirmed?.();
38468
+ }
38469
+ this.store.removeRange(rangeId);
38454
38470
  }
38455
38471
  onInputChanged(rangeId, ev) {
38456
38472
  const target = ev.target;
@@ -39116,7 +39132,7 @@ stores.inject(MyMetaStore, storeInstance);
39116
39132
  }
39117
39133
  setHexColor(ev) {
39118
39134
  // only support HEX code input
39119
- const val = ev.target.value.slice(0, 7);
39135
+ const val = ev.target.value.replace("##", "#").slice(0, 7);
39120
39136
  this.state.customHexColor = val;
39121
39137
  if (!isColorValid(val)) ;
39122
39138
  else {
@@ -50850,7 +50866,7 @@ stores.inject(MyMetaStore, storeInstance);
50850
50866
  position: absolute;
50851
50867
  top: 0;
50852
50868
  left: ${HEADER_WIDTH}px;
50853
- right: 0;
50869
+ right: ${SCROLLBAR_WIDTH}px;
50854
50870
  height: ${HEADER_HEIGHT}px;
50855
50871
  width: calc(100% - ${HEADER_WIDTH + SCROLLBAR_WIDTH}px);
50856
50872
  &.o-dragging {
@@ -51043,9 +51059,8 @@ stores.inject(MyMetaStore, storeInstance);
51043
51059
  position: absolute;
51044
51060
  top: ${HEADER_HEIGHT}px;
51045
51061
  left: 0;
51046
- right: 0;
51062
+ bottom: ${SCROLLBAR_WIDTH}px;
51047
51063
  width: ${HEADER_WIDTH}px;
51048
- height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
51049
51064
  &.o-dragging {
51050
51065
  cursor: grabbing;
51051
51066
  }
@@ -59093,6 +59108,15 @@ stores.inject(MyMetaStore, storeInstance);
59093
59108
  }
59094
59109
  }
59095
59110
  class SpreadsheetPivotCorePlugin extends CorePlugin {
59111
+ allowDispatch(cmd) {
59112
+ switch (cmd.type) {
59113
+ case "ADD_PIVOT":
59114
+ case "UPDATE_PIVOT":
59115
+ const definition = cmd.pivot;
59116
+ return this.checkDataSetValidity(definition);
59117
+ }
59118
+ return "Success" /* CommandResult.Success */;
59119
+ }
59096
59120
  adaptRanges(applyChange) {
59097
59121
  for (const pivotId of this.getters.getPivotIds()) {
59098
59122
  const definition = this.getters.getPivotCoreDefinition(pivotId);
@@ -59111,6 +59135,16 @@ stores.inject(MyMetaStore, storeInstance);
59111
59135
  }
59112
59136
  }
59113
59137
  }
59138
+ checkDataSetValidity(definition) {
59139
+ if (definition.type === "SPREADSHEET" && definition.dataSet) {
59140
+ const { zone, sheetId } = definition.dataSet;
59141
+ if (!sheetId || !this.getters.tryGetSheet(sheetId) || !zone || !isZoneValid(zone)) {
59142
+ return "InvalidDataSet" /* CommandResult.InvalidDataSet */;
59143
+ }
59144
+ return this.getters.checkZonesExistInSheet(sheetId, [zone]);
59145
+ }
59146
+ return "Success" /* CommandResult.Success */;
59147
+ }
59114
59148
  }
59115
59149
 
59116
59150
  class TableStylePlugin extends CorePlugin {
@@ -61901,7 +61935,7 @@ stores.inject(MyMetaStore, storeInstance);
61901
61935
  tables = {};
61902
61936
  handle(cmd) {
61903
61937
  if (invalidateEvaluationCommands.has(cmd.type) ||
61904
- (cmd.type === "UPDATE_CELL" && "content" in cmd) ||
61938
+ (cmd.type === "UPDATE_CELL" && ("content" in cmd || "format" in cmd)) ||
61905
61939
  cmd.type === "EVALUATE_CELLS") {
61906
61940
  this.tables = {};
61907
61941
  return;
@@ -62334,6 +62368,16 @@ stores.inject(MyMetaStore, storeInstance);
62334
62368
  }
62335
62369
  return values;
62336
62370
  }
62371
+ else if (rowDomain.length === this.definition.rows.length &&
62372
+ colDomain.length &&
62373
+ colDomain.length < this.definition.columns.length) {
62374
+ const colSubTree = this.getSubTreeMatchingDomain(table.getColTree(), colDomain);
62375
+ const domains = this.treeToLeafDomains(colSubTree, colDomain);
62376
+ for (const domain of domains) {
62377
+ values.push(this._getPivotCellValueAndFormat(measure.id, rowDomain.concat(domain)));
62378
+ }
62379
+ return values;
62380
+ }
62337
62381
  else {
62338
62382
  const tree = table.getRowTree();
62339
62383
  const subTree = this.getSubTreeMatchingDomain(tree, rowDomain);
@@ -65763,7 +65807,7 @@ stores.inject(MyMetaStore, storeInstance);
65763
65807
  tableStyles = {};
65764
65808
  handle(cmd) {
65765
65809
  if (invalidateEvaluationCommands.has(cmd.type) ||
65766
- (cmd.type === "UPDATE_CELL" && "content" in cmd) ||
65810
+ (cmd.type === "UPDATE_CELL" && ("content" in cmd || "format" in cmd)) ||
65767
65811
  cmd.type === "EVALUATE_CELLS") {
65768
65812
  this.tableStyles = {};
65769
65813
  return;
@@ -67724,6 +67768,8 @@ stores.inject(MyMetaStore, storeInstance);
67724
67768
  });
67725
67769
  this.selectCell(col, row);
67726
67770
  }
67771
+ const { col, row } = this.gridSelection.anchor.cell;
67772
+ this.moveClient({ sheetId: this.activeSheet.id, col, row });
67727
67773
  }
67728
67774
  /**
67729
67775
  * Ensure selections are not outside sheet boundaries.
@@ -68439,8 +68485,11 @@ stores.inject(MyMetaStore, storeInstance);
68439
68485
  case "REMOVE_TABLE":
68440
68486
  case "UPDATE_TABLE":
68441
68487
  case "UPDATE_FILTER":
68442
- this.sheetsWithDirtyViewports.add(cmd.sheetId);
68443
- break;
68488
+ case "UNFREEZE_ROWS":
68489
+ case "UNFREEZE_COLUMNS":
68490
+ case "FREEZE_COLUMNS":
68491
+ case "FREEZE_ROWS":
68492
+ case "UNFREEZE_COLUMNS_ROWS":
68444
68493
  case "REMOVE_COLUMNS_ROWS":
68445
68494
  case "RESIZE_COLUMNS_ROWS":
68446
68495
  case "HIDE_COLUMNS_ROWS":
@@ -68453,11 +68502,9 @@ stores.inject(MyMetaStore, storeInstance);
68453
68502
  case "FOLD_HEADER_GROUPS_IN_ZONE":
68454
68503
  case "UNFOLD_HEADER_GROUPS_IN_ZONE":
68455
68504
  case "UNFOLD_ALL_HEADER_GROUPS":
68456
- case "FOLD_ALL_HEADER_GROUPS": {
68457
- const sheetId = "sheetId" in cmd ? cmd.sheetId : this.getters.getActiveSheetId();
68458
- this.sheetsWithDirtyViewports.add(sheetId);
68505
+ case "FOLD_ALL_HEADER_GROUPS":
68506
+ this.sheetsWithDirtyViewports.add(cmd.sheetId);
68459
68507
  break;
68460
- }
68461
68508
  case "UPDATE_CELL":
68462
68509
  // update cell content or format can change hidden rows because of data filters
68463
68510
  if ("content" in cmd || "format" in cmd || cmd.style?.fontSize !== undefined) {
@@ -68473,13 +68520,6 @@ stores.inject(MyMetaStore, storeInstance);
68473
68520
  case "ACTIVATE_SHEET":
68474
68521
  this.sheetsWithDirtyViewports.add(cmd.sheetIdTo);
68475
68522
  break;
68476
- case "UNFREEZE_ROWS":
68477
- case "UNFREEZE_COLUMNS":
68478
- case "FREEZE_COLUMNS":
68479
- case "FREEZE_ROWS":
68480
- case "UNFREEZE_COLUMNS_ROWS":
68481
- this.resetViewports(this.getters.getActiveSheetId());
68482
- break;
68483
68523
  case "SCROLL_TO_CELL":
68484
68524
  this.refreshViewport(this.getters.getActiveSheetId(), { col: cmd.col, row: cmd.row });
68485
68525
  break;
@@ -69647,7 +69687,7 @@ stores.inject(MyMetaStore, storeInstance);
69647
69687
  }
69648
69688
  handle(cmd) {
69649
69689
  if (invalidateEvaluationCommands.has(cmd.type) ||
69650
- (cmd.type === "UPDATE_CELL" && "content" in cmd)) {
69690
+ (cmd.type === "UPDATE_CELL" && ("content" in cmd || "format" in cmd))) {
69651
69691
  this.isDirty = true;
69652
69692
  }
69653
69693
  switch (cmd.type) {
@@ -76229,9 +76269,9 @@ stores.inject(MyMetaStore, storeInstance);
76229
76269
  exports.tokenize = tokenize;
76230
76270
 
76231
76271
 
76232
- __info__.version = "18.2.8";
76233
- __info__.date = "2025-04-18T16:26:20.673Z";
76234
- __info__.hash = "5da9ddc";
76272
+ __info__.version = "18.2.10";
76273
+ __info__.date = "2025-05-02T12:34:39.632Z";
76274
+ __info__.hash = "e8ff3fc";
76235
76275
 
76236
76276
 
76237
76277
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);