@odoo/o-spreadsheet 16.1.18 → 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
  })
@@ -7481,34 +7494,25 @@ rowMenuRegistry
7481
7494
  });
7482
7495
 
7483
7496
  function startDnd(onMouseMove, onMouseUp, onMouseDown = () => { }) {
7484
- const _onMouseDown = (ev) => {
7485
- ev.preventDefault();
7486
- onMouseDown(ev);
7487
- };
7488
- const _onMouseMove = (ev) => {
7489
- ev.preventDefault();
7490
- onMouseMove(ev);
7491
- };
7492
7497
  const _onMouseUp = (ev) => {
7493
- ev.preventDefault();
7494
7498
  onMouseUp(ev);
7495
- window.removeEventListener("mousedown", _onMouseDown);
7499
+ window.removeEventListener("mousedown", onMouseDown);
7496
7500
  window.removeEventListener("mouseup", _onMouseUp);
7497
7501
  window.removeEventListener("dragstart", _onDragStart);
7498
- window.removeEventListener("mousemove", _onMouseMove);
7499
- window.removeEventListener("wheel", _onMouseMove);
7502
+ window.removeEventListener("mousemove", onMouseMove);
7503
+ window.removeEventListener("wheel", onMouseMove);
7500
7504
  };
7501
7505
  function _onDragStart(ev) {
7502
7506
  ev.preventDefault();
7503
7507
  }
7504
- window.addEventListener("mousedown", _onMouseDown);
7508
+ window.addEventListener("mousedown", onMouseDown);
7505
7509
  window.addEventListener("mouseup", _onMouseUp);
7506
7510
  window.addEventListener("dragstart", _onDragStart);
7507
- window.addEventListener("mousemove", _onMouseMove);
7511
+ window.addEventListener("mousemove", onMouseMove);
7508
7512
  // mouse wheel on window is by default a passive event.
7509
7513
  // preventDefault() is not allowed in passive event handler.
7510
7514
  // https://chromestatus.com/feature/6662647093133312
7511
- window.addEventListener("wheel", _onMouseMove, { passive: false });
7515
+ window.addEventListener("wheel", onMouseMove, { passive: false });
7512
7516
  }
7513
7517
  /**
7514
7518
  * Function to be used during a mousedown event, this function allows to
@@ -19343,11 +19347,13 @@ topbarMenuRegistry
19343
19347
  name: REMOVE_ROWS_NAME,
19344
19348
  sequence: 80,
19345
19349
  action: REMOVE_ROWS_ACTION,
19350
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
19346
19351
  })
19347
19352
  .addChild("edit_delete_column", ["edit"], {
19348
19353
  name: REMOVE_COLUMNS_NAME,
19349
19354
  sequence: 90,
19350
19355
  action: REMOVE_COLUMNS_ACTION,
19356
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
19351
19357
  })
19352
19358
  .addChild("edit_delete_cell_shift_up", ["edit"], {
19353
19359
  name: _lt("Delete cell and shift up"),
@@ -20527,6 +20533,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
20527
20533
  aggregated: ev.target.checked,
20528
20534
  });
20529
20535
  }
20536
+ onUpdateCumulative(ev) {
20537
+ this.props.updateChart(this.props.figureId, {
20538
+ cumulative: ev.target.checked,
20539
+ });
20540
+ }
20530
20541
  }
20531
20542
  LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
20532
20543
 
@@ -23858,7 +23869,8 @@ class Grid extends owl.Component {
23858
23869
  }
23859
23870
  let prevCol = col;
23860
23871
  let prevRow = row;
23861
- const onMouseMove = (col, row) => {
23872
+ const onMouseMove = (col, row, ev) => {
23873
+ ev.preventDefault();
23862
23874
  if ((col !== prevCol && col != -1) || (row !== prevRow && row != -1)) {
23863
23875
  prevCol = col === -1 ? prevCol : col;
23864
23876
  prevRow = row === -1 ? prevRow : row;
@@ -25496,6 +25508,7 @@ function convertChartData(chartData) {
25496
25508
  legendPosition: chartData.legendPosition,
25497
25509
  stacked: chartData.stacked || false,
25498
25510
  aggregated: false,
25511
+ cumulative: chartData.cumulative || false,
25499
25512
  labelsAsText: false,
25500
25513
  };
25501
25514
  }
@@ -30060,7 +30073,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
30060
30073
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
30061
30074
  return 27 /* CommandResult.InvalidSheetId */;
30062
30075
  }
30063
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
30076
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
30064
30077
  return 8 /* CommandResult.NotEnoughElements */;
30065
30078
  }
30066
30079
  return 0 /* CommandResult.Success */;
@@ -30110,9 +30123,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
30110
30123
  }
30111
30124
  return;
30112
30125
  }
30113
- canRemoveHeaders(sheetId, dimension, elements) {
30126
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
30114
30127
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
30115
- return !includesAll(elements, visibleHeaders);
30128
+ return includesAll(elements, visibleHeaders);
30116
30129
  }
30117
30130
  isRowHiddenByUser(sheetId, index) {
30118
30131
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -30208,7 +30221,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
30208
30221
  }
30209
30222
  }
30210
30223
  HeaderVisibilityPlugin.getters = [
30211
- "canRemoveHeaders",
30224
+ "checkElementsIncludeAllVisibleHeaders",
30212
30225
  "getHiddenColsGroups",
30213
30226
  "getHiddenRowsGroups",
30214
30227
  "isRowHiddenByUser",
@@ -31236,6 +31249,9 @@ class SheetPlugin extends CorePlugin {
31236
31249
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
31237
31250
  return 86 /* CommandResult.InvalidHeaderIndex */;
31238
31251
  }
31252
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31253
+ return 8 /* CommandResult.NotEnoughElements */;
31254
+ }
31239
31255
  else {
31240
31256
  return 0 /* CommandResult.Success */;
31241
31257
  }
@@ -31522,6 +31538,20 @@ class SheetPlugin extends CorePlugin {
31522
31538
  }
31523
31539
  this.history.update("sheets", sheetId, "panes", panes);
31524
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
+ }
31525
31555
  // ---------------------------------------------------------------------------
31526
31556
  // Row/Col manipulation
31527
31557
  // ---------------------------------------------------------------------------
@@ -32054,6 +32084,7 @@ SheetPlugin.getters = [
32054
32084
  "getSheetSize",
32055
32085
  "getSheetZone",
32056
32086
  "getPaneDivisions",
32087
+ "checkElementsIncludeAllNonFrozenHeaders",
32057
32088
  ];
32058
32089
 
32059
32090
  /**
@@ -33472,6 +33503,9 @@ class InternalViewport {
33472
33503
  const sheetId = this.sheetId;
33473
33504
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
33474
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
+ }
33475
33509
  if (this.right === -1) {
33476
33510
  this.right = this.getters.getNumberCols(sheetId) - 1;
33477
33511
  }
@@ -33485,6 +33519,9 @@ class InternalViewport {
33485
33519
  const sheetId = this.sheetId;
33486
33520
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
33487
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
+ }
33488
33525
  if (this.bottom === -1) {
33489
33526
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
33490
33527
  }
@@ -44313,6 +44350,6 @@ exports.setTranslationMethod = setTranslationMethod;
44313
44350
  exports.tokenize = tokenize;
44314
44351
 
44315
44352
 
44316
- __info__.version = '16.1.18';
44317
- __info__.date = '2023-08-09T09:09:27.826Z';
44318
- __info__.hash = '2e594e3';
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
  })
@@ -7477,34 +7490,25 @@ rowMenuRegistry
7477
7490
  });
7478
7491
 
7479
7492
  function startDnd(onMouseMove, onMouseUp, onMouseDown = () => { }) {
7480
- const _onMouseDown = (ev) => {
7481
- ev.preventDefault();
7482
- onMouseDown(ev);
7483
- };
7484
- const _onMouseMove = (ev) => {
7485
- ev.preventDefault();
7486
- onMouseMove(ev);
7487
- };
7488
7493
  const _onMouseUp = (ev) => {
7489
- ev.preventDefault();
7490
7494
  onMouseUp(ev);
7491
- window.removeEventListener("mousedown", _onMouseDown);
7495
+ window.removeEventListener("mousedown", onMouseDown);
7492
7496
  window.removeEventListener("mouseup", _onMouseUp);
7493
7497
  window.removeEventListener("dragstart", _onDragStart);
7494
- window.removeEventListener("mousemove", _onMouseMove);
7495
- window.removeEventListener("wheel", _onMouseMove);
7498
+ window.removeEventListener("mousemove", onMouseMove);
7499
+ window.removeEventListener("wheel", onMouseMove);
7496
7500
  };
7497
7501
  function _onDragStart(ev) {
7498
7502
  ev.preventDefault();
7499
7503
  }
7500
- window.addEventListener("mousedown", _onMouseDown);
7504
+ window.addEventListener("mousedown", onMouseDown);
7501
7505
  window.addEventListener("mouseup", _onMouseUp);
7502
7506
  window.addEventListener("dragstart", _onDragStart);
7503
- window.addEventListener("mousemove", _onMouseMove);
7507
+ window.addEventListener("mousemove", onMouseMove);
7504
7508
  // mouse wheel on window is by default a passive event.
7505
7509
  // preventDefault() is not allowed in passive event handler.
7506
7510
  // https://chromestatus.com/feature/6662647093133312
7507
- window.addEventListener("wheel", _onMouseMove, { passive: false });
7511
+ window.addEventListener("wheel", onMouseMove, { passive: false });
7508
7512
  }
7509
7513
  /**
7510
7514
  * Function to be used during a mousedown event, this function allows to
@@ -19339,11 +19343,13 @@ topbarMenuRegistry
19339
19343
  name: REMOVE_ROWS_NAME,
19340
19344
  sequence: 80,
19341
19345
  action: REMOVE_ROWS_ACTION,
19346
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
19342
19347
  })
19343
19348
  .addChild("edit_delete_column", ["edit"], {
19344
19349
  name: REMOVE_COLUMNS_NAME,
19345
19350
  sequence: 90,
19346
19351
  action: REMOVE_COLUMNS_ACTION,
19352
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
19347
19353
  })
19348
19354
  .addChild("edit_delete_cell_shift_up", ["edit"], {
19349
19355
  name: _lt("Delete cell and shift up"),
@@ -20523,6 +20529,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
20523
20529
  aggregated: ev.target.checked,
20524
20530
  });
20525
20531
  }
20532
+ onUpdateCumulative(ev) {
20533
+ this.props.updateChart(this.props.figureId, {
20534
+ cumulative: ev.target.checked,
20535
+ });
20536
+ }
20526
20537
  }
20527
20538
  LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
20528
20539
 
@@ -23854,7 +23865,8 @@ class Grid extends Component {
23854
23865
  }
23855
23866
  let prevCol = col;
23856
23867
  let prevRow = row;
23857
- const onMouseMove = (col, row) => {
23868
+ const onMouseMove = (col, row, ev) => {
23869
+ ev.preventDefault();
23858
23870
  if ((col !== prevCol && col != -1) || (row !== prevRow && row != -1)) {
23859
23871
  prevCol = col === -1 ? prevCol : col;
23860
23872
  prevRow = row === -1 ? prevRow : row;
@@ -25492,6 +25504,7 @@ function convertChartData(chartData) {
25492
25504
  legendPosition: chartData.legendPosition,
25493
25505
  stacked: chartData.stacked || false,
25494
25506
  aggregated: false,
25507
+ cumulative: chartData.cumulative || false,
25495
25508
  labelsAsText: false,
25496
25509
  };
25497
25510
  }
@@ -30056,7 +30069,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
30056
30069
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
30057
30070
  return 27 /* CommandResult.InvalidSheetId */;
30058
30071
  }
30059
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
30072
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
30060
30073
  return 8 /* CommandResult.NotEnoughElements */;
30061
30074
  }
30062
30075
  return 0 /* CommandResult.Success */;
@@ -30106,9 +30119,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
30106
30119
  }
30107
30120
  return;
30108
30121
  }
30109
- canRemoveHeaders(sheetId, dimension, elements) {
30122
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
30110
30123
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
30111
- return !includesAll(elements, visibleHeaders);
30124
+ return includesAll(elements, visibleHeaders);
30112
30125
  }
30113
30126
  isRowHiddenByUser(sheetId, index) {
30114
30127
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -30204,7 +30217,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
30204
30217
  }
30205
30218
  }
30206
30219
  HeaderVisibilityPlugin.getters = [
30207
- "canRemoveHeaders",
30220
+ "checkElementsIncludeAllVisibleHeaders",
30208
30221
  "getHiddenColsGroups",
30209
30222
  "getHiddenRowsGroups",
30210
30223
  "isRowHiddenByUser",
@@ -31232,6 +31245,9 @@ class SheetPlugin extends CorePlugin {
31232
31245
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
31233
31246
  return 86 /* CommandResult.InvalidHeaderIndex */;
31234
31247
  }
31248
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31249
+ return 8 /* CommandResult.NotEnoughElements */;
31250
+ }
31235
31251
  else {
31236
31252
  return 0 /* CommandResult.Success */;
31237
31253
  }
@@ -31518,6 +31534,20 @@ class SheetPlugin extends CorePlugin {
31518
31534
  }
31519
31535
  this.history.update("sheets", sheetId, "panes", panes);
31520
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
+ }
31521
31551
  // ---------------------------------------------------------------------------
31522
31552
  // Row/Col manipulation
31523
31553
  // ---------------------------------------------------------------------------
@@ -32050,6 +32080,7 @@ SheetPlugin.getters = [
32050
32080
  "getSheetSize",
32051
32081
  "getSheetZone",
32052
32082
  "getPaneDivisions",
32083
+ "checkElementsIncludeAllNonFrozenHeaders",
32053
32084
  ];
32054
32085
 
32055
32086
  /**
@@ -33468,6 +33499,9 @@ class InternalViewport {
33468
33499
  const sheetId = this.sheetId;
33469
33500
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
33470
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
+ }
33471
33505
  if (this.right === -1) {
33472
33506
  this.right = this.getters.getNumberCols(sheetId) - 1;
33473
33507
  }
@@ -33481,6 +33515,9 @@ class InternalViewport {
33481
33515
  const sheetId = this.sheetId;
33482
33516
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
33483
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
+ }
33484
33521
  if (this.bottom === -1) {
33485
33522
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
33486
33523
  }
@@ -44281,6 +44318,6 @@ function addFunction(functionName, functionDescription) {
44281
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 };
44282
44319
 
44283
44320
 
44284
- __info__.version = '16.1.18';
44285
- __info__.date = '2023-08-09T09:09:27.826Z';
44286
- __info__.hash = '2e594e3';
44321
+ __info__.version = '16.1.20';
44322
+ __info__.date = '2023-09-12T11:43:40.624Z';
44323
+ __info__.hash = '7d7b841';