@odoo/o-spreadsheet 16.1.19 → 16.1.20

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.
@@ -4830,6 +4830,7 @@ class LineChart extends AbstractChart {
4830
4830
  this.labelsAsText = definition.labelsAsText;
4831
4831
  this.stacked = definition.stacked;
4832
4832
  this.aggregated = definition.aggregated;
4833
+ this.cumulative = definition.cumulative;
4833
4834
  }
4834
4835
  static validateChartDefinition(validator, definition) {
4835
4836
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -4850,6 +4851,7 @@ class LineChart extends AbstractChart {
4850
4851
  labelRange: context.auxiliaryRange || undefined,
4851
4852
  stacked: false,
4852
4853
  aggregated: false,
4854
+ cumulative: false,
4853
4855
  };
4854
4856
  }
4855
4857
  getDefinition() {
@@ -4870,6 +4872,7 @@ class LineChart extends AbstractChart {
4870
4872
  labelsAsText: this.labelsAsText,
4871
4873
  stacked: this.stacked,
4872
4874
  aggregated: this.aggregated,
4875
+ cumulative: this.cumulative,
4873
4876
  };
4874
4877
  }
4875
4878
  getContextCreation() {
@@ -5063,6 +5066,16 @@ function createLineChartRuntime(chart, getters) {
5063
5066
  if (chart.stacked) {
5064
5067
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
5065
5068
  }
5069
+ if (chart.cumulative) {
5070
+ let accumulator = 0;
5071
+ data = data.map((value) => {
5072
+ if (!isNaN(value)) {
5073
+ accumulator += parseFloat(value);
5074
+ return accumulator;
5075
+ }
5076
+ return value;
5077
+ });
5078
+ }
5066
5079
  const backgroundColor = rgbaToHex(backgroundRGBA);
5067
5080
  const dataset = {
5068
5081
  label,
@@ -6404,6 +6417,7 @@ function getSmartChartDefinition(zone, getters) {
6404
6417
  labelsAsText: false,
6405
6418
  stacked: false,
6406
6419
  aggregated: false,
6420
+ cumulative: false,
6407
6421
  labelRange: labelRangeXc,
6408
6422
  type: "line",
6409
6423
  dataSetsHaveTitle,
@@ -6757,6 +6771,13 @@ const REMOVE_ROWS_ACTION = (env) => {
6757
6771
  elements: rows,
6758
6772
  });
6759
6773
  };
6774
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
6775
+ const sheetId = env.model.getters.getActiveSheetId();
6776
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
6777
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
6778
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
6779
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
6780
+ };
6760
6781
  const REMOVE_COLUMNS_NAME = (env) => {
6761
6782
  if (env.model.getters.getSelectedZones().length > 1) {
6762
6783
  return _lt("Delete columns");
@@ -7347,11 +7368,7 @@ colMenuRegistry
7347
7368
  name: REMOVE_COLUMNS_NAME,
7348
7369
  sequence: 90,
7349
7370
  action: REMOVE_COLUMNS_ACTION,
7350
- isVisible: (env) => {
7351
- const sheetId = env.model.getters.getActiveSheetId();
7352
- const selectedCols = env.model.getters.getElementsFromSelection("COL");
7353
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
7354
- },
7371
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
7355
7372
  })
7356
7373
  .add("clear_column", {
7357
7374
  name: DELETE_CONTENT_COLUMNS_NAME,
@@ -7365,7 +7382,7 @@ colMenuRegistry
7365
7382
  isVisible: (env) => {
7366
7383
  const sheetId = env.model.getters.getActiveSheetId();
7367
7384
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
7368
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
7385
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
7369
7386
  },
7370
7387
  separator: true,
7371
7388
  })
@@ -7439,11 +7456,7 @@ rowMenuRegistry
7439
7456
  name: REMOVE_ROWS_NAME,
7440
7457
  sequence: 70,
7441
7458
  action: REMOVE_ROWS_ACTION,
7442
- isVisible: (env) => {
7443
- const sheetId = env.model.getters.getActiveSheetId();
7444
- const selectedRows = env.model.getters.getElementsFromSelection("ROW");
7445
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
7446
- },
7459
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
7447
7460
  })
7448
7461
  .add("clear_row", {
7449
7462
  name: DELETE_CONTENT_ROWS_NAME,
@@ -7457,7 +7470,7 @@ rowMenuRegistry
7457
7470
  isVisible: (env) => {
7458
7471
  const sheetId = env.model.getters.getActiveSheetId();
7459
7472
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
7460
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
7473
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
7461
7474
  },
7462
7475
  separator: true,
7463
7476
  })
@@ -19334,11 +19347,13 @@ topbarMenuRegistry
19334
19347
  name: REMOVE_ROWS_NAME,
19335
19348
  sequence: 80,
19336
19349
  action: REMOVE_ROWS_ACTION,
19350
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
19337
19351
  })
19338
19352
  .addChild("edit_delete_column", ["edit"], {
19339
19353
  name: REMOVE_COLUMNS_NAME,
19340
19354
  sequence: 90,
19341
19355
  action: REMOVE_COLUMNS_ACTION,
19356
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
19342
19357
  })
19343
19358
  .addChild("edit_delete_cell_shift_up", ["edit"], {
19344
19359
  name: _lt("Delete cell and shift up"),
@@ -20518,6 +20533,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
20518
20533
  aggregated: ev.target.checked,
20519
20534
  });
20520
20535
  }
20536
+ onUpdateCumulative(ev) {
20537
+ this.props.updateChart(this.props.figureId, {
20538
+ cumulative: ev.target.checked,
20539
+ });
20540
+ }
20521
20541
  }
20522
20542
  LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
20523
20543
 
@@ -25488,6 +25508,7 @@ function convertChartData(chartData) {
25488
25508
  legendPosition: chartData.legendPosition,
25489
25509
  stacked: chartData.stacked || false,
25490
25510
  aggregated: false,
25511
+ cumulative: chartData.cumulative || false,
25491
25512
  labelsAsText: false,
25492
25513
  };
25493
25514
  }
@@ -30052,7 +30073,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
30052
30073
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
30053
30074
  return 27 /* CommandResult.InvalidSheetId */;
30054
30075
  }
30055
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
30076
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
30056
30077
  return 8 /* CommandResult.NotEnoughElements */;
30057
30078
  }
30058
30079
  return 0 /* CommandResult.Success */;
@@ -30102,9 +30123,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
30102
30123
  }
30103
30124
  return;
30104
30125
  }
30105
- canRemoveHeaders(sheetId, dimension, elements) {
30126
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
30106
30127
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
30107
- return !includesAll(elements, visibleHeaders);
30128
+ return includesAll(elements, visibleHeaders);
30108
30129
  }
30109
30130
  isRowHiddenByUser(sheetId, index) {
30110
30131
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -30200,7 +30221,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
30200
30221
  }
30201
30222
  }
30202
30223
  HeaderVisibilityPlugin.getters = [
30203
- "canRemoveHeaders",
30224
+ "checkElementsIncludeAllVisibleHeaders",
30204
30225
  "getHiddenColsGroups",
30205
30226
  "getHiddenRowsGroups",
30206
30227
  "isRowHiddenByUser",
@@ -31228,6 +31249,9 @@ class SheetPlugin extends CorePlugin {
31228
31249
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
31229
31250
  return 86 /* CommandResult.InvalidHeaderIndex */;
31230
31251
  }
31252
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31253
+ return 8 /* CommandResult.NotEnoughElements */;
31254
+ }
31231
31255
  else {
31232
31256
  return 0 /* CommandResult.Success */;
31233
31257
  }
@@ -31514,6 +31538,20 @@ class SheetPlugin extends CorePlugin {
31514
31538
  }
31515
31539
  this.history.update("sheets", sheetId, "panes", panes);
31516
31540
  }
31541
+ /**
31542
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
31543
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
31544
+ */
31545
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
31546
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
31547
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
31548
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
31549
+ if (!startIndex) {
31550
+ return false;
31551
+ }
31552
+ const indicesToCheck = range(startIndex, endIndex);
31553
+ return includesAll(elements, indicesToCheck);
31554
+ }
31517
31555
  // ---------------------------------------------------------------------------
31518
31556
  // Row/Col manipulation
31519
31557
  // ---------------------------------------------------------------------------
@@ -32046,6 +32084,7 @@ SheetPlugin.getters = [
32046
32084
  "getSheetSize",
32047
32085
  "getSheetZone",
32048
32086
  "getPaneDivisions",
32087
+ "checkElementsIncludeAllNonFrozenHeaders",
32049
32088
  ];
32050
32089
 
32051
32090
  /**
@@ -33464,6 +33503,9 @@ class InternalViewport {
33464
33503
  const sheetId = this.sheetId;
33465
33504
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
33466
33505
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
33506
+ if (this.left === -1) {
33507
+ this.left = this.boundaries.left;
33508
+ }
33467
33509
  if (this.right === -1) {
33468
33510
  this.right = this.getters.getNumberCols(sheetId) - 1;
33469
33511
  }
@@ -33477,6 +33519,9 @@ class InternalViewport {
33477
33519
  const sheetId = this.sheetId;
33478
33520
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
33479
33521
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
33522
+ if (this.top === -1) {
33523
+ this.top = this.boundaries.top;
33524
+ }
33480
33525
  if (this.bottom === -1) {
33481
33526
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
33482
33527
  }
@@ -44305,6 +44350,6 @@ exports.setTranslationMethod = setTranslationMethod;
44305
44350
  exports.tokenize = tokenize;
44306
44351
 
44307
44352
 
44308
- __info__.version = '16.1.19';
44309
- __info__.date = '2023-08-29T13:54:21.626Z';
44310
- __info__.hash = '053a843';
44353
+ __info__.version = '16.1.20';
44354
+ __info__.date = '2023-09-12T11:43:40.624Z';
44355
+ __info__.hash = '7d7b841';
@@ -581,6 +581,7 @@ interface LineChartDefinition {
581
581
  readonly labelsAsText: boolean;
582
582
  readonly stacked: boolean;
583
583
  readonly aggregated?: boolean;
584
+ readonly cumulative: boolean;
584
585
  }
585
586
  type LineChartRuntime = {
586
587
  chartJsConfig: ChartConfiguration;
@@ -647,6 +648,7 @@ interface ExcelChartDefinition {
647
648
  readonly verticalAxisPosition: VerticalAxisPosition;
648
649
  readonly legendPosition: LegendPosition;
649
650
  readonly stacked?: boolean;
651
+ readonly cumulative?: boolean;
650
652
  }
651
653
  interface ChartCreationContext {
652
654
  readonly range?: string[];
@@ -3498,11 +3500,11 @@ declare class HeaderSizePlugin extends CorePlugin<HeaderSizeState> implements He
3498
3500
  }
3499
3501
 
3500
3502
  declare class HeaderVisibilityPlugin extends CorePlugin {
3501
- static getters: readonly ["canRemoveHeaders", "getHiddenColsGroups", "getHiddenRowsGroups", "isRowHiddenByUser", "isColHiddenByUser"];
3503
+ static getters: readonly ["checkElementsIncludeAllVisibleHeaders", "getHiddenColsGroups", "getHiddenRowsGroups", "isRowHiddenByUser", "isColHiddenByUser"];
3502
3504
  private readonly hiddenHeaders;
3503
3505
  allowDispatch(cmd: Command): CommandResult.Success | CommandResult.NotEnoughElements | CommandResult.InvalidSheetId | CommandResult.TooManyHiddenElements | CommandResult.InvalidHeaderIndex;
3504
3506
  handle(cmd: Command): void;
3505
- canRemoveHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
3507
+ checkElementsIncludeAllVisibleHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
3506
3508
  isRowHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
3507
3509
  isColHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
3508
3510
  getHiddenColsGroups(sheetId: UID): ConsecutiveIndexes[];
@@ -3624,7 +3626,7 @@ interface SheetState {
3624
3626
  readonly cellPosition: Record<UID, CellPosition | undefined>;
3625
3627
  }
3626
3628
  declare class SheetPlugin extends CorePlugin<SheetState> implements SheetState {
3627
- 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"];
3629
+ 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", "checkElementsIncludeAllNonFrozenHeaders"];
3628
3630
  readonly sheetIdsMapName: Record<string, UID | undefined>;
3629
3631
  readonly orderedSheetIds: UID[];
3630
3632
  readonly sheets: Record<UID, Sheet | undefined>;
@@ -3666,6 +3668,11 @@ declare class SheetPlugin extends CorePlugin<SheetState> implements SheetState {
3666
3668
  getSheetZone(sheetId: UID): Zone;
3667
3669
  getPaneDivisions(sheetId: UID): Readonly<PaneDivision>;
3668
3670
  private setPaneDivisions;
3671
+ /**
3672
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
3673
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
3674
+ */
3675
+ checkElementsIncludeAllNonFrozenHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
3669
3676
  /**
3670
3677
  * Check if a zone only contains empty cells
3671
3678
  */
@@ -5163,6 +5170,7 @@ declare class LineConfigPanel extends LineBarPieConfigPanel {
5163
5170
  onUpdateLabelsAsText(ev: any): void;
5164
5171
  onUpdateStacked(ev: any): void;
5165
5172
  onUpdateAggregated(ev: any): void;
5173
+ onUpdateCumulative(ev: any): void;
5166
5174
  }
5167
5175
 
5168
5176
  interface Props$s {
@@ -4826,6 +4826,7 @@ class LineChart extends AbstractChart {
4826
4826
  this.labelsAsText = definition.labelsAsText;
4827
4827
  this.stacked = definition.stacked;
4828
4828
  this.aggregated = definition.aggregated;
4829
+ this.cumulative = definition.cumulative;
4829
4830
  }
4830
4831
  static validateChartDefinition(validator, definition) {
4831
4832
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -4846,6 +4847,7 @@ class LineChart extends AbstractChart {
4846
4847
  labelRange: context.auxiliaryRange || undefined,
4847
4848
  stacked: false,
4848
4849
  aggregated: false,
4850
+ cumulative: false,
4849
4851
  };
4850
4852
  }
4851
4853
  getDefinition() {
@@ -4866,6 +4868,7 @@ class LineChart extends AbstractChart {
4866
4868
  labelsAsText: this.labelsAsText,
4867
4869
  stacked: this.stacked,
4868
4870
  aggregated: this.aggregated,
4871
+ cumulative: this.cumulative,
4869
4872
  };
4870
4873
  }
4871
4874
  getContextCreation() {
@@ -5059,6 +5062,16 @@ function createLineChartRuntime(chart, getters) {
5059
5062
  if (chart.stacked) {
5060
5063
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
5061
5064
  }
5065
+ if (chart.cumulative) {
5066
+ let accumulator = 0;
5067
+ data = data.map((value) => {
5068
+ if (!isNaN(value)) {
5069
+ accumulator += parseFloat(value);
5070
+ return accumulator;
5071
+ }
5072
+ return value;
5073
+ });
5074
+ }
5062
5075
  const backgroundColor = rgbaToHex(backgroundRGBA);
5063
5076
  const dataset = {
5064
5077
  label,
@@ -6400,6 +6413,7 @@ function getSmartChartDefinition(zone, getters) {
6400
6413
  labelsAsText: false,
6401
6414
  stacked: false,
6402
6415
  aggregated: false,
6416
+ cumulative: false,
6403
6417
  labelRange: labelRangeXc,
6404
6418
  type: "line",
6405
6419
  dataSetsHaveTitle,
@@ -6753,6 +6767,13 @@ const REMOVE_ROWS_ACTION = (env) => {
6753
6767
  elements: rows,
6754
6768
  });
6755
6769
  };
6770
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
6771
+ const sheetId = env.model.getters.getActiveSheetId();
6772
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
6773
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
6774
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
6775
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
6776
+ };
6756
6777
  const REMOVE_COLUMNS_NAME = (env) => {
6757
6778
  if (env.model.getters.getSelectedZones().length > 1) {
6758
6779
  return _lt("Delete columns");
@@ -7343,11 +7364,7 @@ colMenuRegistry
7343
7364
  name: REMOVE_COLUMNS_NAME,
7344
7365
  sequence: 90,
7345
7366
  action: REMOVE_COLUMNS_ACTION,
7346
- isVisible: (env) => {
7347
- const sheetId = env.model.getters.getActiveSheetId();
7348
- const selectedCols = env.model.getters.getElementsFromSelection("COL");
7349
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
7350
- },
7367
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
7351
7368
  })
7352
7369
  .add("clear_column", {
7353
7370
  name: DELETE_CONTENT_COLUMNS_NAME,
@@ -7361,7 +7378,7 @@ colMenuRegistry
7361
7378
  isVisible: (env) => {
7362
7379
  const sheetId = env.model.getters.getActiveSheetId();
7363
7380
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
7364
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
7381
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
7365
7382
  },
7366
7383
  separator: true,
7367
7384
  })
@@ -7435,11 +7452,7 @@ rowMenuRegistry
7435
7452
  name: REMOVE_ROWS_NAME,
7436
7453
  sequence: 70,
7437
7454
  action: REMOVE_ROWS_ACTION,
7438
- isVisible: (env) => {
7439
- const sheetId = env.model.getters.getActiveSheetId();
7440
- const selectedRows = env.model.getters.getElementsFromSelection("ROW");
7441
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
7442
- },
7455
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
7443
7456
  })
7444
7457
  .add("clear_row", {
7445
7458
  name: DELETE_CONTENT_ROWS_NAME,
@@ -7453,7 +7466,7 @@ rowMenuRegistry
7453
7466
  isVisible: (env) => {
7454
7467
  const sheetId = env.model.getters.getActiveSheetId();
7455
7468
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
7456
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
7469
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
7457
7470
  },
7458
7471
  separator: true,
7459
7472
  })
@@ -19330,11 +19343,13 @@ topbarMenuRegistry
19330
19343
  name: REMOVE_ROWS_NAME,
19331
19344
  sequence: 80,
19332
19345
  action: REMOVE_ROWS_ACTION,
19346
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
19333
19347
  })
19334
19348
  .addChild("edit_delete_column", ["edit"], {
19335
19349
  name: REMOVE_COLUMNS_NAME,
19336
19350
  sequence: 90,
19337
19351
  action: REMOVE_COLUMNS_ACTION,
19352
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
19338
19353
  })
19339
19354
  .addChild("edit_delete_cell_shift_up", ["edit"], {
19340
19355
  name: _lt("Delete cell and shift up"),
@@ -20514,6 +20529,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
20514
20529
  aggregated: ev.target.checked,
20515
20530
  });
20516
20531
  }
20532
+ onUpdateCumulative(ev) {
20533
+ this.props.updateChart(this.props.figureId, {
20534
+ cumulative: ev.target.checked,
20535
+ });
20536
+ }
20517
20537
  }
20518
20538
  LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
20519
20539
 
@@ -25484,6 +25504,7 @@ function convertChartData(chartData) {
25484
25504
  legendPosition: chartData.legendPosition,
25485
25505
  stacked: chartData.stacked || false,
25486
25506
  aggregated: false,
25507
+ cumulative: chartData.cumulative || false,
25487
25508
  labelsAsText: false,
25488
25509
  };
25489
25510
  }
@@ -30048,7 +30069,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
30048
30069
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
30049
30070
  return 27 /* CommandResult.InvalidSheetId */;
30050
30071
  }
30051
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
30072
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
30052
30073
  return 8 /* CommandResult.NotEnoughElements */;
30053
30074
  }
30054
30075
  return 0 /* CommandResult.Success */;
@@ -30098,9 +30119,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
30098
30119
  }
30099
30120
  return;
30100
30121
  }
30101
- canRemoveHeaders(sheetId, dimension, elements) {
30122
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
30102
30123
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
30103
- return !includesAll(elements, visibleHeaders);
30124
+ return includesAll(elements, visibleHeaders);
30104
30125
  }
30105
30126
  isRowHiddenByUser(sheetId, index) {
30106
30127
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -30196,7 +30217,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
30196
30217
  }
30197
30218
  }
30198
30219
  HeaderVisibilityPlugin.getters = [
30199
- "canRemoveHeaders",
30220
+ "checkElementsIncludeAllVisibleHeaders",
30200
30221
  "getHiddenColsGroups",
30201
30222
  "getHiddenRowsGroups",
30202
30223
  "isRowHiddenByUser",
@@ -31224,6 +31245,9 @@ class SheetPlugin extends CorePlugin {
31224
31245
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
31225
31246
  return 86 /* CommandResult.InvalidHeaderIndex */;
31226
31247
  }
31248
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31249
+ return 8 /* CommandResult.NotEnoughElements */;
31250
+ }
31227
31251
  else {
31228
31252
  return 0 /* CommandResult.Success */;
31229
31253
  }
@@ -31510,6 +31534,20 @@ class SheetPlugin extends CorePlugin {
31510
31534
  }
31511
31535
  this.history.update("sheets", sheetId, "panes", panes);
31512
31536
  }
31537
+ /**
31538
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
31539
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
31540
+ */
31541
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
31542
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
31543
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
31544
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
31545
+ if (!startIndex) {
31546
+ return false;
31547
+ }
31548
+ const indicesToCheck = range(startIndex, endIndex);
31549
+ return includesAll(elements, indicesToCheck);
31550
+ }
31513
31551
  // ---------------------------------------------------------------------------
31514
31552
  // Row/Col manipulation
31515
31553
  // ---------------------------------------------------------------------------
@@ -32042,6 +32080,7 @@ SheetPlugin.getters = [
32042
32080
  "getSheetSize",
32043
32081
  "getSheetZone",
32044
32082
  "getPaneDivisions",
32083
+ "checkElementsIncludeAllNonFrozenHeaders",
32045
32084
  ];
32046
32085
 
32047
32086
  /**
@@ -33460,6 +33499,9 @@ class InternalViewport {
33460
33499
  const sheetId = this.sheetId;
33461
33500
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
33462
33501
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
33502
+ if (this.left === -1) {
33503
+ this.left = this.boundaries.left;
33504
+ }
33463
33505
  if (this.right === -1) {
33464
33506
  this.right = this.getters.getNumberCols(sheetId) - 1;
33465
33507
  }
@@ -33473,6 +33515,9 @@ class InternalViewport {
33473
33515
  const sheetId = this.sheetId;
33474
33516
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
33475
33517
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
33518
+ if (this.top === -1) {
33519
+ this.top = this.boundaries.top;
33520
+ }
33476
33521
  if (this.bottom === -1) {
33477
33522
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
33478
33523
  }
@@ -44273,6 +44318,6 @@ function addFunction(functionName, functionDescription) {
44273
44318
  export { AbstractChart, CommandResult, CorePlugin, DATETIME_FORMAT, 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, setTranslationMethod, tokenize };
44274
44319
 
44275
44320
 
44276
- __info__.version = '16.1.19';
44277
- __info__.date = '2023-08-29T13:54:21.626Z';
44278
- __info__.hash = '053a843';
44321
+ __info__.version = '16.1.20';
44322
+ __info__.date = '2023-09-12T11:43:40.624Z';
44323
+ __info__.hash = '7d7b841';