@odoo/o-spreadsheet 16.3.8 → 16.3.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.
@@ -7466,6 +7466,7 @@ class LineChart extends AbstractChart {
7466
7466
  aggregated;
7467
7467
  type = "line";
7468
7468
  dataSetsHaveTitle;
7469
+ cumulative;
7469
7470
  constructor(definition, sheetId, getters) {
7470
7471
  super(definition, sheetId, getters);
7471
7472
  this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
@@ -7477,6 +7478,7 @@ class LineChart extends AbstractChart {
7477
7478
  this.stacked = definition.stacked;
7478
7479
  this.aggregated = definition.aggregated;
7479
7480
  this.dataSetsHaveTitle = definition.dataSetsHaveTitle;
7481
+ this.cumulative = definition.cumulative;
7480
7482
  }
7481
7483
  static validateChartDefinition(validator, definition) {
7482
7484
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -7497,6 +7499,7 @@ class LineChart extends AbstractChart {
7497
7499
  labelRange: context.auxiliaryRange || undefined,
7498
7500
  stacked: false,
7499
7501
  aggregated: false,
7502
+ cumulative: false,
7500
7503
  };
7501
7504
  }
7502
7505
  getDefinition() {
@@ -7517,6 +7520,7 @@ class LineChart extends AbstractChart {
7517
7520
  labelsAsText: this.labelsAsText,
7518
7521
  stacked: this.stacked,
7519
7522
  aggregated: this.aggregated,
7523
+ cumulative: this.cumulative,
7520
7524
  };
7521
7525
  }
7522
7526
  getContextCreation() {
@@ -7725,6 +7729,16 @@ function createLineChartRuntime(chart, getters) {
7725
7729
  if (chart.stacked) {
7726
7730
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
7727
7731
  }
7732
+ if (chart.cumulative) {
7733
+ let accumulator = 0;
7734
+ data = data.map((value) => {
7735
+ if (!isNaN(value)) {
7736
+ accumulator += parseFloat(value);
7737
+ return accumulator;
7738
+ }
7739
+ return value;
7740
+ });
7741
+ }
7728
7742
  const backgroundColor = rgbaToHex(backgroundRGBA);
7729
7743
  const dataset = {
7730
7744
  label,
@@ -8546,6 +8560,7 @@ function getSmartChartDefinition(zone, getters) {
8546
8560
  labelsAsText: false,
8547
8561
  stacked: false,
8548
8562
  aggregated: false,
8563
+ cumulative: false,
8549
8564
  labelRange: labelRangeXc,
8550
8565
  type: "line",
8551
8566
  dataSetsHaveTitle,
@@ -8908,6 +8923,13 @@ const REMOVE_ROWS_ACTION = (env) => {
8908
8923
  elements: rows,
8909
8924
  });
8910
8925
  };
8926
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
8927
+ const sheetId = env.model.getters.getActiveSheetId();
8928
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
8929
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
8930
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
8931
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
8932
+ };
8911
8933
  const REMOVE_COLUMNS_NAME = (env) => {
8912
8934
  if (env.model.getters.getSelectedZones().length > 1) {
8913
8935
  return _lt("Delete columns");
@@ -8932,7 +8954,7 @@ const REMOVE_COLUMNS_NAME = (env) => {
8932
8954
  const NOT_ALL_VISIBLE_ROWS_SELECTED = (env) => {
8933
8955
  const sheetId = env.model.getters.getActiveSheetId();
8934
8956
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
8935
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
8957
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
8936
8958
  };
8937
8959
  const REMOVE_COLUMNS_ACTION = (env) => {
8938
8960
  let columns = [...env.model.getters.getActiveCols()];
@@ -8951,7 +8973,7 @@ const REMOVE_COLUMNS_ACTION = (env) => {
8951
8973
  const NOT_ALL_VISIBLE_COLS_SELECTED = (env) => {
8952
8974
  const sheetId = env.model.getters.getActiveSheetId();
8953
8975
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
8954
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
8976
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
8955
8977
  };
8956
8978
  const INSERT_CELL_SHIFT_DOWN = (env) => {
8957
8979
  const zone = env.model.getters.getSelectedZone();
@@ -9408,7 +9430,7 @@ const deleteValues = {
9408
9430
  const deleteRows = {
9409
9431
  name: REMOVE_ROWS_NAME,
9410
9432
  execute: REMOVE_ROWS_ACTION,
9411
- isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
9433
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
9412
9434
  };
9413
9435
  const deleteRow = {
9414
9436
  ...deleteRows,
@@ -9421,7 +9443,7 @@ const clearRows = {
9421
9443
  const deleteCols = {
9422
9444
  name: REMOVE_COLUMNS_NAME,
9423
9445
  execute: REMOVE_COLUMNS_ACTION,
9424
- isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
9446
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
9425
9447
  };
9426
9448
  const deleteCol = {
9427
9449
  ...deleteCols,
@@ -18469,6 +18491,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
18469
18491
  aggregated: ev.target.checked,
18470
18492
  });
18471
18493
  }
18494
+ onUpdateCumulative(ev) {
18495
+ this.props.updateChart(this.props.figureId, {
18496
+ cumulative: ev.target.checked,
18497
+ });
18498
+ }
18472
18499
  }
18473
18500
 
18474
18501
  class LineChartDesignPanel extends LineBarPieDesignPanel {
@@ -20113,34 +20140,25 @@ FigureComponent.props = {
20113
20140
  };
20114
20141
 
20115
20142
  function startDnd(onMouseMove, onMouseUp, onMouseDown = () => { }) {
20116
- const _onMouseDown = (ev) => {
20117
- ev.preventDefault();
20118
- onMouseDown(ev);
20119
- };
20120
- const _onMouseMove = (ev) => {
20121
- ev.preventDefault();
20122
- onMouseMove(ev);
20123
- };
20124
20143
  const _onMouseUp = (ev) => {
20125
- ev.preventDefault();
20126
20144
  onMouseUp(ev);
20127
- window.removeEventListener("mousedown", _onMouseDown);
20145
+ window.removeEventListener("mousedown", onMouseDown);
20128
20146
  window.removeEventListener("mouseup", _onMouseUp);
20129
20147
  window.removeEventListener("dragstart", _onDragStart);
20130
- window.removeEventListener("mousemove", _onMouseMove);
20131
- window.removeEventListener("wheel", _onMouseMove);
20148
+ window.removeEventListener("mousemove", onMouseMove);
20149
+ window.removeEventListener("wheel", onMouseMove);
20132
20150
  };
20133
20151
  function _onDragStart(ev) {
20134
20152
  ev.preventDefault();
20135
20153
  }
20136
- window.addEventListener("mousedown", _onMouseDown);
20154
+ window.addEventListener("mousedown", onMouseDown);
20137
20155
  window.addEventListener("mouseup", _onMouseUp);
20138
20156
  window.addEventListener("dragstart", _onDragStart);
20139
- window.addEventListener("mousemove", _onMouseMove);
20157
+ window.addEventListener("mousemove", onMouseMove);
20140
20158
  // mouse wheel on window is by default a passive event.
20141
20159
  // preventDefault() is not allowed in passive event handler.
20142
20160
  // https://chromestatus.com/feature/6662647093133312
20143
- window.addEventListener("wheel", _onMouseMove, { passive: false });
20161
+ window.addEventListener("wheel", onMouseMove, { passive: false });
20144
20162
  }
20145
20163
  /**
20146
20164
  * Function to be used during a mousedown event, this function allows to
@@ -23701,7 +23719,8 @@ class Grid extends owl.Component {
23701
23719
  }
23702
23720
  let prevCol = col;
23703
23721
  let prevRow = row;
23704
- const onMouseMove = (col, row) => {
23722
+ const onMouseMove = (col, row, ev) => {
23723
+ ev.preventDefault();
23705
23724
  if ((col !== prevCol && col != -1) || (row !== prevRow && row != -1)) {
23706
23725
  prevCol = col === -1 ? prevCol : col;
23707
23726
  prevRow = row === -1 ? prevRow : row;
@@ -26416,6 +26435,7 @@ function convertChartData(chartData) {
26416
26435
  legendPosition: chartData.legendPosition,
26417
26436
  stacked: chartData.stacked || false,
26418
26437
  aggregated: false,
26438
+ cumulative: chartData.cumulative || false,
26419
26439
  labelsAsText: false,
26420
26440
  };
26421
26441
  }
@@ -31096,7 +31116,7 @@ class HeaderSizePlugin extends CorePlugin {
31096
31116
 
31097
31117
  class HeaderVisibilityPlugin extends CorePlugin {
31098
31118
  static getters = [
31099
- "canRemoveHeaders",
31119
+ "checkElementsIncludeAllVisibleHeaders",
31100
31120
  "getHiddenColsGroups",
31101
31121
  "getHiddenRowsGroups",
31102
31122
  "isRowHiddenByUser",
@@ -31130,7 +31150,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
31130
31150
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
31131
31151
  return 27 /* CommandResult.InvalidSheetId */;
31132
31152
  }
31133
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31153
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31134
31154
  return 8 /* CommandResult.NotEnoughElements */;
31135
31155
  }
31136
31156
  return 0 /* CommandResult.Success */;
@@ -31180,9 +31200,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
31180
31200
  }
31181
31201
  return;
31182
31202
  }
31183
- canRemoveHeaders(sheetId, dimension, elements) {
31203
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
31184
31204
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
31185
- return !includesAll(elements, visibleHeaders);
31205
+ return includesAll(elements, visibleHeaders);
31186
31206
  }
31187
31207
  isRowHiddenByUser(sheetId, index) {
31188
31208
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -32269,6 +32289,7 @@ class SheetPlugin extends CorePlugin {
32269
32289
  "getPaneDivisions",
32270
32290
  "checkZonesExistInSheet",
32271
32291
  "getCommandZones",
32292
+ "checkElementsIncludeAllNonFrozenHeaders",
32272
32293
  ];
32273
32294
  sheetIdsMapName = {};
32274
32295
  orderedSheetIds = [];
@@ -32325,6 +32346,9 @@ class SheetPlugin extends CorePlugin {
32325
32346
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
32326
32347
  return 86 /* CommandResult.InvalidHeaderIndex */;
32327
32348
  }
32349
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
32350
+ return 8 /* CommandResult.NotEnoughElements */;
32351
+ }
32328
32352
  else {
32329
32353
  return 0 /* CommandResult.Success */;
32330
32354
  }
@@ -32607,6 +32631,20 @@ class SheetPlugin extends CorePlugin {
32607
32631
  }
32608
32632
  this.history.update("sheets", sheetId, "panes", panes);
32609
32633
  }
32634
+ /**
32635
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
32636
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
32637
+ */
32638
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
32639
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
32640
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
32641
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
32642
+ if (!startIndex) {
32643
+ return false;
32644
+ }
32645
+ const indicesToCheck = range(startIndex, endIndex);
32646
+ return includesAll(elements, indicesToCheck);
32647
+ }
32610
32648
  // ---------------------------------------------------------------------------
32611
32649
  // Row/Col manipulation
32612
32650
  // ---------------------------------------------------------------------------
@@ -34571,6 +34609,9 @@ class InternalViewport {
34571
34609
  const sheetId = this.sheetId;
34572
34610
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
34573
34611
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
34612
+ if (this.left === -1) {
34613
+ this.left = this.boundaries.left;
34614
+ }
34574
34615
  if (this.right === -1) {
34575
34616
  this.right = this.getters.getNumberCols(sheetId) - 1;
34576
34617
  }
@@ -34584,6 +34625,9 @@ class InternalViewport {
34584
34625
  const sheetId = this.sheetId;
34585
34626
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
34586
34627
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
34628
+ if (this.top === -1) {
34629
+ this.top = this.boundaries.top;
34630
+ }
34587
34631
  if (this.bottom === -1) {
34588
34632
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
34589
34633
  }
@@ -47663,6 +47707,6 @@ exports.setTranslationMethod = setTranslationMethod;
47663
47707
  exports.tokenize = tokenize;
47664
47708
 
47665
47709
 
47666
- __info__.version = '16.3.8';
47667
- __info__.date = '2023-08-17T11:06:03.177Z';
47668
- __info__.hash = 'af65228';
47710
+ __info__.version = '16.3.10';
47711
+ __info__.date = '2023-09-12T11:41:57.775Z';
47712
+ __info__.hash = '3a95562';
@@ -405,6 +405,7 @@ interface LineChartDefinition {
405
405
  readonly labelsAsText: boolean;
406
406
  readonly stacked: boolean;
407
407
  readonly aggregated?: boolean;
408
+ readonly cumulative: boolean;
408
409
  }
409
410
  type LineChartRuntime = {
410
411
  chartJsConfig: ChartConfiguration;
@@ -471,6 +472,7 @@ interface ExcelChartDefinition {
471
472
  readonly verticalAxisPosition: VerticalAxisPosition;
472
473
  readonly legendPosition: LegendPosition;
473
474
  readonly stacked?: boolean;
475
+ readonly cumulative?: boolean;
474
476
  }
475
477
  interface ChartCreationContext {
476
478
  readonly range?: string[];
@@ -3420,11 +3422,11 @@ declare class HeaderSizePlugin extends CorePlugin<HeaderSizeState> implements He
3420
3422
  }
3421
3423
 
3422
3424
  declare class HeaderVisibilityPlugin extends CorePlugin {
3423
- static getters: readonly ["canRemoveHeaders", "getHiddenColsGroups", "getHiddenRowsGroups", "isRowHiddenByUser", "isColHiddenByUser"];
3425
+ static getters: readonly ["checkElementsIncludeAllVisibleHeaders", "getHiddenColsGroups", "getHiddenRowsGroups", "isRowHiddenByUser", "isColHiddenByUser"];
3424
3426
  private readonly hiddenHeaders;
3425
3427
  allowDispatch(cmd: Command): CommandResult.Success | CommandResult.NotEnoughElements | CommandResult.InvalidSheetId | CommandResult.TooManyHiddenElements | CommandResult.InvalidHeaderIndex;
3426
3428
  handle(cmd: Command): void;
3427
- canRemoveHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
3429
+ checkElementsIncludeAllVisibleHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
3428
3430
  isRowHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
3429
3431
  isColHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
3430
3432
  getHiddenColsGroups(sheetId: UID): ConsecutiveIndexes[];
@@ -3547,7 +3549,7 @@ interface SheetState$1 {
3547
3549
  readonly cellPosition: Record<UID, CellPosition | undefined>;
3548
3550
  }
3549
3551
  declare class SheetPlugin extends CorePlugin<SheetState$1> implements SheetState$1 {
3550
- static getters: readonly ["getSheetName", "tryGetSheetName", "getSheet", "tryGetSheet", "getSheetIdByName", "getSheetIds", "getVisibleSheetIds", "isSheetVisible", "getEvaluationSheets", "doesHeaderExist", "getCell", "getCellPosition", "getColsZone", "getRowCells", "getRowsZone", "getNumberCols", "getNumberRows", "getNumberHeaders", "getGridLinesVisibility", "getNextSheetName", "isEmpty", "getSheetSize", "getSheetZone", "getPaneDivisions", "checkZonesExistInSheet", "getCommandZones"];
3552
+ static getters: readonly ["getSheetName", "tryGetSheetName", "getSheet", "tryGetSheet", "getSheetIdByName", "getSheetIds", "getVisibleSheetIds", "isSheetVisible", "getEvaluationSheets", "doesHeaderExist", "getCell", "getCellPosition", "getColsZone", "getRowCells", "getRowsZone", "getNumberCols", "getNumberRows", "getNumberHeaders", "getGridLinesVisibility", "getNextSheetName", "isEmpty", "getSheetSize", "getSheetZone", "getPaneDivisions", "checkZonesExistInSheet", "getCommandZones", "checkElementsIncludeAllNonFrozenHeaders"];
3551
3553
  readonly sheetIdsMapName: Record<string, UID | undefined>;
3552
3554
  readonly orderedSheetIds: UID[];
3553
3555
  readonly sheets: Record<UID, Sheet | undefined>;
@@ -3589,6 +3591,11 @@ declare class SheetPlugin extends CorePlugin<SheetState$1> implements SheetState
3589
3591
  getSheetZone(sheetId: UID): Zone;
3590
3592
  getPaneDivisions(sheetId: UID): Readonly<PaneDivision>;
3591
3593
  private setPaneDivisions;
3594
+ /**
3595
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
3596
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
3597
+ */
3598
+ checkElementsIncludeAllNonFrozenHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
3592
3599
  /**
3593
3600
  * Check if a zone only contains empty cells
3594
3601
  */
@@ -5245,6 +5252,7 @@ declare class LineConfigPanel extends LineBarPieConfigPanel {
5245
5252
  onUpdateLabelsAsText(ev: any): void;
5246
5253
  onUpdateStacked(ev: any): void;
5247
5254
  onUpdateAggregated(ev: any): void;
5255
+ onUpdateCumulative(ev: any): void;
5248
5256
  }
5249
5257
 
5250
5258
  interface Props$x {
@@ -7462,6 +7462,7 @@ class LineChart extends AbstractChart {
7462
7462
  aggregated;
7463
7463
  type = "line";
7464
7464
  dataSetsHaveTitle;
7465
+ cumulative;
7465
7466
  constructor(definition, sheetId, getters) {
7466
7467
  super(definition, sheetId, getters);
7467
7468
  this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
@@ -7473,6 +7474,7 @@ class LineChart extends AbstractChart {
7473
7474
  this.stacked = definition.stacked;
7474
7475
  this.aggregated = definition.aggregated;
7475
7476
  this.dataSetsHaveTitle = definition.dataSetsHaveTitle;
7477
+ this.cumulative = definition.cumulative;
7476
7478
  }
7477
7479
  static validateChartDefinition(validator, definition) {
7478
7480
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -7493,6 +7495,7 @@ class LineChart extends AbstractChart {
7493
7495
  labelRange: context.auxiliaryRange || undefined,
7494
7496
  stacked: false,
7495
7497
  aggregated: false,
7498
+ cumulative: false,
7496
7499
  };
7497
7500
  }
7498
7501
  getDefinition() {
@@ -7513,6 +7516,7 @@ class LineChart extends AbstractChart {
7513
7516
  labelsAsText: this.labelsAsText,
7514
7517
  stacked: this.stacked,
7515
7518
  aggregated: this.aggregated,
7519
+ cumulative: this.cumulative,
7516
7520
  };
7517
7521
  }
7518
7522
  getContextCreation() {
@@ -7721,6 +7725,16 @@ function createLineChartRuntime(chart, getters) {
7721
7725
  if (chart.stacked) {
7722
7726
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
7723
7727
  }
7728
+ if (chart.cumulative) {
7729
+ let accumulator = 0;
7730
+ data = data.map((value) => {
7731
+ if (!isNaN(value)) {
7732
+ accumulator += parseFloat(value);
7733
+ return accumulator;
7734
+ }
7735
+ return value;
7736
+ });
7737
+ }
7724
7738
  const backgroundColor = rgbaToHex(backgroundRGBA);
7725
7739
  const dataset = {
7726
7740
  label,
@@ -8542,6 +8556,7 @@ function getSmartChartDefinition(zone, getters) {
8542
8556
  labelsAsText: false,
8543
8557
  stacked: false,
8544
8558
  aggregated: false,
8559
+ cumulative: false,
8545
8560
  labelRange: labelRangeXc,
8546
8561
  type: "line",
8547
8562
  dataSetsHaveTitle,
@@ -8904,6 +8919,13 @@ const REMOVE_ROWS_ACTION = (env) => {
8904
8919
  elements: rows,
8905
8920
  });
8906
8921
  };
8922
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
8923
+ const sheetId = env.model.getters.getActiveSheetId();
8924
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
8925
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
8926
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
8927
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
8928
+ };
8907
8929
  const REMOVE_COLUMNS_NAME = (env) => {
8908
8930
  if (env.model.getters.getSelectedZones().length > 1) {
8909
8931
  return _lt("Delete columns");
@@ -8928,7 +8950,7 @@ const REMOVE_COLUMNS_NAME = (env) => {
8928
8950
  const NOT_ALL_VISIBLE_ROWS_SELECTED = (env) => {
8929
8951
  const sheetId = env.model.getters.getActiveSheetId();
8930
8952
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
8931
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
8953
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
8932
8954
  };
8933
8955
  const REMOVE_COLUMNS_ACTION = (env) => {
8934
8956
  let columns = [...env.model.getters.getActiveCols()];
@@ -8947,7 +8969,7 @@ const REMOVE_COLUMNS_ACTION = (env) => {
8947
8969
  const NOT_ALL_VISIBLE_COLS_SELECTED = (env) => {
8948
8970
  const sheetId = env.model.getters.getActiveSheetId();
8949
8971
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
8950
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
8972
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
8951
8973
  };
8952
8974
  const INSERT_CELL_SHIFT_DOWN = (env) => {
8953
8975
  const zone = env.model.getters.getSelectedZone();
@@ -9404,7 +9426,7 @@ const deleteValues = {
9404
9426
  const deleteRows = {
9405
9427
  name: REMOVE_ROWS_NAME,
9406
9428
  execute: REMOVE_ROWS_ACTION,
9407
- isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
9429
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
9408
9430
  };
9409
9431
  const deleteRow = {
9410
9432
  ...deleteRows,
@@ -9417,7 +9439,7 @@ const clearRows = {
9417
9439
  const deleteCols = {
9418
9440
  name: REMOVE_COLUMNS_NAME,
9419
9441
  execute: REMOVE_COLUMNS_ACTION,
9420
- isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
9442
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
9421
9443
  };
9422
9444
  const deleteCol = {
9423
9445
  ...deleteCols,
@@ -18465,6 +18487,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
18465
18487
  aggregated: ev.target.checked,
18466
18488
  });
18467
18489
  }
18490
+ onUpdateCumulative(ev) {
18491
+ this.props.updateChart(this.props.figureId, {
18492
+ cumulative: ev.target.checked,
18493
+ });
18494
+ }
18468
18495
  }
18469
18496
 
18470
18497
  class LineChartDesignPanel extends LineBarPieDesignPanel {
@@ -20109,34 +20136,25 @@ FigureComponent.props = {
20109
20136
  };
20110
20137
 
20111
20138
  function startDnd(onMouseMove, onMouseUp, onMouseDown = () => { }) {
20112
- const _onMouseDown = (ev) => {
20113
- ev.preventDefault();
20114
- onMouseDown(ev);
20115
- };
20116
- const _onMouseMove = (ev) => {
20117
- ev.preventDefault();
20118
- onMouseMove(ev);
20119
- };
20120
20139
  const _onMouseUp = (ev) => {
20121
- ev.preventDefault();
20122
20140
  onMouseUp(ev);
20123
- window.removeEventListener("mousedown", _onMouseDown);
20141
+ window.removeEventListener("mousedown", onMouseDown);
20124
20142
  window.removeEventListener("mouseup", _onMouseUp);
20125
20143
  window.removeEventListener("dragstart", _onDragStart);
20126
- window.removeEventListener("mousemove", _onMouseMove);
20127
- window.removeEventListener("wheel", _onMouseMove);
20144
+ window.removeEventListener("mousemove", onMouseMove);
20145
+ window.removeEventListener("wheel", onMouseMove);
20128
20146
  };
20129
20147
  function _onDragStart(ev) {
20130
20148
  ev.preventDefault();
20131
20149
  }
20132
- window.addEventListener("mousedown", _onMouseDown);
20150
+ window.addEventListener("mousedown", onMouseDown);
20133
20151
  window.addEventListener("mouseup", _onMouseUp);
20134
20152
  window.addEventListener("dragstart", _onDragStart);
20135
- window.addEventListener("mousemove", _onMouseMove);
20153
+ window.addEventListener("mousemove", onMouseMove);
20136
20154
  // mouse wheel on window is by default a passive event.
20137
20155
  // preventDefault() is not allowed in passive event handler.
20138
20156
  // https://chromestatus.com/feature/6662647093133312
20139
- window.addEventListener("wheel", _onMouseMove, { passive: false });
20157
+ window.addEventListener("wheel", onMouseMove, { passive: false });
20140
20158
  }
20141
20159
  /**
20142
20160
  * Function to be used during a mousedown event, this function allows to
@@ -23697,7 +23715,8 @@ class Grid extends Component {
23697
23715
  }
23698
23716
  let prevCol = col;
23699
23717
  let prevRow = row;
23700
- const onMouseMove = (col, row) => {
23718
+ const onMouseMove = (col, row, ev) => {
23719
+ ev.preventDefault();
23701
23720
  if ((col !== prevCol && col != -1) || (row !== prevRow && row != -1)) {
23702
23721
  prevCol = col === -1 ? prevCol : col;
23703
23722
  prevRow = row === -1 ? prevRow : row;
@@ -26412,6 +26431,7 @@ function convertChartData(chartData) {
26412
26431
  legendPosition: chartData.legendPosition,
26413
26432
  stacked: chartData.stacked || false,
26414
26433
  aggregated: false,
26434
+ cumulative: chartData.cumulative || false,
26415
26435
  labelsAsText: false,
26416
26436
  };
26417
26437
  }
@@ -31092,7 +31112,7 @@ class HeaderSizePlugin extends CorePlugin {
31092
31112
 
31093
31113
  class HeaderVisibilityPlugin extends CorePlugin {
31094
31114
  static getters = [
31095
- "canRemoveHeaders",
31115
+ "checkElementsIncludeAllVisibleHeaders",
31096
31116
  "getHiddenColsGroups",
31097
31117
  "getHiddenRowsGroups",
31098
31118
  "isRowHiddenByUser",
@@ -31126,7 +31146,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
31126
31146
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
31127
31147
  return 27 /* CommandResult.InvalidSheetId */;
31128
31148
  }
31129
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31149
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31130
31150
  return 8 /* CommandResult.NotEnoughElements */;
31131
31151
  }
31132
31152
  return 0 /* CommandResult.Success */;
@@ -31176,9 +31196,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
31176
31196
  }
31177
31197
  return;
31178
31198
  }
31179
- canRemoveHeaders(sheetId, dimension, elements) {
31199
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
31180
31200
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
31181
- return !includesAll(elements, visibleHeaders);
31201
+ return includesAll(elements, visibleHeaders);
31182
31202
  }
31183
31203
  isRowHiddenByUser(sheetId, index) {
31184
31204
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -32265,6 +32285,7 @@ class SheetPlugin extends CorePlugin {
32265
32285
  "getPaneDivisions",
32266
32286
  "checkZonesExistInSheet",
32267
32287
  "getCommandZones",
32288
+ "checkElementsIncludeAllNonFrozenHeaders",
32268
32289
  ];
32269
32290
  sheetIdsMapName = {};
32270
32291
  orderedSheetIds = [];
@@ -32321,6 +32342,9 @@ class SheetPlugin extends CorePlugin {
32321
32342
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
32322
32343
  return 86 /* CommandResult.InvalidHeaderIndex */;
32323
32344
  }
32345
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
32346
+ return 8 /* CommandResult.NotEnoughElements */;
32347
+ }
32324
32348
  else {
32325
32349
  return 0 /* CommandResult.Success */;
32326
32350
  }
@@ -32603,6 +32627,20 @@ class SheetPlugin extends CorePlugin {
32603
32627
  }
32604
32628
  this.history.update("sheets", sheetId, "panes", panes);
32605
32629
  }
32630
+ /**
32631
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
32632
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
32633
+ */
32634
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
32635
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
32636
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
32637
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
32638
+ if (!startIndex) {
32639
+ return false;
32640
+ }
32641
+ const indicesToCheck = range(startIndex, endIndex);
32642
+ return includesAll(elements, indicesToCheck);
32643
+ }
32606
32644
  // ---------------------------------------------------------------------------
32607
32645
  // Row/Col manipulation
32608
32646
  // ---------------------------------------------------------------------------
@@ -34567,6 +34605,9 @@ class InternalViewport {
34567
34605
  const sheetId = this.sheetId;
34568
34606
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
34569
34607
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
34608
+ if (this.left === -1) {
34609
+ this.left = this.boundaries.left;
34610
+ }
34570
34611
  if (this.right === -1) {
34571
34612
  this.right = this.getters.getNumberCols(sheetId) - 1;
34572
34613
  }
@@ -34580,6 +34621,9 @@ class InternalViewport {
34580
34621
  const sheetId = this.sheetId;
34581
34622
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
34582
34623
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
34624
+ if (this.top === -1) {
34625
+ this.top = this.boundaries.top;
34626
+ }
34583
34627
  if (this.bottom === -1) {
34584
34628
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
34585
34629
  }
@@ -47631,6 +47675,6 @@ function addFunction(functionName, functionDescription) {
47631
47675
  export { AbstractChart, CommandResult, CorePlugin, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, compile, components, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, invalidateEvaluationCommands, links, load, parse, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, tokenize };
47632
47676
 
47633
47677
 
47634
- __info__.version = '16.3.8';
47635
- __info__.date = '2023-08-17T11:06:03.177Z';
47636
- __info__.hash = 'af65228';
47678
+ __info__.version = '16.3.10';
47679
+ __info__.date = '2023-09-12T11:41:57.775Z';
47680
+ __info__.hash = '3a95562';