@odoo/o-spreadsheet 17.0.58 → 17.0.60

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 17.0.58
6
- * @date 2025-04-18T16:20:26.099Z
7
- * @hash 88d92de
5
+ * @version 17.0.60
6
+ * @date 2025-05-02T12:28:49.842Z
7
+ * @hash 29510cc
8
8
  */
9
9
 
10
10
  'use strict';
@@ -4857,7 +4857,7 @@ class ChartJsComponent extends owl.Component {
4857
4857
  // Note: chartJS modify the runtime in place, so it's important to give it a copy
4858
4858
  this.createChart(deepCopy(runtime.chartJsConfig));
4859
4859
  });
4860
- owl.useEffect(() => this.updateChartJs(deepCopy(this.chartRuntime)), () => [this.chartRuntime]);
4860
+ owl.useEffect(() => this.updateChartJs(deepCopy(this.chartRuntime)), () => [this.chartRuntime, window.devicePixelRatio]);
4861
4861
  }
4862
4862
  createChart(chartData) {
4863
4863
  const canvas = this.canvas.el;
@@ -5395,8 +5395,10 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
5395
5395
  };
5396
5396
  function drawScoreChart(structure, canvas) {
5397
5397
  const ctx = canvas.getContext("2d");
5398
- canvas.width = structure.canvas.width;
5399
- canvas.height = structure.canvas.height;
5398
+ const dpr = window.devicePixelRatio || 1;
5399
+ canvas.width = structure.canvas.width * dpr;
5400
+ canvas.height = structure.canvas.height * dpr;
5401
+ ctx.scale(dpr, dpr);
5400
5402
  ctx.fillStyle = structure.canvas.backgroundColor;
5401
5403
  ctx.fillRect(0, 0, structure.canvas.width, structure.canvas.height);
5402
5404
  if (structure.title) {
@@ -5745,7 +5747,7 @@ class ScorecardChart extends owl.Component {
5745
5747
  owl.useEffect(this.createChart.bind(this), () => {
5746
5748
  const canvas = this.canvas.el;
5747
5749
  const rect = canvas.getBoundingClientRect();
5748
- return [rect.width, rect.height, this.runtime, this.canvas.el];
5750
+ return [rect.width, rect.height, this.runtime, this.canvas.el, window.devicePixelRatio];
5749
5751
  });
5750
5752
  }
5751
5753
  createChart() {
@@ -8789,9 +8791,6 @@ class BarChart extends AbstractChart {
8789
8791
  };
8790
8792
  }
8791
8793
  getDefinitionForExcel() {
8792
- // Excel does not support aggregating labels
8793
- if (this.aggregated)
8794
- return undefined;
8795
8794
  const dataSets = this.dataSets
8796
8795
  .map((ds) => toExcelDataset(this.getters, ds))
8797
8796
  .filter((ds) => ds.range !== "" && ds.range !== INCORRECT_RANGE_STRING);
@@ -9368,9 +9367,6 @@ class LineChart extends AbstractChart {
9368
9367
  return new LineChart(definition, this.sheetId, this.getters);
9369
9368
  }
9370
9369
  getDefinitionForExcel() {
9371
- // Excel does not support aggregating labels
9372
- if (this.aggregated)
9373
- return undefined;
9374
9370
  const dataSets = this.dataSets
9375
9371
  .map((ds) => toExcelDataset(this.getters, ds))
9376
9372
  .filter((ds) => ds.range !== "" && ds.range !== INCORRECT_RANGE_STRING);
@@ -9676,9 +9672,6 @@ class PieChart extends AbstractChart {
9676
9672
  return new PieChart(definition, sheetId, this.getters);
9677
9673
  }
9678
9674
  getDefinitionForExcel() {
9679
- // Excel does not support aggregating labels
9680
- if (this.aggregated)
9681
- return undefined;
9682
9675
  const dataSets = this.dataSets
9683
9676
  .map((ds) => toExcelDataset(this.getters, ds))
9684
9677
  .filter((ds) => ds.range !== "" && ds.range !== INCORRECT_RANGE_STRING);
@@ -22383,7 +22376,7 @@ class ColorPicker extends owl.Component {
22383
22376
  }
22384
22377
  setHexColor(ev) {
22385
22378
  // only support HEX code input
22386
- const val = ev.target.value.slice(0, 7);
22379
+ const val = ev.target.value.replace("##", "#").slice(0, 7);
22387
22380
  this.state.customHexColor = val;
22388
22381
  if (!isColorValid(val)) ;
22389
22382
  else {
@@ -28482,18 +28475,28 @@ function useRefListener(ref, ...listener) {
28482
28475
  function useInterval(callback, delay) {
28483
28476
  let intervalId;
28484
28477
  const { setInterval, clearInterval } = window;
28478
+ const pause = () => {
28479
+ clearInterval(intervalId);
28480
+ intervalId = undefined;
28481
+ };
28482
+ const safeCallback = () => {
28483
+ try {
28484
+ callback();
28485
+ }
28486
+ catch (e) {
28487
+ pause();
28488
+ throw e;
28489
+ }
28490
+ };
28485
28491
  owl.useEffect(() => {
28486
- intervalId = setInterval(callback, delay);
28492
+ intervalId = setInterval(safeCallback, delay);
28487
28493
  return () => clearInterval(intervalId);
28488
28494
  }, () => [delay]);
28489
28495
  return {
28490
- pause: () => {
28491
- clearInterval(intervalId);
28492
- intervalId = undefined;
28493
- },
28496
+ pause,
28494
28497
  resume: () => {
28495
28498
  if (intervalId === undefined) {
28496
- intervalId = setInterval(callback, delay);
28499
+ intervalId = setInterval(safeCallback, delay);
28497
28500
  }
28498
28501
  },
28499
28502
  };
@@ -28938,7 +28941,7 @@ css /* scss */ `
28938
28941
  position: absolute;
28939
28942
  top: 0;
28940
28943
  left: ${HEADER_WIDTH}px;
28941
- right: 0;
28944
+ right: ${SCROLLBAR_WIDTH}px;
28942
28945
  height: ${HEADER_HEIGHT}px;
28943
28946
  &.o-dragging {
28944
28947
  cursor: grabbing;
@@ -29113,9 +29116,8 @@ css /* scss */ `
29113
29116
  position: absolute;
29114
29117
  top: ${HEADER_HEIGHT}px;
29115
29118
  left: 0;
29116
- right: 0;
29119
+ bottom: ${SCROLLBAR_WIDTH}px;
29117
29120
  width: ${HEADER_WIDTH}px;
29118
- height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
29119
29121
  &.o-dragging {
29120
29122
  cursor: grabbing;
29121
29123
  }
@@ -50603,6 +50605,8 @@ class GridSelectionPlugin extends UIPlugin {
50603
50605
  });
50604
50606
  this.selectCell(col, row);
50605
50607
  }
50608
+ const { col, row } = this.gridSelection.anchor.cell;
50609
+ this.moveClient({ sheetId: this.activeSheet.id, col, row });
50606
50610
  }
50607
50611
  /**
50608
50612
  * Ensure selections are not outside sheet boundaries.
@@ -51342,8 +51346,11 @@ class SheetViewPlugin extends UIPlugin {
51342
51346
  }
51343
51347
  case "REMOVE_FILTER_TABLE":
51344
51348
  case "UPDATE_FILTER":
51345
- this.sheetsWithDirtyViewports.add(cmd.sheetId);
51346
- break;
51349
+ case "UNFREEZE_ROWS":
51350
+ case "UNFREEZE_COLUMNS":
51351
+ case "FREEZE_COLUMNS":
51352
+ case "FREEZE_ROWS":
51353
+ case "UNFREEZE_COLUMNS_ROWS":
51347
51354
  case "REMOVE_COLUMNS_ROWS":
51348
51355
  case "RESIZE_COLUMNS_ROWS":
51349
51356
  case "HIDE_COLUMNS_ROWS":
@@ -51356,11 +51363,9 @@ class SheetViewPlugin extends UIPlugin {
51356
51363
  case "FOLD_HEADER_GROUPS_IN_ZONE":
51357
51364
  case "UNFOLD_HEADER_GROUPS_IN_ZONE":
51358
51365
  case "UNFOLD_ALL_HEADER_GROUPS":
51359
- case "FOLD_ALL_HEADER_GROUPS": {
51360
- const sheetId = "sheetId" in cmd ? cmd.sheetId : this.getters.getActiveSheetId();
51361
- this.sheetsWithDirtyViewports.add(sheetId);
51366
+ case "FOLD_ALL_HEADER_GROUPS":
51367
+ this.sheetsWithDirtyViewports.add(cmd.sheetId);
51362
51368
  break;
51363
- }
51364
51369
  case "UPDATE_CELL":
51365
51370
  // update cell content or format can change hidden rows because of data filters
51366
51371
  if ("content" in cmd || "format" in cmd || cmd.style?.fontSize !== undefined) {
@@ -51376,13 +51381,6 @@ class SheetViewPlugin extends UIPlugin {
51376
51381
  case "ACTIVATE_SHEET":
51377
51382
  this.sheetsWithDirtyViewports.add(cmd.sheetIdTo);
51378
51383
  break;
51379
- case "UNFREEZE_ROWS":
51380
- case "UNFREEZE_COLUMNS":
51381
- case "FREEZE_COLUMNS":
51382
- case "FREEZE_ROWS":
51383
- case "UNFREEZE_COLUMNS_ROWS":
51384
- this.resetViewports(this.getters.getActiveSheetId());
51385
- break;
51386
51384
  case "DELETE_SHEET":
51387
51385
  this.sheetsWithDirtyViewports.delete(cmd.sheetId);
51388
51386
  break;
@@ -58254,6 +58252,6 @@ exports.setTranslationMethod = setTranslationMethod;
58254
58252
  exports.tokenize = tokenize;
58255
58253
 
58256
58254
 
58257
- __info__.version = "17.0.58";
58258
- __info__.date = "2025-04-18T16:20:26.099Z";
58259
- __info__.hash = "88d92de";
58255
+ __info__.version = "17.0.60";
58256
+ __info__.date = "2025-05-02T12:28:49.842Z";
58257
+ __info__.hash = "29510cc";
@@ -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 17.0.58
6
- * @date 2025-04-18T16:20:26.099Z
7
- * @hash 88d92de
5
+ * @version 17.0.60
6
+ * @date 2025-05-02T12:28:49.842Z
7
+ * @hash 29510cc
8
8
  */
9
9
 
10
10
  import { Component, useRef, onMounted, useEffect, onWillPatch, useState, onWillUpdateProps, onPatched, useComponent, useExternalListener, onWillUnmount, onWillStart, xml, useChildSubEnv, useSubEnv, markRaw } from '@odoo/owl';
@@ -4855,7 +4855,7 @@ class ChartJsComponent extends Component {
4855
4855
  // Note: chartJS modify the runtime in place, so it's important to give it a copy
4856
4856
  this.createChart(deepCopy(runtime.chartJsConfig));
4857
4857
  });
4858
- useEffect(() => this.updateChartJs(deepCopy(this.chartRuntime)), () => [this.chartRuntime]);
4858
+ useEffect(() => this.updateChartJs(deepCopy(this.chartRuntime)), () => [this.chartRuntime, window.devicePixelRatio]);
4859
4859
  }
4860
4860
  createChart(chartData) {
4861
4861
  const canvas = this.canvas.el;
@@ -5393,8 +5393,10 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
5393
5393
  };
5394
5394
  function drawScoreChart(structure, canvas) {
5395
5395
  const ctx = canvas.getContext("2d");
5396
- canvas.width = structure.canvas.width;
5397
- canvas.height = structure.canvas.height;
5396
+ const dpr = window.devicePixelRatio || 1;
5397
+ canvas.width = structure.canvas.width * dpr;
5398
+ canvas.height = structure.canvas.height * dpr;
5399
+ ctx.scale(dpr, dpr);
5398
5400
  ctx.fillStyle = structure.canvas.backgroundColor;
5399
5401
  ctx.fillRect(0, 0, structure.canvas.width, structure.canvas.height);
5400
5402
  if (structure.title) {
@@ -5743,7 +5745,7 @@ class ScorecardChart extends Component {
5743
5745
  useEffect(this.createChart.bind(this), () => {
5744
5746
  const canvas = this.canvas.el;
5745
5747
  const rect = canvas.getBoundingClientRect();
5746
- return [rect.width, rect.height, this.runtime, this.canvas.el];
5748
+ return [rect.width, rect.height, this.runtime, this.canvas.el, window.devicePixelRatio];
5747
5749
  });
5748
5750
  }
5749
5751
  createChart() {
@@ -8787,9 +8789,6 @@ class BarChart extends AbstractChart {
8787
8789
  };
8788
8790
  }
8789
8791
  getDefinitionForExcel() {
8790
- // Excel does not support aggregating labels
8791
- if (this.aggregated)
8792
- return undefined;
8793
8792
  const dataSets = this.dataSets
8794
8793
  .map((ds) => toExcelDataset(this.getters, ds))
8795
8794
  .filter((ds) => ds.range !== "" && ds.range !== INCORRECT_RANGE_STRING);
@@ -9366,9 +9365,6 @@ class LineChart extends AbstractChart {
9366
9365
  return new LineChart(definition, this.sheetId, this.getters);
9367
9366
  }
9368
9367
  getDefinitionForExcel() {
9369
- // Excel does not support aggregating labels
9370
- if (this.aggregated)
9371
- return undefined;
9372
9368
  const dataSets = this.dataSets
9373
9369
  .map((ds) => toExcelDataset(this.getters, ds))
9374
9370
  .filter((ds) => ds.range !== "" && ds.range !== INCORRECT_RANGE_STRING);
@@ -9674,9 +9670,6 @@ class PieChart extends AbstractChart {
9674
9670
  return new PieChart(definition, sheetId, this.getters);
9675
9671
  }
9676
9672
  getDefinitionForExcel() {
9677
- // Excel does not support aggregating labels
9678
- if (this.aggregated)
9679
- return undefined;
9680
9673
  const dataSets = this.dataSets
9681
9674
  .map((ds) => toExcelDataset(this.getters, ds))
9682
9675
  .filter((ds) => ds.range !== "" && ds.range !== INCORRECT_RANGE_STRING);
@@ -22381,7 +22374,7 @@ class ColorPicker extends Component {
22381
22374
  }
22382
22375
  setHexColor(ev) {
22383
22376
  // only support HEX code input
22384
- const val = ev.target.value.slice(0, 7);
22377
+ const val = ev.target.value.replace("##", "#").slice(0, 7);
22385
22378
  this.state.customHexColor = val;
22386
22379
  if (!isColorValid(val)) ;
22387
22380
  else {
@@ -28480,18 +28473,28 @@ function useRefListener(ref, ...listener) {
28480
28473
  function useInterval(callback, delay) {
28481
28474
  let intervalId;
28482
28475
  const { setInterval, clearInterval } = window;
28476
+ const pause = () => {
28477
+ clearInterval(intervalId);
28478
+ intervalId = undefined;
28479
+ };
28480
+ const safeCallback = () => {
28481
+ try {
28482
+ callback();
28483
+ }
28484
+ catch (e) {
28485
+ pause();
28486
+ throw e;
28487
+ }
28488
+ };
28483
28489
  useEffect(() => {
28484
- intervalId = setInterval(callback, delay);
28490
+ intervalId = setInterval(safeCallback, delay);
28485
28491
  return () => clearInterval(intervalId);
28486
28492
  }, () => [delay]);
28487
28493
  return {
28488
- pause: () => {
28489
- clearInterval(intervalId);
28490
- intervalId = undefined;
28491
- },
28494
+ pause,
28492
28495
  resume: () => {
28493
28496
  if (intervalId === undefined) {
28494
- intervalId = setInterval(callback, delay);
28497
+ intervalId = setInterval(safeCallback, delay);
28495
28498
  }
28496
28499
  },
28497
28500
  };
@@ -28936,7 +28939,7 @@ css /* scss */ `
28936
28939
  position: absolute;
28937
28940
  top: 0;
28938
28941
  left: ${HEADER_WIDTH}px;
28939
- right: 0;
28942
+ right: ${SCROLLBAR_WIDTH}px;
28940
28943
  height: ${HEADER_HEIGHT}px;
28941
28944
  &.o-dragging {
28942
28945
  cursor: grabbing;
@@ -29111,9 +29114,8 @@ css /* scss */ `
29111
29114
  position: absolute;
29112
29115
  top: ${HEADER_HEIGHT}px;
29113
29116
  left: 0;
29114
- right: 0;
29117
+ bottom: ${SCROLLBAR_WIDTH}px;
29115
29118
  width: ${HEADER_WIDTH}px;
29116
- height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
29117
29119
  &.o-dragging {
29118
29120
  cursor: grabbing;
29119
29121
  }
@@ -50601,6 +50603,8 @@ class GridSelectionPlugin extends UIPlugin {
50601
50603
  });
50602
50604
  this.selectCell(col, row);
50603
50605
  }
50606
+ const { col, row } = this.gridSelection.anchor.cell;
50607
+ this.moveClient({ sheetId: this.activeSheet.id, col, row });
50604
50608
  }
50605
50609
  /**
50606
50610
  * Ensure selections are not outside sheet boundaries.
@@ -51340,8 +51344,11 @@ class SheetViewPlugin extends UIPlugin {
51340
51344
  }
51341
51345
  case "REMOVE_FILTER_TABLE":
51342
51346
  case "UPDATE_FILTER":
51343
- this.sheetsWithDirtyViewports.add(cmd.sheetId);
51344
- break;
51347
+ case "UNFREEZE_ROWS":
51348
+ case "UNFREEZE_COLUMNS":
51349
+ case "FREEZE_COLUMNS":
51350
+ case "FREEZE_ROWS":
51351
+ case "UNFREEZE_COLUMNS_ROWS":
51345
51352
  case "REMOVE_COLUMNS_ROWS":
51346
51353
  case "RESIZE_COLUMNS_ROWS":
51347
51354
  case "HIDE_COLUMNS_ROWS":
@@ -51354,11 +51361,9 @@ class SheetViewPlugin extends UIPlugin {
51354
51361
  case "FOLD_HEADER_GROUPS_IN_ZONE":
51355
51362
  case "UNFOLD_HEADER_GROUPS_IN_ZONE":
51356
51363
  case "UNFOLD_ALL_HEADER_GROUPS":
51357
- case "FOLD_ALL_HEADER_GROUPS": {
51358
- const sheetId = "sheetId" in cmd ? cmd.sheetId : this.getters.getActiveSheetId();
51359
- this.sheetsWithDirtyViewports.add(sheetId);
51364
+ case "FOLD_ALL_HEADER_GROUPS":
51365
+ this.sheetsWithDirtyViewports.add(cmd.sheetId);
51360
51366
  break;
51361
- }
51362
51367
  case "UPDATE_CELL":
51363
51368
  // update cell content or format can change hidden rows because of data filters
51364
51369
  if ("content" in cmd || "format" in cmd || cmd.style?.fontSize !== undefined) {
@@ -51374,13 +51379,6 @@ class SheetViewPlugin extends UIPlugin {
51374
51379
  case "ACTIVATE_SHEET":
51375
51380
  this.sheetsWithDirtyViewports.add(cmd.sheetIdTo);
51376
51381
  break;
51377
- case "UNFREEZE_ROWS":
51378
- case "UNFREEZE_COLUMNS":
51379
- case "FREEZE_COLUMNS":
51380
- case "FREEZE_ROWS":
51381
- case "UNFREEZE_COLUMNS_ROWS":
51382
- this.resetViewports(this.getters.getActiveSheetId());
51383
- break;
51384
51382
  case "DELETE_SHEET":
51385
51383
  this.sheetsWithDirtyViewports.delete(cmd.sheetId);
51386
51384
  break;
@@ -58217,6 +58215,6 @@ const constants = {
58217
58215
  export { AbstractChart, CommandResult, CorePlugin, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, hooks, invalidateCFEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, tokenize };
58218
58216
 
58219
58217
 
58220
- __info__.version = "17.0.58";
58221
- __info__.date = "2025-04-18T16:20:26.099Z";
58222
- __info__.hash = "88d92de";
58218
+ __info__.version = "17.0.60";
58219
+ __info__.date = "2025-05-02T12:28:49.842Z";
58220
+ __info__.hash = "29510cc";
@@ -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 17.0.58
6
- * @date 2025-04-18T16:20:26.099Z
7
- * @hash 88d92de
5
+ * @version 17.0.60
6
+ * @date 2025-05-02T12:28:49.842Z
7
+ * @hash 29510cc
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -4856,7 +4856,7 @@
4856
4856
  // Note: chartJS modify the runtime in place, so it's important to give it a copy
4857
4857
  this.createChart(deepCopy(runtime.chartJsConfig));
4858
4858
  });
4859
- owl.useEffect(() => this.updateChartJs(deepCopy(this.chartRuntime)), () => [this.chartRuntime]);
4859
+ owl.useEffect(() => this.updateChartJs(deepCopy(this.chartRuntime)), () => [this.chartRuntime, window.devicePixelRatio]);
4860
4860
  }
4861
4861
  createChart(chartData) {
4862
4862
  const canvas = this.canvas.el;
@@ -5394,8 +5394,10 @@
5394
5394
  };
5395
5395
  function drawScoreChart(structure, canvas) {
5396
5396
  const ctx = canvas.getContext("2d");
5397
- canvas.width = structure.canvas.width;
5398
- canvas.height = structure.canvas.height;
5397
+ const dpr = window.devicePixelRatio || 1;
5398
+ canvas.width = structure.canvas.width * dpr;
5399
+ canvas.height = structure.canvas.height * dpr;
5400
+ ctx.scale(dpr, dpr);
5399
5401
  ctx.fillStyle = structure.canvas.backgroundColor;
5400
5402
  ctx.fillRect(0, 0, structure.canvas.width, structure.canvas.height);
5401
5403
  if (structure.title) {
@@ -5744,7 +5746,7 @@
5744
5746
  owl.useEffect(this.createChart.bind(this), () => {
5745
5747
  const canvas = this.canvas.el;
5746
5748
  const rect = canvas.getBoundingClientRect();
5747
- return [rect.width, rect.height, this.runtime, this.canvas.el];
5749
+ return [rect.width, rect.height, this.runtime, this.canvas.el, window.devicePixelRatio];
5748
5750
  });
5749
5751
  }
5750
5752
  createChart() {
@@ -8788,9 +8790,6 @@
8788
8790
  };
8789
8791
  }
8790
8792
  getDefinitionForExcel() {
8791
- // Excel does not support aggregating labels
8792
- if (this.aggregated)
8793
- return undefined;
8794
8793
  const dataSets = this.dataSets
8795
8794
  .map((ds) => toExcelDataset(this.getters, ds))
8796
8795
  .filter((ds) => ds.range !== "" && ds.range !== INCORRECT_RANGE_STRING);
@@ -9367,9 +9366,6 @@
9367
9366
  return new LineChart(definition, this.sheetId, this.getters);
9368
9367
  }
9369
9368
  getDefinitionForExcel() {
9370
- // Excel does not support aggregating labels
9371
- if (this.aggregated)
9372
- return undefined;
9373
9369
  const dataSets = this.dataSets
9374
9370
  .map((ds) => toExcelDataset(this.getters, ds))
9375
9371
  .filter((ds) => ds.range !== "" && ds.range !== INCORRECT_RANGE_STRING);
@@ -9675,9 +9671,6 @@
9675
9671
  return new PieChart(definition, sheetId, this.getters);
9676
9672
  }
9677
9673
  getDefinitionForExcel() {
9678
- // Excel does not support aggregating labels
9679
- if (this.aggregated)
9680
- return undefined;
9681
9674
  const dataSets = this.dataSets
9682
9675
  .map((ds) => toExcelDataset(this.getters, ds))
9683
9676
  .filter((ds) => ds.range !== "" && ds.range !== INCORRECT_RANGE_STRING);
@@ -22382,7 +22375,7 @@
22382
22375
  }
22383
22376
  setHexColor(ev) {
22384
22377
  // only support HEX code input
22385
- const val = ev.target.value.slice(0, 7);
22378
+ const val = ev.target.value.replace("##", "#").slice(0, 7);
22386
22379
  this.state.customHexColor = val;
22387
22380
  if (!isColorValid(val)) ;
22388
22381
  else {
@@ -28481,18 +28474,28 @@
28481
28474
  function useInterval(callback, delay) {
28482
28475
  let intervalId;
28483
28476
  const { setInterval, clearInterval } = window;
28477
+ const pause = () => {
28478
+ clearInterval(intervalId);
28479
+ intervalId = undefined;
28480
+ };
28481
+ const safeCallback = () => {
28482
+ try {
28483
+ callback();
28484
+ }
28485
+ catch (e) {
28486
+ pause();
28487
+ throw e;
28488
+ }
28489
+ };
28484
28490
  owl.useEffect(() => {
28485
- intervalId = setInterval(callback, delay);
28491
+ intervalId = setInterval(safeCallback, delay);
28486
28492
  return () => clearInterval(intervalId);
28487
28493
  }, () => [delay]);
28488
28494
  return {
28489
- pause: () => {
28490
- clearInterval(intervalId);
28491
- intervalId = undefined;
28492
- },
28495
+ pause,
28493
28496
  resume: () => {
28494
28497
  if (intervalId === undefined) {
28495
- intervalId = setInterval(callback, delay);
28498
+ intervalId = setInterval(safeCallback, delay);
28496
28499
  }
28497
28500
  },
28498
28501
  };
@@ -28937,7 +28940,7 @@
28937
28940
  position: absolute;
28938
28941
  top: 0;
28939
28942
  left: ${HEADER_WIDTH}px;
28940
- right: 0;
28943
+ right: ${SCROLLBAR_WIDTH}px;
28941
28944
  height: ${HEADER_HEIGHT}px;
28942
28945
  &.o-dragging {
28943
28946
  cursor: grabbing;
@@ -29112,9 +29115,8 @@
29112
29115
  position: absolute;
29113
29116
  top: ${HEADER_HEIGHT}px;
29114
29117
  left: 0;
29115
- right: 0;
29118
+ bottom: ${SCROLLBAR_WIDTH}px;
29116
29119
  width: ${HEADER_WIDTH}px;
29117
- height: calc(100% - ${HEADER_HEIGHT + SCROLLBAR_WIDTH}px);
29118
29120
  &.o-dragging {
29119
29121
  cursor: grabbing;
29120
29122
  }
@@ -50602,6 +50604,8 @@
50602
50604
  });
50603
50605
  this.selectCell(col, row);
50604
50606
  }
50607
+ const { col, row } = this.gridSelection.anchor.cell;
50608
+ this.moveClient({ sheetId: this.activeSheet.id, col, row });
50605
50609
  }
50606
50610
  /**
50607
50611
  * Ensure selections are not outside sheet boundaries.
@@ -51341,8 +51345,11 @@
51341
51345
  }
51342
51346
  case "REMOVE_FILTER_TABLE":
51343
51347
  case "UPDATE_FILTER":
51344
- this.sheetsWithDirtyViewports.add(cmd.sheetId);
51345
- break;
51348
+ case "UNFREEZE_ROWS":
51349
+ case "UNFREEZE_COLUMNS":
51350
+ case "FREEZE_COLUMNS":
51351
+ case "FREEZE_ROWS":
51352
+ case "UNFREEZE_COLUMNS_ROWS":
51346
51353
  case "REMOVE_COLUMNS_ROWS":
51347
51354
  case "RESIZE_COLUMNS_ROWS":
51348
51355
  case "HIDE_COLUMNS_ROWS":
@@ -51355,11 +51362,9 @@
51355
51362
  case "FOLD_HEADER_GROUPS_IN_ZONE":
51356
51363
  case "UNFOLD_HEADER_GROUPS_IN_ZONE":
51357
51364
  case "UNFOLD_ALL_HEADER_GROUPS":
51358
- case "FOLD_ALL_HEADER_GROUPS": {
51359
- const sheetId = "sheetId" in cmd ? cmd.sheetId : this.getters.getActiveSheetId();
51360
- this.sheetsWithDirtyViewports.add(sheetId);
51365
+ case "FOLD_ALL_HEADER_GROUPS":
51366
+ this.sheetsWithDirtyViewports.add(cmd.sheetId);
51361
51367
  break;
51362
- }
51363
51368
  case "UPDATE_CELL":
51364
51369
  // update cell content or format can change hidden rows because of data filters
51365
51370
  if ("content" in cmd || "format" in cmd || cmd.style?.fontSize !== undefined) {
@@ -51375,13 +51380,6 @@
51375
51380
  case "ACTIVATE_SHEET":
51376
51381
  this.sheetsWithDirtyViewports.add(cmd.sheetIdTo);
51377
51382
  break;
51378
- case "UNFREEZE_ROWS":
51379
- case "UNFREEZE_COLUMNS":
51380
- case "FREEZE_COLUMNS":
51381
- case "FREEZE_ROWS":
51382
- case "UNFREEZE_COLUMNS_ROWS":
51383
- this.resetViewports(this.getters.getActiveSheetId());
51384
- break;
51385
51383
  case "DELETE_SHEET":
51386
51384
  this.sheetsWithDirtyViewports.delete(cmd.sheetId);
51387
51385
  break;
@@ -58253,9 +58251,9 @@
58253
58251
  exports.tokenize = tokenize;
58254
58252
 
58255
58253
 
58256
- __info__.version = "17.0.58";
58257
- __info__.date = "2025-04-18T16:20:26.099Z";
58258
- __info__.hash = "88d92de";
58254
+ __info__.version = "17.0.60";
58255
+ __info__.date = "2025-05-02T12:28:49.842Z";
58256
+ __info__.hash = "29510cc";
58259
58257
 
58260
58258
 
58261
58259
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);