@odoo/o-spreadsheet 18.2.9 → 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.9
6
- * @date 2025-04-25T08:06:52.677Z
7
- * @hash 3e88645
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 = [
@@ -10172,7 +10173,7 @@ stores.inject(MyMetaStore, storeInstance);
10172
10173
  const yMin = chart.chartArea.top;
10173
10174
  const textsPositions = {};
10174
10175
  for (const dataset of chart._metasets) {
10175
- if (isTrendLineAxis(dataset.axisID) || dataset.hidden) {
10176
+ if (isTrendLineAxis(dataset.xAxisID) || dataset.hidden) {
10176
10177
  continue;
10177
10178
  }
10178
10179
  for (let i = 0; i < dataset._parsed.length; i++) {
@@ -10215,7 +10216,7 @@ stores.inject(MyMetaStore, storeInstance);
10215
10216
  const xMin = chart.chartArea.left;
10216
10217
  const textsPositions = {};
10217
10218
  for (const dataset of chart._metasets) {
10218
- if (isTrendLineAxis(dataset.axisID)) {
10219
+ if (isTrendLineAxis(dataset.xAxisID)) {
10219
10220
  return; // ignore trend lines
10220
10221
  }
10221
10222
  for (let i = 0; i < dataset._parsed.length; i++) {
@@ -10340,6 +10341,7 @@ stores.inject(MyMetaStore, storeInstance);
10340
10341
  canvas = owl.useRef("graphContainer");
10341
10342
  chart;
10342
10343
  currentRuntime;
10344
+ currentDevicePixelRatio = window.devicePixelRatio;
10343
10345
  get background() {
10344
10346
  return this.chartRuntime.background;
10345
10347
  }
@@ -10373,6 +10375,10 @@ stores.inject(MyMetaStore, storeInstance);
10373
10375
  }
10374
10376
  this.currentRuntime = runtime;
10375
10377
  }
10378
+ else if (this.currentDevicePixelRatio !== window.devicePixelRatio) {
10379
+ this.currentDevicePixelRatio = window.devicePixelRatio;
10380
+ this.updateChartJs(deepCopy(this.currentRuntime.chartJsConfig));
10381
+ }
10376
10382
  });
10377
10383
  }
10378
10384
  createChart(chartData) {
@@ -10628,9 +10634,11 @@ stores.inject(MyMetaStore, storeInstance);
10628
10634
  };
10629
10635
  function drawScoreChart(structure, canvas) {
10630
10636
  const ctx = canvas.getContext("2d");
10631
- canvas.width = structure.canvas.width;
10632
- const availableWidth = canvas.width - CHART_PADDING$1 * 2;
10633
- 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;
10634
10642
  ctx.fillStyle = structure.canvas.backgroundColor;
10635
10643
  ctx.fillRect(0, 0, structure.canvas.width, structure.canvas.height);
10636
10644
  if (structure.title) {
@@ -10993,7 +11001,7 @@ stores.inject(MyMetaStore, storeInstance);
10993
11001
  owl.useEffect(this.createChart.bind(this), () => {
10994
11002
  const canvas = this.canvas.el;
10995
11003
  const rect = canvas.getBoundingClientRect();
10996
- return [rect.width, rect.height, this.runtime, this.canvas.el];
11004
+ return [rect.width, rect.height, this.runtime, this.canvas.el, window.devicePixelRatio];
10997
11005
  });
10998
11006
  }
10999
11007
  createChart() {
@@ -22582,9 +22590,11 @@ stores.inject(MyMetaStore, storeInstance);
22582
22590
  const GAUGE_TITLE_SECTION_HEIGHT = 25;
22583
22591
  function drawGaugeChart(canvas, runtime) {
22584
22592
  const canvasBoundingRect = canvas.getBoundingClientRect();
22585
- canvas.width = canvasBoundingRect.width;
22586
- canvas.height = canvasBoundingRect.height;
22593
+ const dpr = window.devicePixelRatio || 1;
22594
+ canvas.width = dpr * canvasBoundingRect.width;
22595
+ canvas.height = dpr * canvasBoundingRect.height;
22587
22596
  const ctx = canvas.getContext("2d");
22597
+ ctx.scale(dpr, dpr);
22588
22598
  const config = getGaugeRenderingConfig(canvasBoundingRect, runtime, ctx);
22589
22599
  drawBackground(ctx, config);
22590
22600
  drawGauge(ctx, config);
@@ -22919,7 +22929,7 @@ stores.inject(MyMetaStore, storeInstance);
22919
22929
  owl.useEffect(() => drawGaugeChart(this.canvas.el, this.runtime), () => {
22920
22930
  const canvas = this.canvas.el;
22921
22931
  const rect = canvas.getBoundingClientRect();
22922
- return [rect.width, rect.height, this.runtime, this.canvas.el];
22932
+ return [rect.width, rect.height, this.runtime, this.canvas.el, window.devicePixelRatio];
22923
22933
  });
22924
22934
  }
22925
22935
  }
@@ -29582,7 +29592,7 @@ stores.inject(MyMetaStore, storeInstance);
29582
29592
  };
29583
29593
  scales[MOVING_AVERAGE_TREND_LINE_XAXIS_ID] = {
29584
29594
  ...scales.x,
29585
- offset: false,
29595
+ offset: true,
29586
29596
  display: false,
29587
29597
  };
29588
29598
  }
@@ -30302,9 +30312,6 @@ stores.inject(MyMetaStore, storeInstance);
30302
30312
  };
30303
30313
  }
30304
30314
  getDefinitionForExcel() {
30305
- // Excel does not support aggregating labels
30306
- if (this.aggregated)
30307
- return undefined;
30308
30315
  const dataSets = this.dataSets
30309
30316
  .map((ds) => toExcelDataset(this.getters, ds))
30310
30317
  .filter((ds) => ds.range !== "" && ds.range !== CellErrorType.InvalidReference);
@@ -31019,9 +31026,6 @@ stores.inject(MyMetaStore, storeInstance);
31019
31026
  return new LineChart(definition, this.sheetId, this.getters);
31020
31027
  }
31021
31028
  getDefinitionForExcel() {
31022
- // Excel does not support aggregating labels
31023
- if (this.aggregated)
31024
- return undefined;
31025
31029
  const dataSets = this.dataSets
31026
31030
  .map((ds) => toExcelDataset(this.getters, ds))
31027
31031
  .filter((ds) => ds.range !== "" && ds.range !== CellErrorType.InvalidReference);
@@ -31158,9 +31162,6 @@ stores.inject(MyMetaStore, storeInstance);
31158
31162
  return new PieChart(definition, sheetId, this.getters);
31159
31163
  }
31160
31164
  getDefinitionForExcel() {
31161
- // Excel does not support aggregating labels
31162
- if (this.aggregated)
31163
- return undefined;
31164
31165
  const dataSets = this.dataSets
31165
31166
  .map((ds) => toExcelDataset(this.getters, ds))
31166
31167
  .filter((ds) => ds.range !== "" && ds.range !== CellErrorType.InvalidReference);
@@ -33659,18 +33660,28 @@ stores.inject(MyMetaStore, storeInstance);
33659
33660
  function useInterval(callback, delay) {
33660
33661
  let intervalId;
33661
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
+ };
33662
33676
  owl.useEffect(() => {
33663
- intervalId = setInterval(callback, delay);
33677
+ intervalId = setInterval(safeCallback, delay);
33664
33678
  return () => clearInterval(intervalId);
33665
33679
  }, () => [delay]);
33666
33680
  return {
33667
- pause: () => {
33668
- clearInterval(intervalId);
33669
- intervalId = undefined;
33670
- },
33681
+ pause,
33671
33682
  resume: () => {
33672
33683
  if (intervalId === undefined) {
33673
- intervalId = setInterval(callback, delay);
33684
+ intervalId = setInterval(safeCallback, delay);
33674
33685
  }
33675
33686
  },
33676
33687
  };
@@ -38451,8 +38462,11 @@ stores.inject(MyMetaStore, storeInstance);
38451
38462
  }
38452
38463
  removeInput(rangeId) {
38453
38464
  const index = this.store.selectionInputs.findIndex((range) => range.id === rangeId);
38454
- this.props.onSelectionRemoved?.(index);
38455
- 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);
38456
38470
  }
38457
38471
  onInputChanged(rangeId, ev) {
38458
38472
  const target = ev.target;
@@ -50852,7 +50866,7 @@ stores.inject(MyMetaStore, storeInstance);
50852
50866
  position: absolute;
50853
50867
  top: 0;
50854
50868
  left: ${HEADER_WIDTH}px;
50855
- right: 0;
50869
+ right: ${SCROLLBAR_WIDTH}px;
50856
50870
  height: ${HEADER_HEIGHT}px;
50857
50871
  width: calc(100% - ${HEADER_WIDTH + SCROLLBAR_WIDTH}px);
50858
50872
  &.o-dragging {
@@ -51045,9 +51059,8 @@ stores.inject(MyMetaStore, storeInstance);
51045
51059
  position: absolute;
51046
51060
  top: ${HEADER_HEIGHT}px;
51047
51061
  left: 0;
51048
- right: 0;
51062
+ bottom: ${SCROLLBAR_WIDTH}px;
51049
51063
  width: ${HEADER_WIDTH}px;
51050
- height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
51051
51064
  &.o-dragging {
51052
51065
  cursor: grabbing;
51053
51066
  }
@@ -59095,6 +59108,15 @@ stores.inject(MyMetaStore, storeInstance);
59095
59108
  }
59096
59109
  }
59097
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
+ }
59098
59120
  adaptRanges(applyChange) {
59099
59121
  for (const pivotId of this.getters.getPivotIds()) {
59100
59122
  const definition = this.getters.getPivotCoreDefinition(pivotId);
@@ -59113,6 +59135,16 @@ stores.inject(MyMetaStore, storeInstance);
59113
59135
  }
59114
59136
  }
59115
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
+ }
59116
59148
  }
59117
59149
 
59118
59150
  class TableStylePlugin extends CorePlugin {
@@ -61903,7 +61935,7 @@ stores.inject(MyMetaStore, storeInstance);
61903
61935
  tables = {};
61904
61936
  handle(cmd) {
61905
61937
  if (invalidateEvaluationCommands.has(cmd.type) ||
61906
- (cmd.type === "UPDATE_CELL" && "content" in cmd) ||
61938
+ (cmd.type === "UPDATE_CELL" && ("content" in cmd || "format" in cmd)) ||
61907
61939
  cmd.type === "EVALUATE_CELLS") {
61908
61940
  this.tables = {};
61909
61941
  return;
@@ -65775,7 +65807,7 @@ stores.inject(MyMetaStore, storeInstance);
65775
65807
  tableStyles = {};
65776
65808
  handle(cmd) {
65777
65809
  if (invalidateEvaluationCommands.has(cmd.type) ||
65778
- (cmd.type === "UPDATE_CELL" && "content" in cmd) ||
65810
+ (cmd.type === "UPDATE_CELL" && ("content" in cmd || "format" in cmd)) ||
65779
65811
  cmd.type === "EVALUATE_CELLS") {
65780
65812
  this.tableStyles = {};
65781
65813
  return;
@@ -67736,6 +67768,8 @@ stores.inject(MyMetaStore, storeInstance);
67736
67768
  });
67737
67769
  this.selectCell(col, row);
67738
67770
  }
67771
+ const { col, row } = this.gridSelection.anchor.cell;
67772
+ this.moveClient({ sheetId: this.activeSheet.id, col, row });
67739
67773
  }
67740
67774
  /**
67741
67775
  * Ensure selections are not outside sheet boundaries.
@@ -68451,8 +68485,11 @@ stores.inject(MyMetaStore, storeInstance);
68451
68485
  case "REMOVE_TABLE":
68452
68486
  case "UPDATE_TABLE":
68453
68487
  case "UPDATE_FILTER":
68454
- this.sheetsWithDirtyViewports.add(cmd.sheetId);
68455
- break;
68488
+ case "UNFREEZE_ROWS":
68489
+ case "UNFREEZE_COLUMNS":
68490
+ case "FREEZE_COLUMNS":
68491
+ case "FREEZE_ROWS":
68492
+ case "UNFREEZE_COLUMNS_ROWS":
68456
68493
  case "REMOVE_COLUMNS_ROWS":
68457
68494
  case "RESIZE_COLUMNS_ROWS":
68458
68495
  case "HIDE_COLUMNS_ROWS":
@@ -68465,11 +68502,9 @@ stores.inject(MyMetaStore, storeInstance);
68465
68502
  case "FOLD_HEADER_GROUPS_IN_ZONE":
68466
68503
  case "UNFOLD_HEADER_GROUPS_IN_ZONE":
68467
68504
  case "UNFOLD_ALL_HEADER_GROUPS":
68468
- case "FOLD_ALL_HEADER_GROUPS": {
68469
- const sheetId = "sheetId" in cmd ? cmd.sheetId : this.getters.getActiveSheetId();
68470
- this.sheetsWithDirtyViewports.add(sheetId);
68505
+ case "FOLD_ALL_HEADER_GROUPS":
68506
+ this.sheetsWithDirtyViewports.add(cmd.sheetId);
68471
68507
  break;
68472
- }
68473
68508
  case "UPDATE_CELL":
68474
68509
  // update cell content or format can change hidden rows because of data filters
68475
68510
  if ("content" in cmd || "format" in cmd || cmd.style?.fontSize !== undefined) {
@@ -68485,13 +68520,6 @@ stores.inject(MyMetaStore, storeInstance);
68485
68520
  case "ACTIVATE_SHEET":
68486
68521
  this.sheetsWithDirtyViewports.add(cmd.sheetIdTo);
68487
68522
  break;
68488
- case "UNFREEZE_ROWS":
68489
- case "UNFREEZE_COLUMNS":
68490
- case "FREEZE_COLUMNS":
68491
- case "FREEZE_ROWS":
68492
- case "UNFREEZE_COLUMNS_ROWS":
68493
- this.resetViewports(this.getters.getActiveSheetId());
68494
- break;
68495
68523
  case "SCROLL_TO_CELL":
68496
68524
  this.refreshViewport(this.getters.getActiveSheetId(), { col: cmd.col, row: cmd.row });
68497
68525
  break;
@@ -69659,7 +69687,7 @@ stores.inject(MyMetaStore, storeInstance);
69659
69687
  }
69660
69688
  handle(cmd) {
69661
69689
  if (invalidateEvaluationCommands.has(cmd.type) ||
69662
- (cmd.type === "UPDATE_CELL" && "content" in cmd)) {
69690
+ (cmd.type === "UPDATE_CELL" && ("content" in cmd || "format" in cmd))) {
69663
69691
  this.isDirty = true;
69664
69692
  }
69665
69693
  switch (cmd.type) {
@@ -76241,9 +76269,9 @@ stores.inject(MyMetaStore, storeInstance);
76241
76269
  exports.tokenize = tokenize;
76242
76270
 
76243
76271
 
76244
- __info__.version = "18.2.9";
76245
- __info__.date = "2025-04-25T08:06:52.677Z";
76246
- __info__.hash = "3e88645";
76272
+ __info__.version = "18.2.10";
76273
+ __info__.date = "2025-05-02T12:34:39.632Z";
76274
+ __info__.hash = "e8ff3fc";
76247
76275
 
76248
76276
 
76249
76277
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);