@odoo/o-spreadsheet 16.3.9 → 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 {
@@ -26408,6 +26435,7 @@ function convertChartData(chartData) {
26408
26435
  legendPosition: chartData.legendPosition,
26409
26436
  stacked: chartData.stacked || false,
26410
26437
  aggregated: false,
26438
+ cumulative: chartData.cumulative || false,
26411
26439
  labelsAsText: false,
26412
26440
  };
26413
26441
  }
@@ -31088,7 +31116,7 @@ class HeaderSizePlugin extends CorePlugin {
31088
31116
 
31089
31117
  class HeaderVisibilityPlugin extends CorePlugin {
31090
31118
  static getters = [
31091
- "canRemoveHeaders",
31119
+ "checkElementsIncludeAllVisibleHeaders",
31092
31120
  "getHiddenColsGroups",
31093
31121
  "getHiddenRowsGroups",
31094
31122
  "isRowHiddenByUser",
@@ -31122,7 +31150,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
31122
31150
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
31123
31151
  return 27 /* CommandResult.InvalidSheetId */;
31124
31152
  }
31125
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31153
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31126
31154
  return 8 /* CommandResult.NotEnoughElements */;
31127
31155
  }
31128
31156
  return 0 /* CommandResult.Success */;
@@ -31172,9 +31200,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
31172
31200
  }
31173
31201
  return;
31174
31202
  }
31175
- canRemoveHeaders(sheetId, dimension, elements) {
31203
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
31176
31204
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
31177
- return !includesAll(elements, visibleHeaders);
31205
+ return includesAll(elements, visibleHeaders);
31178
31206
  }
31179
31207
  isRowHiddenByUser(sheetId, index) {
31180
31208
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -32261,6 +32289,7 @@ class SheetPlugin extends CorePlugin {
32261
32289
  "getPaneDivisions",
32262
32290
  "checkZonesExistInSheet",
32263
32291
  "getCommandZones",
32292
+ "checkElementsIncludeAllNonFrozenHeaders",
32264
32293
  ];
32265
32294
  sheetIdsMapName = {};
32266
32295
  orderedSheetIds = [];
@@ -32317,6 +32346,9 @@ class SheetPlugin extends CorePlugin {
32317
32346
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
32318
32347
  return 86 /* CommandResult.InvalidHeaderIndex */;
32319
32348
  }
32349
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
32350
+ return 8 /* CommandResult.NotEnoughElements */;
32351
+ }
32320
32352
  else {
32321
32353
  return 0 /* CommandResult.Success */;
32322
32354
  }
@@ -32599,6 +32631,20 @@ class SheetPlugin extends CorePlugin {
32599
32631
  }
32600
32632
  this.history.update("sheets", sheetId, "panes", panes);
32601
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
+ }
32602
32648
  // ---------------------------------------------------------------------------
32603
32649
  // Row/Col manipulation
32604
32650
  // ---------------------------------------------------------------------------
@@ -34563,6 +34609,9 @@ class InternalViewport {
34563
34609
  const sheetId = this.sheetId;
34564
34610
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
34565
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
+ }
34566
34615
  if (this.right === -1) {
34567
34616
  this.right = this.getters.getNumberCols(sheetId) - 1;
34568
34617
  }
@@ -34576,6 +34625,9 @@ class InternalViewport {
34576
34625
  const sheetId = this.sheetId;
34577
34626
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
34578
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
+ }
34579
34631
  if (this.bottom === -1) {
34580
34632
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
34581
34633
  }
@@ -47655,6 +47707,6 @@ exports.setTranslationMethod = setTranslationMethod;
47655
47707
  exports.tokenize = tokenize;
47656
47708
 
47657
47709
 
47658
- __info__.version = '16.3.9';
47659
- __info__.date = '2023-08-29T13:54:26.065Z';
47660
- __info__.hash = '79cedd4';
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 {
@@ -26404,6 +26431,7 @@ function convertChartData(chartData) {
26404
26431
  legendPosition: chartData.legendPosition,
26405
26432
  stacked: chartData.stacked || false,
26406
26433
  aggregated: false,
26434
+ cumulative: chartData.cumulative || false,
26407
26435
  labelsAsText: false,
26408
26436
  };
26409
26437
  }
@@ -31084,7 +31112,7 @@ class HeaderSizePlugin extends CorePlugin {
31084
31112
 
31085
31113
  class HeaderVisibilityPlugin extends CorePlugin {
31086
31114
  static getters = [
31087
- "canRemoveHeaders",
31115
+ "checkElementsIncludeAllVisibleHeaders",
31088
31116
  "getHiddenColsGroups",
31089
31117
  "getHiddenRowsGroups",
31090
31118
  "isRowHiddenByUser",
@@ -31118,7 +31146,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
31118
31146
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
31119
31147
  return 27 /* CommandResult.InvalidSheetId */;
31120
31148
  }
31121
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31149
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31122
31150
  return 8 /* CommandResult.NotEnoughElements */;
31123
31151
  }
31124
31152
  return 0 /* CommandResult.Success */;
@@ -31168,9 +31196,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
31168
31196
  }
31169
31197
  return;
31170
31198
  }
31171
- canRemoveHeaders(sheetId, dimension, elements) {
31199
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
31172
31200
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
31173
- return !includesAll(elements, visibleHeaders);
31201
+ return includesAll(elements, visibleHeaders);
31174
31202
  }
31175
31203
  isRowHiddenByUser(sheetId, index) {
31176
31204
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -32257,6 +32285,7 @@ class SheetPlugin extends CorePlugin {
32257
32285
  "getPaneDivisions",
32258
32286
  "checkZonesExistInSheet",
32259
32287
  "getCommandZones",
32288
+ "checkElementsIncludeAllNonFrozenHeaders",
32260
32289
  ];
32261
32290
  sheetIdsMapName = {};
32262
32291
  orderedSheetIds = [];
@@ -32313,6 +32342,9 @@ class SheetPlugin extends CorePlugin {
32313
32342
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
32314
32343
  return 86 /* CommandResult.InvalidHeaderIndex */;
32315
32344
  }
32345
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
32346
+ return 8 /* CommandResult.NotEnoughElements */;
32347
+ }
32316
32348
  else {
32317
32349
  return 0 /* CommandResult.Success */;
32318
32350
  }
@@ -32595,6 +32627,20 @@ class SheetPlugin extends CorePlugin {
32595
32627
  }
32596
32628
  this.history.update("sheets", sheetId, "panes", panes);
32597
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
+ }
32598
32644
  // ---------------------------------------------------------------------------
32599
32645
  // Row/Col manipulation
32600
32646
  // ---------------------------------------------------------------------------
@@ -34559,6 +34605,9 @@ class InternalViewport {
34559
34605
  const sheetId = this.sheetId;
34560
34606
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
34561
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
+ }
34562
34611
  if (this.right === -1) {
34563
34612
  this.right = this.getters.getNumberCols(sheetId) - 1;
34564
34613
  }
@@ -34572,6 +34621,9 @@ class InternalViewport {
34572
34621
  const sheetId = this.sheetId;
34573
34622
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
34574
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
+ }
34575
34627
  if (this.bottom === -1) {
34576
34628
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
34577
34629
  }
@@ -47623,6 +47675,6 @@ function addFunction(functionName, functionDescription) {
47623
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 };
47624
47676
 
47625
47677
 
47626
- __info__.version = '16.3.9';
47627
- __info__.date = '2023-08-29T13:54:26.065Z';
47628
- __info__.hash = '79cedd4';
47678
+ __info__.version = '16.3.10';
47679
+ __info__.date = '2023-09-12T11:41:57.775Z';
47680
+ __info__.hash = '3a95562';