@odoo/o-spreadsheet 18.1.16 → 18.1.18

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.16
6
- * @date 2025-04-18T16:24:16.854Z
7
- * @hash 19f6de2
5
+ * @version 18.1.18
6
+ * @date 2025-05-02T12:30:47.822Z
7
+ * @hash 29c21c6
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -3761,6 +3761,7 @@
3761
3761
  CommandResult["ValueCellIsInvalidFormula"] = "ValueCellIsInvalidFormula";
3762
3762
  CommandResult["InvalidDefinition"] = "InvalidDefinition";
3763
3763
  CommandResult["InvalidColor"] = "InvalidColor";
3764
+ CommandResult["InvalidPivotDataSet"] = "InvalidPivotDataSet";
3764
3765
  })(exports.CommandResult || (exports.CommandResult = {}));
3765
3766
 
3766
3767
  const DEFAULT_LOCALES = [
@@ -3833,11 +3834,13 @@
3833
3834
  NullError: "#NULL!",
3834
3835
  };
3835
3836
  const errorTypes = new Set(Object.values(CellErrorType));
3836
- class EvaluationError extends Error {
3837
+ class EvaluationError {
3838
+ message;
3837
3839
  value;
3838
3840
  constructor(message = _t("Error"), value = CellErrorType.GenericError) {
3839
- super(message);
3841
+ this.message = message;
3840
3842
  this.value = value;
3843
+ this.message = message.toString();
3841
3844
  }
3842
3845
  }
3843
3846
  class BadExpressionError extends EvaluationError {
@@ -10006,7 +10009,7 @@ stores.inject(MyMetaStore, storeInstance);
10006
10009
  const yMin = chart.chartArea.top;
10007
10010
  const textsPositions = {};
10008
10011
  for (const dataset of chart._metasets) {
10009
- if (isTrendLineAxis(dataset.axisID) || dataset.hidden) {
10012
+ if (isTrendLineAxis(dataset.xAxisID) || dataset.hidden) {
10010
10013
  continue;
10011
10014
  }
10012
10015
  for (let i = 0; i < dataset._parsed.length; i++) {
@@ -10049,7 +10052,7 @@ stores.inject(MyMetaStore, storeInstance);
10049
10052
  const xMin = chart.chartArea.left;
10050
10053
  const textsPositions = {};
10051
10054
  for (const dataset of chart._metasets) {
10052
- if (isTrendLineAxis(dataset.axisID)) {
10055
+ if (isTrendLineAxis(dataset.xAxisID)) {
10053
10056
  return; // ignore trend lines
10054
10057
  }
10055
10058
  for (let i = 0; i < dataset._parsed.length; i++) {
@@ -10165,6 +10168,7 @@ stores.inject(MyMetaStore, storeInstance);
10165
10168
  canvas = owl.useRef("graphContainer");
10166
10169
  chart;
10167
10170
  currentRuntime;
10171
+ currentDevicePixelRatio = window.devicePixelRatio;
10168
10172
  get background() {
10169
10173
  return this.chartRuntime.background;
10170
10174
  }
@@ -10198,6 +10202,10 @@ stores.inject(MyMetaStore, storeInstance);
10198
10202
  }
10199
10203
  this.currentRuntime = runtime;
10200
10204
  }
10205
+ else if (this.currentDevicePixelRatio !== window.devicePixelRatio) {
10206
+ this.currentDevicePixelRatio = window.devicePixelRatio;
10207
+ this.updateChartJs(deepCopy(this.currentRuntime.chartJsConfig));
10208
+ }
10201
10209
  });
10202
10210
  }
10203
10211
  createChart(chartData) {
@@ -10453,9 +10461,11 @@ stores.inject(MyMetaStore, storeInstance);
10453
10461
  };
10454
10462
  function drawScoreChart(structure, canvas) {
10455
10463
  const ctx = canvas.getContext("2d");
10456
- canvas.width = structure.canvas.width;
10457
- const availableWidth = canvas.width - CHART_PADDING$1 * 2;
10458
- canvas.height = structure.canvas.height;
10464
+ const dpr = window.devicePixelRatio || 1;
10465
+ canvas.width = dpr * structure.canvas.width;
10466
+ canvas.height = dpr * structure.canvas.height;
10467
+ ctx.scale(dpr, dpr);
10468
+ const availableWidth = structure.canvas.width - CHART_PADDING$1 * 2;
10459
10469
  ctx.fillStyle = structure.canvas.backgroundColor;
10460
10470
  ctx.fillRect(0, 0, structure.canvas.width, structure.canvas.height);
10461
10471
  if (structure.title) {
@@ -10818,7 +10828,7 @@ stores.inject(MyMetaStore, storeInstance);
10818
10828
  owl.useEffect(this.createChart.bind(this), () => {
10819
10829
  const canvas = this.canvas.el;
10820
10830
  const rect = canvas.getBoundingClientRect();
10821
- return [rect.width, rect.height, this.runtime, this.canvas.el];
10831
+ return [rect.width, rect.height, this.runtime, this.canvas.el, window.devicePixelRatio];
10822
10832
  });
10823
10833
  }
10824
10834
  createChart() {
@@ -13578,7 +13588,7 @@ stores.inject(MyMetaStore, storeInstance);
13578
13588
  }
13579
13589
  }
13580
13590
  if (!found) {
13581
- throw new NotAvailableError(_t("Value not found in the given data."));
13591
+ return new NotAvailableError(_t("Value not found in the given data."));
13582
13592
  }
13583
13593
  return rank;
13584
13594
  },
@@ -15318,7 +15328,7 @@ stores.inject(MyMetaStore, storeInstance);
15318
15328
  result.push(row.data);
15319
15329
  }
15320
15330
  if (!result.length)
15321
- throw new EvaluationError(_t("No unique values found"));
15331
+ return new EvaluationError(_t("No unique values found"));
15322
15332
  return _byColumn ? result : transposeMatrix(result);
15323
15333
  },
15324
15334
  isExported: true,
@@ -19097,7 +19107,7 @@ stores.inject(MyMetaStore, storeInstance);
19097
19107
  }
19098
19108
  const _cellReference = cellReference?.value;
19099
19109
  if (!_cellReference) {
19100
- throw new Error("In this context, the function OFFSET needs to have a cell or range in parameter.");
19110
+ return new EvaluationError("In this context, the function OFFSET needs to have a cell or range in parameter.");
19101
19111
  }
19102
19112
  const zone = toZone(_cellReference);
19103
19113
  let offsetHeight = zone.bottom - zone.top + 1;
@@ -22407,9 +22417,11 @@ stores.inject(MyMetaStore, storeInstance);
22407
22417
  const GAUGE_TITLE_SECTION_HEIGHT = 25;
22408
22418
  function drawGaugeChart(canvas, runtime) {
22409
22419
  const canvasBoundingRect = canvas.getBoundingClientRect();
22410
- canvas.width = canvasBoundingRect.width;
22411
- canvas.height = canvasBoundingRect.height;
22420
+ const dpr = window.devicePixelRatio || 1;
22421
+ canvas.width = dpr * canvasBoundingRect.width;
22422
+ canvas.height = dpr * canvasBoundingRect.height;
22412
22423
  const ctx = canvas.getContext("2d");
22424
+ ctx.scale(dpr, dpr);
22413
22425
  const config = getGaugeRenderingConfig(canvasBoundingRect, runtime, ctx);
22414
22426
  drawBackground(ctx, config);
22415
22427
  drawGauge(ctx, config);
@@ -22744,7 +22756,7 @@ stores.inject(MyMetaStore, storeInstance);
22744
22756
  owl.useEffect(() => drawGaugeChart(this.canvas.el, this.runtime), () => {
22745
22757
  const canvas = this.canvas.el;
22746
22758
  const rect = canvas.getBoundingClientRect();
22747
- return [rect.width, rect.height, this.runtime, this.canvas.el];
22759
+ return [rect.width, rect.height, this.runtime, this.canvas.el, window.devicePixelRatio];
22748
22760
  });
22749
22761
  }
22750
22762
  }
@@ -29556,7 +29568,7 @@ stores.inject(MyMetaStore, storeInstance);
29556
29568
  };
29557
29569
  scales[MOVING_AVERAGE_TREND_LINE_XAXIS_ID] = {
29558
29570
  ...scales.x,
29559
- offset: false,
29571
+ offset: true,
29560
29572
  display: false,
29561
29573
  };
29562
29574
  }
@@ -30153,9 +30165,6 @@ stores.inject(MyMetaStore, storeInstance);
30153
30165
  };
30154
30166
  }
30155
30167
  getDefinitionForExcel() {
30156
- // Excel does not support aggregating labels
30157
- if (this.aggregated)
30158
- return undefined;
30159
30168
  const dataSets = this.dataSets
30160
30169
  .map((ds) => toExcelDataset(this.getters, ds))
30161
30170
  .filter((ds) => ds.range !== "" && ds.range !== CellErrorType.InvalidReference);
@@ -30836,9 +30845,6 @@ stores.inject(MyMetaStore, storeInstance);
30836
30845
  return new LineChart(definition, this.sheetId, this.getters);
30837
30846
  }
30838
30847
  getDefinitionForExcel() {
30839
- // Excel does not support aggregating labels
30840
- if (this.aggregated)
30841
- return undefined;
30842
30848
  const dataSets = this.dataSets
30843
30849
  .map((ds) => toExcelDataset(this.getters, ds))
30844
30850
  .filter((ds) => ds.range !== "" && ds.range !== CellErrorType.InvalidReference);
@@ -30975,9 +30981,6 @@ stores.inject(MyMetaStore, storeInstance);
30975
30981
  return new PieChart(definition, sheetId, this.getters);
30976
30982
  }
30977
30983
  getDefinitionForExcel() {
30978
- // Excel does not support aggregating labels
30979
- if (this.aggregated)
30980
- return undefined;
30981
30984
  const dataSets = this.dataSets
30982
30985
  .map((ds) => toExcelDataset(this.getters, ds))
30983
30986
  .filter((ds) => ds.range !== "" && ds.range !== CellErrorType.InvalidReference);
@@ -33453,18 +33456,28 @@ stores.inject(MyMetaStore, storeInstance);
33453
33456
  function useInterval(callback, delay) {
33454
33457
  let intervalId;
33455
33458
  const { setInterval, clearInterval } = window;
33459
+ const pause = () => {
33460
+ clearInterval(intervalId);
33461
+ intervalId = undefined;
33462
+ };
33463
+ const safeCallback = () => {
33464
+ try {
33465
+ callback();
33466
+ }
33467
+ catch (e) {
33468
+ pause();
33469
+ throw e;
33470
+ }
33471
+ };
33456
33472
  owl.useEffect(() => {
33457
- intervalId = setInterval(callback, delay);
33473
+ intervalId = setInterval(safeCallback, delay);
33458
33474
  return () => clearInterval(intervalId);
33459
33475
  }, () => [delay]);
33460
33476
  return {
33461
- pause: () => {
33462
- clearInterval(intervalId);
33463
- intervalId = undefined;
33464
- },
33477
+ pause,
33465
33478
  resume: () => {
33466
33479
  if (intervalId === undefined) {
33467
- intervalId = setInterval(callback, delay);
33480
+ intervalId = setInterval(safeCallback, delay);
33468
33481
  }
33469
33482
  },
33470
33483
  };
@@ -38560,7 +38573,7 @@ stores.inject(MyMetaStore, storeInstance);
38560
38573
  }
38561
38574
  setHexColor(ev) {
38562
38575
  // only support HEX code input
38563
- const val = ev.target.value.slice(0, 7);
38576
+ const val = ev.target.value.replace("##", "#").slice(0, 7);
38564
38577
  this.state.customHexColor = val;
38565
38578
  if (!isColorValid(val)) ;
38566
38579
  else {
@@ -50453,7 +50466,7 @@ stores.inject(MyMetaStore, storeInstance);
50453
50466
  position: absolute;
50454
50467
  top: 0;
50455
50468
  left: ${HEADER_WIDTH}px;
50456
- right: 0;
50469
+ right: ${SCROLLBAR_WIDTH}px;
50457
50470
  height: ${HEADER_HEIGHT}px;
50458
50471
  &.o-dragging {
50459
50472
  cursor: grabbing;
@@ -50619,9 +50632,8 @@ stores.inject(MyMetaStore, storeInstance);
50619
50632
  position: absolute;
50620
50633
  top: ${HEADER_HEIGHT}px;
50621
50634
  left: 0;
50622
- right: 0;
50635
+ bottom: ${SCROLLBAR_WIDTH}px;
50623
50636
  width: ${HEADER_WIDTH}px;
50624
- height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
50625
50637
  &.o-dragging {
50626
50638
  cursor: grabbing;
50627
50639
  }
@@ -58622,6 +58634,15 @@ stores.inject(MyMetaStore, storeInstance);
58622
58634
  }
58623
58635
  }
58624
58636
  class SpreadsheetPivotCorePlugin extends CorePlugin {
58637
+ allowDispatch(cmd) {
58638
+ switch (cmd.type) {
58639
+ case "ADD_PIVOT":
58640
+ case "UPDATE_PIVOT":
58641
+ const definition = cmd.pivot;
58642
+ return this.checkDataSetValidity(definition);
58643
+ }
58644
+ return "Success" /* CommandResult.Success */;
58645
+ }
58625
58646
  adaptRanges(applyChange) {
58626
58647
  for (const pivotId of this.getters.getPivotIds()) {
58627
58648
  const definition = this.getters.getPivotCoreDefinition(pivotId);
@@ -58640,6 +58661,16 @@ stores.inject(MyMetaStore, storeInstance);
58640
58661
  }
58641
58662
  }
58642
58663
  }
58664
+ checkDataSetValidity(definition) {
58665
+ if (definition.type === "SPREADSHEET" && definition.dataSet) {
58666
+ const { zone, sheetId } = definition.dataSet;
58667
+ if (!sheetId || !this.getters.tryGetSheet(sheetId) || !zone || !isZoneValid(zone)) {
58668
+ return "InvalidDataSet" /* CommandResult.InvalidDataSet */;
58669
+ }
58670
+ return this.getters.checkZonesExistInSheet(sheetId, [zone]);
58671
+ }
58672
+ return "Success" /* CommandResult.Success */;
58673
+ }
58643
58674
  }
58644
58675
 
58645
58676
  class TableStylePlugin extends CorePlugin {
@@ -61439,7 +61470,7 @@ stores.inject(MyMetaStore, storeInstance);
61439
61470
  tables = {};
61440
61471
  handle(cmd) {
61441
61472
  if (invalidateEvaluationCommands.has(cmd.type) ||
61442
- (cmd.type === "UPDATE_CELL" && "content" in cmd) ||
61473
+ (cmd.type === "UPDATE_CELL" && ("content" in cmd || "format" in cmd)) ||
61443
61474
  cmd.type === "EVALUATE_CELLS") {
61444
61475
  this.tables = {};
61445
61476
  return;
@@ -61872,6 +61903,16 @@ stores.inject(MyMetaStore, storeInstance);
61872
61903
  }
61873
61904
  return values;
61874
61905
  }
61906
+ else if (rowDomain.length === this.definition.rows.length &&
61907
+ colDomain.length &&
61908
+ colDomain.length < this.definition.columns.length) {
61909
+ const colSubTree = this.getSubTreeMatchingDomain(table.getColTree(), colDomain);
61910
+ const domains = this.treeToLeafDomains(colSubTree, colDomain);
61911
+ for (const domain of domains) {
61912
+ values.push(this._getPivotCellValueAndFormat(measure.id, rowDomain.concat(domain)));
61913
+ }
61914
+ return values;
61915
+ }
61875
61916
  else {
61876
61917
  const tree = table.getRowTree();
61877
61918
  const subTree = this.getSubTreeMatchingDomain(tree, rowDomain);
@@ -65286,7 +65327,7 @@ stores.inject(MyMetaStore, storeInstance);
65286
65327
  tableStyles = {};
65287
65328
  handle(cmd) {
65288
65329
  if (invalidateEvaluationCommands.has(cmd.type) ||
65289
- (cmd.type === "UPDATE_CELL" && "content" in cmd) ||
65330
+ (cmd.type === "UPDATE_CELL" && ("content" in cmd || "format" in cmd)) ||
65290
65331
  cmd.type === "EVALUATE_CELLS") {
65291
65332
  this.tableStyles = {};
65292
65333
  return;
@@ -67250,6 +67291,8 @@ stores.inject(MyMetaStore, storeInstance);
67250
67291
  });
67251
67292
  this.selectCell(col, row);
67252
67293
  }
67294
+ const { col, row } = this.gridSelection.anchor.cell;
67295
+ this.moveClient({ sheetId: this.activeSheet.id, col, row });
67253
67296
  }
67254
67297
  /**
67255
67298
  * Ensure selections are not outside sheet boundaries.
@@ -67989,8 +68032,11 @@ stores.inject(MyMetaStore, storeInstance);
67989
68032
  case "REMOVE_TABLE":
67990
68033
  case "UPDATE_TABLE":
67991
68034
  case "UPDATE_FILTER":
67992
- this.sheetsWithDirtyViewports.add(cmd.sheetId);
67993
- break;
68035
+ case "UNFREEZE_ROWS":
68036
+ case "UNFREEZE_COLUMNS":
68037
+ case "FREEZE_COLUMNS":
68038
+ case "FREEZE_ROWS":
68039
+ case "UNFREEZE_COLUMNS_ROWS":
67994
68040
  case "REMOVE_COLUMNS_ROWS":
67995
68041
  case "RESIZE_COLUMNS_ROWS":
67996
68042
  case "HIDE_COLUMNS_ROWS":
@@ -68003,11 +68049,9 @@ stores.inject(MyMetaStore, storeInstance);
68003
68049
  case "FOLD_HEADER_GROUPS_IN_ZONE":
68004
68050
  case "UNFOLD_HEADER_GROUPS_IN_ZONE":
68005
68051
  case "UNFOLD_ALL_HEADER_GROUPS":
68006
- case "FOLD_ALL_HEADER_GROUPS": {
68007
- const sheetId = "sheetId" in cmd ? cmd.sheetId : this.getters.getActiveSheetId();
68008
- this.sheetsWithDirtyViewports.add(sheetId);
68052
+ case "FOLD_ALL_HEADER_GROUPS":
68053
+ this.sheetsWithDirtyViewports.add(cmd.sheetId);
68009
68054
  break;
68010
- }
68011
68055
  case "UPDATE_CELL":
68012
68056
  // update cell content or format can change hidden rows because of data filters
68013
68057
  if ("content" in cmd || "format" in cmd || cmd.style?.fontSize !== undefined) {
@@ -68023,13 +68067,6 @@ stores.inject(MyMetaStore, storeInstance);
68023
68067
  case "ACTIVATE_SHEET":
68024
68068
  this.sheetsWithDirtyViewports.add(cmd.sheetIdTo);
68025
68069
  break;
68026
- case "UNFREEZE_ROWS":
68027
- case "UNFREEZE_COLUMNS":
68028
- case "FREEZE_COLUMNS":
68029
- case "FREEZE_ROWS":
68030
- case "UNFREEZE_COLUMNS_ROWS":
68031
- this.resetViewports(this.getters.getActiveSheetId());
68032
- break;
68033
68070
  case "SCROLL_TO_CELL":
68034
68071
  this.refreshViewport(this.getters.getActiveSheetId(), { col: cmd.col, row: cmd.row });
68035
68072
  break;
@@ -69207,7 +69244,7 @@ stores.inject(MyMetaStore, storeInstance);
69207
69244
  }
69208
69245
  handle(cmd) {
69209
69246
  if (invalidateEvaluationCommands.has(cmd.type) ||
69210
- (cmd.type === "UPDATE_CELL" && "content" in cmd)) {
69247
+ (cmd.type === "UPDATE_CELL" && ("content" in cmd || "format" in cmd))) {
69211
69248
  this.isDirty = true;
69212
69249
  }
69213
69250
  switch (cmd.type) {
@@ -75768,9 +75805,9 @@ stores.inject(MyMetaStore, storeInstance);
75768
75805
  exports.tokenize = tokenize;
75769
75806
 
75770
75807
 
75771
- __info__.version = "18.1.16";
75772
- __info__.date = "2025-04-18T16:24:16.854Z";
75773
- __info__.hash = "19f6de2";
75808
+ __info__.version = "18.1.18";
75809
+ __info__.date = "2025-05-02T12:30:47.822Z";
75810
+ __info__.hash = "29c21c6";
75774
75811
 
75775
75812
 
75776
75813
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);