@odoo/o-spreadsheet 16.0.17 → 16.0.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.
@@ -3519,6 +3519,7 @@ css /* scss */ `
3519
3519
  background-color: white;
3520
3520
  border-left: 3px solid red;
3521
3521
  padding: 10px;
3522
+ overflow-wrap: break-word;
3522
3523
  }
3523
3524
  `;
3524
3525
  class ErrorToolTip extends owl.Component {
@@ -5035,6 +5036,13 @@ const REMOVE_ROWS_ACTION = (env) => {
5035
5036
  elements: rows,
5036
5037
  });
5037
5038
  };
5039
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
5040
+ const sheetId = env.model.getters.getActiveSheetId();
5041
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
5042
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
5043
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
5044
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
5045
+ };
5038
5046
  const REMOVE_COLUMNS_NAME = (env) => {
5039
5047
  if (env.model.getters.getSelectedZones().length > 1) {
5040
5048
  return _lt("Delete columns");
@@ -5639,11 +5647,7 @@ colMenuRegistry
5639
5647
  name: REMOVE_COLUMNS_NAME,
5640
5648
  sequence: 90,
5641
5649
  action: REMOVE_COLUMNS_ACTION,
5642
- isVisible: (env) => {
5643
- const sheetId = env.model.getters.getActiveSheetId();
5644
- const selectedCols = env.model.getters.getElementsFromSelection("COL");
5645
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
5646
- },
5650
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
5647
5651
  })
5648
5652
  .add("clear_column", {
5649
5653
  name: DELETE_CONTENT_COLUMNS_NAME,
@@ -5657,7 +5661,7 @@ colMenuRegistry
5657
5661
  isVisible: (env) => {
5658
5662
  const sheetId = env.model.getters.getActiveSheetId();
5659
5663
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
5660
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
5664
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
5661
5665
  },
5662
5666
  separator: true,
5663
5667
  })
@@ -5731,11 +5735,7 @@ rowMenuRegistry
5731
5735
  name: REMOVE_ROWS_NAME,
5732
5736
  sequence: 70,
5733
5737
  action: REMOVE_ROWS_ACTION,
5734
- isVisible: (env) => {
5735
- const sheetId = env.model.getters.getActiveSheetId();
5736
- const selectedRows = env.model.getters.getElementsFromSelection("ROW");
5737
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
5738
- },
5738
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
5739
5739
  })
5740
5740
  .add("clear_row", {
5741
5741
  name: DELETE_CONTENT_ROWS_NAME,
@@ -5749,7 +5749,7 @@ rowMenuRegistry
5749
5749
  isVisible: (env) => {
5750
5750
  const sheetId = env.model.getters.getActiveSheetId();
5751
5751
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
5752
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
5752
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
5753
5753
  },
5754
5754
  separator: true,
5755
5755
  })
@@ -6043,11 +6043,13 @@ topbarMenuRegistry
6043
6043
  name: REMOVE_ROWS_NAME,
6044
6044
  sequence: 80,
6045
6045
  action: REMOVE_ROWS_ACTION,
6046
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
6046
6047
  })
6047
6048
  .addChild("edit_delete_column", ["edit"], {
6048
6049
  name: REMOVE_COLUMNS_NAME,
6049
6050
  sequence: 90,
6050
6051
  action: REMOVE_COLUMNS_ACTION,
6052
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
6051
6053
  })
6052
6054
  .addChild("edit_delete_cell_shift_up", ["edit"], {
6053
6055
  name: _lt("Delete cell and shift up"),
@@ -7814,6 +7816,7 @@ class LineChart extends AbstractChart {
7814
7816
  this.legendPosition = definition.legendPosition;
7815
7817
  this.labelsAsText = definition.labelsAsText;
7816
7818
  this.stacked = definition.stacked;
7819
+ this.cumulative = definition.cumulative;
7817
7820
  }
7818
7821
  static validateChartDefinition(validator, definition) {
7819
7822
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -7833,6 +7836,7 @@ class LineChart extends AbstractChart {
7833
7836
  verticalAxisPosition: "left",
7834
7837
  labelRange: context.auxiliaryRange || undefined,
7835
7838
  stacked: false,
7839
+ cumulative: false,
7836
7840
  };
7837
7841
  }
7838
7842
  getDefinition() {
@@ -7852,6 +7856,7 @@ class LineChart extends AbstractChart {
7852
7856
  title: this.title,
7853
7857
  labelsAsText: this.labelsAsText,
7854
7858
  stacked: this.stacked,
7859
+ cumulative: this.cumulative,
7855
7860
  };
7856
7861
  }
7857
7862
  getContextCreation() {
@@ -8036,6 +8041,16 @@ function createLineChartRuntime(chart, getters) {
8036
8041
  if (chart.stacked) {
8037
8042
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
8038
8043
  }
8044
+ if (chart.cumulative) {
8045
+ let accumulator = 0;
8046
+ data = data.map((value) => {
8047
+ if (!isNaN(value)) {
8048
+ accumulator += parseFloat(value);
8049
+ return accumulator;
8050
+ }
8051
+ return value;
8052
+ });
8053
+ }
8039
8054
  const backgroundColor = rgbaToHex(backgroundRGBA);
8040
8055
  const dataset = {
8041
8056
  label,
@@ -8821,6 +8836,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
8821
8836
  stacked: ev.target.checked,
8822
8837
  });
8823
8838
  }
8839
+ onUpdateCumulative(ev) {
8840
+ this.props.updateChart(this.props.figureId, {
8841
+ cumulative: ev.target.checked,
8842
+ });
8843
+ }
8824
8844
  }
8825
8845
  LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
8826
8846
 
@@ -24650,6 +24670,7 @@ function convertChartData(chartData) {
24650
24670
  verticalAxisPosition: chartData.verticalAxisPosition,
24651
24671
  legendPosition: chartData.legendPosition,
24652
24672
  stacked: chartData.stacked || false,
24673
+ cumulative: chartData.cumulative || false,
24653
24674
  labelsAsText: false,
24654
24675
  };
24655
24676
  }
@@ -29142,7 +29163,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
29142
29163
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
29143
29164
  return 27 /* CommandResult.InvalidSheetId */;
29144
29165
  }
29145
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29166
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29146
29167
  return 8 /* CommandResult.NotEnoughElements */;
29147
29168
  }
29148
29169
  return 0 /* CommandResult.Success */;
@@ -29192,9 +29213,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
29192
29213
  }
29193
29214
  return;
29194
29215
  }
29195
- canRemoveHeaders(sheetId, dimension, elements) {
29216
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
29196
29217
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
29197
- return !includesAll(elements, visibleHeaders);
29218
+ return includesAll(elements, visibleHeaders);
29198
29219
  }
29199
29220
  isRowHiddenByUser(sheetId, index) {
29200
29221
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -29290,7 +29311,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
29290
29311
  }
29291
29312
  }
29292
29313
  HeaderVisibilityPlugin.getters = [
29293
- "canRemoveHeaders",
29314
+ "checkElementsIncludeAllVisibleHeaders",
29294
29315
  "getHiddenColsGroups",
29295
29316
  "getHiddenRowsGroups",
29296
29317
  "isRowHiddenByUser",
@@ -29809,6 +29830,9 @@ class SheetPlugin extends CorePlugin {
29809
29830
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
29810
29831
  return 85 /* CommandResult.InvalidHeaderIndex */;
29811
29832
  }
29833
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29834
+ return 8 /* CommandResult.NotEnoughElements */;
29835
+ }
29812
29836
  else {
29813
29837
  return 0 /* CommandResult.Success */;
29814
29838
  }
@@ -30108,6 +30132,20 @@ class SheetPlugin extends CorePlugin {
30108
30132
  }
30109
30133
  this.history.update("sheets", sheetId, "panes", panes);
30110
30134
  }
30135
+ /**
30136
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
30137
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
30138
+ */
30139
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
30140
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
30141
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
30142
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
30143
+ if (!startIndex) {
30144
+ return false;
30145
+ }
30146
+ const indicesToCheck = range(startIndex, endIndex);
30147
+ return includesAll(elements, indicesToCheck);
30148
+ }
30111
30149
  // ---------------------------------------------------------------------------
30112
30150
  // Row/Col manipulation
30113
30151
  // ---------------------------------------------------------------------------
@@ -30642,6 +30680,7 @@ SheetPlugin.getters = [
30642
30680
  "getSheetSize",
30643
30681
  "getSheetZone",
30644
30682
  "getPaneDivisions",
30683
+ "checkElementsIncludeAllNonFrozenHeaders",
30645
30684
  ];
30646
30685
 
30647
30686
  /**
@@ -36435,6 +36474,9 @@ class InternalViewport {
36435
36474
  const sheetId = this.sheetId;
36436
36475
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
36437
36476
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
36477
+ if (this.left === -1) {
36478
+ this.left = this.boundaries.left;
36479
+ }
36438
36480
  if (this.right === -1) {
36439
36481
  this.right = this.getters.getNumberCols(sheetId) - 1;
36440
36482
  }
@@ -36448,6 +36490,9 @@ class InternalViewport {
36448
36490
  const sheetId = this.sheetId;
36449
36491
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
36450
36492
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
36493
+ if (this.top === -1) {
36494
+ this.top = this.boundaries.top;
36495
+ }
36451
36496
  if (this.bottom === -1) {
36452
36497
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
36453
36498
  }
@@ -42861,6 +42906,6 @@ exports.setTranslationMethod = setTranslationMethod;
42861
42906
  exports.tokenize = tokenize;
42862
42907
 
42863
42908
 
42864
- __info__.version = '16.0.17';
42865
- __info__.date = '2023-08-17T11:08:00.168Z';
42866
- __info__.hash = '34011c3';
42909
+ __info__.version = '16.0.18';
42910
+ __info__.date = '2023-09-12T11:42:03.083Z';
42911
+ __info__.hash = '41fd4fa';
@@ -600,6 +600,7 @@ interface LineChartDefinition {
600
600
  readonly legendPosition: LegendPosition;
601
601
  readonly labelsAsText: boolean;
602
602
  readonly stacked: boolean;
603
+ readonly cumulative: boolean;
603
604
  }
604
605
  type LineChartRuntime = {
605
606
  chartJsConfig: ChartConfiguration;
@@ -665,6 +666,7 @@ interface ExcelChartDefinition {
665
666
  readonly verticalAxisPosition: VerticalAxisPosition;
666
667
  readonly legendPosition: LegendPosition;
667
668
  readonly stacked?: boolean;
669
+ readonly cumulative?: boolean;
668
670
  }
669
671
  interface ChartCreationContext {
670
672
  readonly range?: string[];
@@ -3390,11 +3392,11 @@ declare class HeaderSizePlugin extends CorePlugin<HeaderSizeState> implements He
3390
3392
  }
3391
3393
 
3392
3394
  declare class HeaderVisibilityPlugin extends CorePlugin {
3393
- static getters: readonly ["canRemoveHeaders", "getHiddenColsGroups", "getHiddenRowsGroups", "isRowHiddenByUser", "isColHiddenByUser"];
3395
+ static getters: readonly ["checkElementsIncludeAllVisibleHeaders", "getHiddenColsGroups", "getHiddenRowsGroups", "isRowHiddenByUser", "isColHiddenByUser"];
3394
3396
  private readonly hiddenHeaders;
3395
3397
  allowDispatch(cmd: Command): CommandResult.Success | CommandResult.NotEnoughElements | CommandResult.InvalidSheetId | CommandResult.TooManyHiddenElements | CommandResult.InvalidHeaderIndex;
3396
3398
  handle(cmd: Command): void;
3397
- canRemoveHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
3399
+ checkElementsIncludeAllVisibleHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
3398
3400
  isRowHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
3399
3401
  isColHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
3400
3402
  getHiddenColsGroups(sheetId: UID): ConsecutiveIndexes[];
@@ -3489,7 +3491,7 @@ interface SheetState {
3489
3491
  readonly cellPosition: Record<UID, CellPosition | undefined>;
3490
3492
  }
3491
3493
  declare class SheetPlugin extends CorePlugin<SheetState> implements SheetState {
3492
- static getters: readonly ["getSheetName", "tryGetSheetName", "getSheet", "tryGetSheet", "getSheetIdByName", "getSheetIds", "getVisibleSheetIds", "isSheetVisible", "getEvaluationSheets", "doesHeaderExist", "getCell", "getCellsInZone", "getCellPosition", "getColCells", "getColsZone", "getRowCells", "getRowsZone", "getNumberCols", "getNumberRows", "getNumberHeaders", "getGridLinesVisibility", "getNextSheetName", "isEmpty", "getSheetSize", "getSheetZone", "getPaneDivisions"];
3494
+ static getters: readonly ["getSheetName", "tryGetSheetName", "getSheet", "tryGetSheet", "getSheetIdByName", "getSheetIds", "getVisibleSheetIds", "isSheetVisible", "getEvaluationSheets", "doesHeaderExist", "getCell", "getCellsInZone", "getCellPosition", "getColCells", "getColsZone", "getRowCells", "getRowsZone", "getNumberCols", "getNumberRows", "getNumberHeaders", "getGridLinesVisibility", "getNextSheetName", "isEmpty", "getSheetSize", "getSheetZone", "getPaneDivisions", "checkElementsIncludeAllNonFrozenHeaders"];
3493
3495
  readonly sheetIdsMapName: Record<string, UID | undefined>;
3494
3496
  readonly orderedSheetIds: UID[];
3495
3497
  readonly sheets: Record<UID, Sheet | undefined>;
@@ -3536,6 +3538,11 @@ declare class SheetPlugin extends CorePlugin<SheetState> implements SheetState {
3536
3538
  getSheetZone(sheetId: UID): Zone;
3537
3539
  getPaneDivisions(sheetId: UID): Readonly<PaneDivision>;
3538
3540
  private setPaneDivisions;
3541
+ /**
3542
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
3543
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
3544
+ */
3545
+ checkElementsIncludeAllNonFrozenHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
3539
3546
  /**
3540
3547
  * Check if a zone only contains empty cells
3541
3548
  */
@@ -5004,6 +5011,7 @@ declare class LineConfigPanel extends LineBarPieConfigPanel {
5004
5011
  get canTreatLabelsAsText(): boolean;
5005
5012
  onUpdateLabelsAsText(ev: any): void;
5006
5013
  onUpdateStacked(ev: any): void;
5014
+ onUpdateCumulative(ev: any): void;
5007
5015
  }
5008
5016
 
5009
5017
  interface Props$t {
@@ -3515,6 +3515,7 @@ css /* scss */ `
3515
3515
  background-color: white;
3516
3516
  border-left: 3px solid red;
3517
3517
  padding: 10px;
3518
+ overflow-wrap: break-word;
3518
3519
  }
3519
3520
  `;
3520
3521
  class ErrorToolTip extends Component {
@@ -5031,6 +5032,13 @@ const REMOVE_ROWS_ACTION = (env) => {
5031
5032
  elements: rows,
5032
5033
  });
5033
5034
  };
5035
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
5036
+ const sheetId = env.model.getters.getActiveSheetId();
5037
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
5038
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
5039
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
5040
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
5041
+ };
5034
5042
  const REMOVE_COLUMNS_NAME = (env) => {
5035
5043
  if (env.model.getters.getSelectedZones().length > 1) {
5036
5044
  return _lt("Delete columns");
@@ -5635,11 +5643,7 @@ colMenuRegistry
5635
5643
  name: REMOVE_COLUMNS_NAME,
5636
5644
  sequence: 90,
5637
5645
  action: REMOVE_COLUMNS_ACTION,
5638
- isVisible: (env) => {
5639
- const sheetId = env.model.getters.getActiveSheetId();
5640
- const selectedCols = env.model.getters.getElementsFromSelection("COL");
5641
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
5642
- },
5646
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
5643
5647
  })
5644
5648
  .add("clear_column", {
5645
5649
  name: DELETE_CONTENT_COLUMNS_NAME,
@@ -5653,7 +5657,7 @@ colMenuRegistry
5653
5657
  isVisible: (env) => {
5654
5658
  const sheetId = env.model.getters.getActiveSheetId();
5655
5659
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
5656
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
5660
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
5657
5661
  },
5658
5662
  separator: true,
5659
5663
  })
@@ -5727,11 +5731,7 @@ rowMenuRegistry
5727
5731
  name: REMOVE_ROWS_NAME,
5728
5732
  sequence: 70,
5729
5733
  action: REMOVE_ROWS_ACTION,
5730
- isVisible: (env) => {
5731
- const sheetId = env.model.getters.getActiveSheetId();
5732
- const selectedRows = env.model.getters.getElementsFromSelection("ROW");
5733
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
5734
- },
5734
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
5735
5735
  })
5736
5736
  .add("clear_row", {
5737
5737
  name: DELETE_CONTENT_ROWS_NAME,
@@ -5745,7 +5745,7 @@ rowMenuRegistry
5745
5745
  isVisible: (env) => {
5746
5746
  const sheetId = env.model.getters.getActiveSheetId();
5747
5747
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
5748
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
5748
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
5749
5749
  },
5750
5750
  separator: true,
5751
5751
  })
@@ -6039,11 +6039,13 @@ topbarMenuRegistry
6039
6039
  name: REMOVE_ROWS_NAME,
6040
6040
  sequence: 80,
6041
6041
  action: REMOVE_ROWS_ACTION,
6042
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
6042
6043
  })
6043
6044
  .addChild("edit_delete_column", ["edit"], {
6044
6045
  name: REMOVE_COLUMNS_NAME,
6045
6046
  sequence: 90,
6046
6047
  action: REMOVE_COLUMNS_ACTION,
6048
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
6047
6049
  })
6048
6050
  .addChild("edit_delete_cell_shift_up", ["edit"], {
6049
6051
  name: _lt("Delete cell and shift up"),
@@ -7810,6 +7812,7 @@ class LineChart extends AbstractChart {
7810
7812
  this.legendPosition = definition.legendPosition;
7811
7813
  this.labelsAsText = definition.labelsAsText;
7812
7814
  this.stacked = definition.stacked;
7815
+ this.cumulative = definition.cumulative;
7813
7816
  }
7814
7817
  static validateChartDefinition(validator, definition) {
7815
7818
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -7829,6 +7832,7 @@ class LineChart extends AbstractChart {
7829
7832
  verticalAxisPosition: "left",
7830
7833
  labelRange: context.auxiliaryRange || undefined,
7831
7834
  stacked: false,
7835
+ cumulative: false,
7832
7836
  };
7833
7837
  }
7834
7838
  getDefinition() {
@@ -7848,6 +7852,7 @@ class LineChart extends AbstractChart {
7848
7852
  title: this.title,
7849
7853
  labelsAsText: this.labelsAsText,
7850
7854
  stacked: this.stacked,
7855
+ cumulative: this.cumulative,
7851
7856
  };
7852
7857
  }
7853
7858
  getContextCreation() {
@@ -8032,6 +8037,16 @@ function createLineChartRuntime(chart, getters) {
8032
8037
  if (chart.stacked) {
8033
8038
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
8034
8039
  }
8040
+ if (chart.cumulative) {
8041
+ let accumulator = 0;
8042
+ data = data.map((value) => {
8043
+ if (!isNaN(value)) {
8044
+ accumulator += parseFloat(value);
8045
+ return accumulator;
8046
+ }
8047
+ return value;
8048
+ });
8049
+ }
8035
8050
  const backgroundColor = rgbaToHex(backgroundRGBA);
8036
8051
  const dataset = {
8037
8052
  label,
@@ -8817,6 +8832,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
8817
8832
  stacked: ev.target.checked,
8818
8833
  });
8819
8834
  }
8835
+ onUpdateCumulative(ev) {
8836
+ this.props.updateChart(this.props.figureId, {
8837
+ cumulative: ev.target.checked,
8838
+ });
8839
+ }
8820
8840
  }
8821
8841
  LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
8822
8842
 
@@ -24646,6 +24666,7 @@ function convertChartData(chartData) {
24646
24666
  verticalAxisPosition: chartData.verticalAxisPosition,
24647
24667
  legendPosition: chartData.legendPosition,
24648
24668
  stacked: chartData.stacked || false,
24669
+ cumulative: chartData.cumulative || false,
24649
24670
  labelsAsText: false,
24650
24671
  };
24651
24672
  }
@@ -29138,7 +29159,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
29138
29159
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
29139
29160
  return 27 /* CommandResult.InvalidSheetId */;
29140
29161
  }
29141
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29162
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29142
29163
  return 8 /* CommandResult.NotEnoughElements */;
29143
29164
  }
29144
29165
  return 0 /* CommandResult.Success */;
@@ -29188,9 +29209,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
29188
29209
  }
29189
29210
  return;
29190
29211
  }
29191
- canRemoveHeaders(sheetId, dimension, elements) {
29212
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
29192
29213
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
29193
- return !includesAll(elements, visibleHeaders);
29214
+ return includesAll(elements, visibleHeaders);
29194
29215
  }
29195
29216
  isRowHiddenByUser(sheetId, index) {
29196
29217
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -29286,7 +29307,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
29286
29307
  }
29287
29308
  }
29288
29309
  HeaderVisibilityPlugin.getters = [
29289
- "canRemoveHeaders",
29310
+ "checkElementsIncludeAllVisibleHeaders",
29290
29311
  "getHiddenColsGroups",
29291
29312
  "getHiddenRowsGroups",
29292
29313
  "isRowHiddenByUser",
@@ -29805,6 +29826,9 @@ class SheetPlugin extends CorePlugin {
29805
29826
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
29806
29827
  return 85 /* CommandResult.InvalidHeaderIndex */;
29807
29828
  }
29829
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29830
+ return 8 /* CommandResult.NotEnoughElements */;
29831
+ }
29808
29832
  else {
29809
29833
  return 0 /* CommandResult.Success */;
29810
29834
  }
@@ -30104,6 +30128,20 @@ class SheetPlugin extends CorePlugin {
30104
30128
  }
30105
30129
  this.history.update("sheets", sheetId, "panes", panes);
30106
30130
  }
30131
+ /**
30132
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
30133
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
30134
+ */
30135
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
30136
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
30137
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
30138
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
30139
+ if (!startIndex) {
30140
+ return false;
30141
+ }
30142
+ const indicesToCheck = range(startIndex, endIndex);
30143
+ return includesAll(elements, indicesToCheck);
30144
+ }
30107
30145
  // ---------------------------------------------------------------------------
30108
30146
  // Row/Col manipulation
30109
30147
  // ---------------------------------------------------------------------------
@@ -30638,6 +30676,7 @@ SheetPlugin.getters = [
30638
30676
  "getSheetSize",
30639
30677
  "getSheetZone",
30640
30678
  "getPaneDivisions",
30679
+ "checkElementsIncludeAllNonFrozenHeaders",
30641
30680
  ];
30642
30681
 
30643
30682
  /**
@@ -36431,6 +36470,9 @@ class InternalViewport {
36431
36470
  const sheetId = this.sheetId;
36432
36471
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
36433
36472
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
36473
+ if (this.left === -1) {
36474
+ this.left = this.boundaries.left;
36475
+ }
36434
36476
  if (this.right === -1) {
36435
36477
  this.right = this.getters.getNumberCols(sheetId) - 1;
36436
36478
  }
@@ -36444,6 +36486,9 @@ class InternalViewport {
36444
36486
  const sheetId = this.sheetId;
36445
36487
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
36446
36488
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
36489
+ if (this.top === -1) {
36490
+ this.top = this.boundaries.top;
36491
+ }
36447
36492
  if (this.bottom === -1) {
36448
36493
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
36449
36494
  }
@@ -42829,6 +42874,6 @@ function addFunction(functionName, functionDescription) {
42829
42874
  export { AbstractChart, CommandResult, CorePlugin, DATETIME_FORMAT, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, cellTypes, compile, components, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, invalidateEvaluationCommands, load, parse, readonlyAllowedCommands, registries, setTranslationMethod, tokenize };
42830
42875
 
42831
42876
 
42832
- __info__.version = '16.0.17';
42833
- __info__.date = '2023-08-17T11:08:00.168Z';
42834
- __info__.hash = '34011c3';
42877
+ __info__.version = '16.0.18';
42878
+ __info__.date = '2023-09-12T11:42:03.083Z';
42879
+ __info__.hash = '41fd4fa';