@odoo/o-spreadsheet 16.4.4 → 16.4.6

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.
@@ -6065,7 +6065,7 @@ class Menu extends owl.Component {
6065
6065
  };
6066
6066
  }
6067
6067
  get childrenHaveIcon() {
6068
- return this.props.menuItems.some((menuItem) => !!menuItem.icon || !!menuItem.isActive);
6068
+ return this.props.menuItems.some((menuItem) => !!this.getIconName(menuItem));
6069
6069
  }
6070
6070
  getIconName(menu) {
6071
6071
  if (menu.icon(this.env)) {
@@ -16878,6 +16878,7 @@ class LineChart extends AbstractChart {
16878
16878
  aggregated;
16879
16879
  type = "line";
16880
16880
  dataSetsHaveTitle;
16881
+ cumulative;
16881
16882
  constructor(definition, sheetId, getters) {
16882
16883
  super(definition, sheetId, getters);
16883
16884
  this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
@@ -16889,6 +16890,7 @@ class LineChart extends AbstractChart {
16889
16890
  this.stacked = definition.stacked;
16890
16891
  this.aggregated = definition.aggregated;
16891
16892
  this.dataSetsHaveTitle = definition.dataSetsHaveTitle;
16893
+ this.cumulative = definition.cumulative;
16892
16894
  }
16893
16895
  static validateChartDefinition(validator, definition) {
16894
16896
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -16909,6 +16911,7 @@ class LineChart extends AbstractChart {
16909
16911
  labelRange: context.auxiliaryRange || undefined,
16910
16912
  stacked: false,
16911
16913
  aggregated: false,
16914
+ cumulative: false,
16912
16915
  };
16913
16916
  }
16914
16917
  getDefinition() {
@@ -16929,6 +16932,7 @@ class LineChart extends AbstractChart {
16929
16932
  labelsAsText: this.labelsAsText,
16930
16933
  stacked: this.stacked,
16931
16934
  aggregated: this.aggregated,
16935
+ cumulative: this.cumulative,
16932
16936
  };
16933
16937
  }
16934
16938
  getContextCreation() {
@@ -17139,6 +17143,16 @@ function createLineChartRuntime(chart, getters) {
17139
17143
  if (chart.stacked) {
17140
17144
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
17141
17145
  }
17146
+ if (chart.cumulative) {
17147
+ let accumulator = 0;
17148
+ data = data.map((value) => {
17149
+ if (!isNaN(value)) {
17150
+ accumulator += parseFloat(value);
17151
+ return accumulator;
17152
+ }
17153
+ return value;
17154
+ });
17155
+ }
17142
17156
  const backgroundColor = rgbaToHex(backgroundRGBA);
17143
17157
  const dataset = {
17144
17158
  label,
@@ -18013,6 +18027,7 @@ function getSmartChartDefinition(zone, getters) {
18013
18027
  labelsAsText: false,
18014
18028
  stacked: false,
18015
18029
  aggregated: false,
18030
+ cumulative: false,
18016
18031
  labelRange: labelRangeXc,
18017
18032
  type: "line",
18018
18033
  dataSetsHaveTitle,
@@ -18176,6 +18191,13 @@ const REMOVE_ROWS_ACTION = (env) => {
18176
18191
  elements: rows,
18177
18192
  });
18178
18193
  };
18194
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
18195
+ const sheetId = env.model.getters.getActiveSheetId();
18196
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
18197
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
18198
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
18199
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
18200
+ };
18179
18201
  const REMOVE_COLUMNS_NAME = (env) => {
18180
18202
  if (env.model.getters.getSelectedZones().length > 1) {
18181
18203
  return _lt("Delete columns");
@@ -18200,7 +18222,7 @@ const REMOVE_COLUMNS_NAME = (env) => {
18200
18222
  const NOT_ALL_VISIBLE_ROWS_SELECTED = (env) => {
18201
18223
  const sheetId = env.model.getters.getActiveSheetId();
18202
18224
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
18203
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
18225
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
18204
18226
  };
18205
18227
  const REMOVE_COLUMNS_ACTION = (env) => {
18206
18228
  let columns = [...env.model.getters.getActiveCols()];
@@ -18219,7 +18241,7 @@ const REMOVE_COLUMNS_ACTION = (env) => {
18219
18241
  const NOT_ALL_VISIBLE_COLS_SELECTED = (env) => {
18220
18242
  const sheetId = env.model.getters.getActiveSheetId();
18221
18243
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
18222
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
18244
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
18223
18245
  };
18224
18246
  const INSERT_ROWS_BEFORE_ACTION = (env) => {
18225
18247
  const activeRows = env.model.getters.getActiveRows();
@@ -18491,7 +18513,7 @@ const deleteValues = {
18491
18513
  const deleteRows = {
18492
18514
  name: REMOVE_ROWS_NAME,
18493
18515
  execute: REMOVE_ROWS_ACTION,
18494
- isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
18516
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
18495
18517
  };
18496
18518
  const deleteRow = {
18497
18519
  ...deleteRows,
@@ -18504,7 +18526,7 @@ const clearRows = {
18504
18526
  const deleteCols = {
18505
18527
  name: REMOVE_COLUMNS_NAME,
18506
18528
  execute: REMOVE_COLUMNS_ACTION,
18507
- isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
18529
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
18508
18530
  };
18509
18531
  const deleteCol = {
18510
18532
  ...deleteCols,
@@ -20731,34 +20753,25 @@ class BarConfigPanel extends LineBarPieConfigPanel {
20731
20753
  }
20732
20754
 
20733
20755
  function startDnd(onMouseMove, onMouseUp, onMouseDown = () => { }) {
20734
- const _onMouseDown = (ev) => {
20735
- ev.preventDefault();
20736
- onMouseDown(ev);
20737
- };
20738
- const _onMouseMove = (ev) => {
20739
- ev.preventDefault();
20740
- onMouseMove(ev);
20741
- };
20742
20756
  const _onMouseUp = (ev) => {
20743
- ev.preventDefault();
20744
20757
  onMouseUp(ev);
20745
- window.removeEventListener("mousedown", _onMouseDown);
20758
+ window.removeEventListener("mousedown", onMouseDown);
20746
20759
  window.removeEventListener("mouseup", _onMouseUp);
20747
20760
  window.removeEventListener("dragstart", _onDragStart);
20748
- window.removeEventListener("mousemove", _onMouseMove);
20749
- window.removeEventListener("wheel", _onMouseMove);
20761
+ window.removeEventListener("mousemove", onMouseMove);
20762
+ window.removeEventListener("wheel", onMouseMove);
20750
20763
  };
20751
20764
  function _onDragStart(ev) {
20752
20765
  ev.preventDefault();
20753
20766
  }
20754
- window.addEventListener("mousedown", _onMouseDown);
20767
+ window.addEventListener("mousedown", onMouseDown);
20755
20768
  window.addEventListener("mouseup", _onMouseUp);
20756
20769
  window.addEventListener("dragstart", _onDragStart);
20757
- window.addEventListener("mousemove", _onMouseMove);
20770
+ window.addEventListener("mousemove", onMouseMove);
20758
20771
  // mouse wheel on window is by default a passive event.
20759
20772
  // preventDefault() is not allowed in passive event handler.
20760
20773
  // https://chromestatus.com/feature/6662647093133312
20761
- window.addEventListener("wheel", _onMouseMove, { passive: false });
20774
+ window.addEventListener("wheel", onMouseMove, { passive: false });
20762
20775
  }
20763
20776
  /**
20764
20777
  * Function to be used during a mousedown event, this function allows to
@@ -21488,6 +21501,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
21488
21501
  aggregated: ev.target.checked,
21489
21502
  });
21490
21503
  }
21504
+ onUpdateCumulative(ev) {
21505
+ this.props.updateChart(this.props.figureId, {
21506
+ cumulative: ev.target.checked,
21507
+ });
21508
+ }
21491
21509
  }
21492
21510
 
21493
21511
  class LineChartDesignPanel extends LineBarPieDesignPanel {
@@ -26776,7 +26794,8 @@ class Grid extends owl.Component {
26776
26794
  }
26777
26795
  let prevCol = col;
26778
26796
  let prevRow = row;
26779
- const onMouseMove = (col, row) => {
26797
+ const onMouseMove = (col, row, ev) => {
26798
+ ev.preventDefault();
26780
26799
  if ((col !== prevCol && col != -1) || (row !== prevRow && row != -1)) {
26781
26800
  prevCol = col === -1 ? prevCol : col;
26782
26801
  prevRow = row === -1 ? prevRow : row;
@@ -28460,6 +28479,7 @@ function convertChartData(chartData) {
28460
28479
  legendPosition: chartData.legendPosition,
28461
28480
  stacked: chartData.stacked || false,
28462
28481
  aggregated: false,
28482
+ cumulative: chartData.cumulative || false,
28463
28483
  labelsAsText: false,
28464
28484
  };
28465
28485
  }
@@ -33120,7 +33140,7 @@ class HeaderSizePlugin extends CorePlugin {
33120
33140
 
33121
33141
  class HeaderVisibilityPlugin extends CorePlugin {
33122
33142
  static getters = [
33123
- "canRemoveHeaders",
33143
+ "checkElementsIncludeAllVisibleHeaders",
33124
33144
  "getHiddenColsGroups",
33125
33145
  "getHiddenRowsGroups",
33126
33146
  "isRowHiddenByUser",
@@ -33154,7 +33174,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
33154
33174
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
33155
33175
  return 28 /* CommandResult.InvalidSheetId */;
33156
33176
  }
33157
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
33177
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
33158
33178
  return 8 /* CommandResult.NotEnoughElements */;
33159
33179
  }
33160
33180
  return 0 /* CommandResult.Success */;
@@ -33204,9 +33224,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
33204
33224
  }
33205
33225
  return;
33206
33226
  }
33207
- canRemoveHeaders(sheetId, dimension, elements) {
33227
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
33208
33228
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
33209
- return !includesAll(elements, visibleHeaders);
33229
+ return includesAll(elements, visibleHeaders);
33210
33230
  }
33211
33231
  isRowHiddenByUser(sheetId, index) {
33212
33232
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -34311,6 +34331,7 @@ class SheetPlugin extends CorePlugin {
34311
34331
  "checkZonesExistInSheet",
34312
34332
  "getCommandZones",
34313
34333
  "getUnboundedZone",
34334
+ "checkElementsIncludeAllNonFrozenHeaders",
34314
34335
  ];
34315
34336
  sheetIdsMapName = {};
34316
34337
  orderedSheetIds = [];
@@ -34367,6 +34388,9 @@ class SheetPlugin extends CorePlugin {
34367
34388
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
34368
34389
  return 87 /* CommandResult.InvalidHeaderIndex */;
34369
34390
  }
34391
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
34392
+ return 8 /* CommandResult.NotEnoughElements */;
34393
+ }
34370
34394
  else {
34371
34395
  return 0 /* CommandResult.Success */;
34372
34396
  }
@@ -34659,6 +34683,20 @@ class SheetPlugin extends CorePlugin {
34659
34683
  }
34660
34684
  this.history.update("sheets", sheetId, "panes", panes);
34661
34685
  }
34686
+ /**
34687
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
34688
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
34689
+ */
34690
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
34691
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
34692
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
34693
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
34694
+ if (!startIndex) {
34695
+ return false;
34696
+ }
34697
+ const indicesToCheck = range(startIndex, endIndex);
34698
+ return includesAll(elements, indicesToCheck);
34699
+ }
34662
34700
  // ---------------------------------------------------------------------------
34663
34701
  // Row/Col manipulation
34664
34702
  // ---------------------------------------------------------------------------
@@ -43945,6 +43983,9 @@ class InternalViewport {
43945
43983
  const sheetId = this.sheetId;
43946
43984
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
43947
43985
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
43986
+ if (this.left === -1) {
43987
+ this.left = this.boundaries.left;
43988
+ }
43948
43989
  if (this.right === -1) {
43949
43990
  this.right = this.getters.getNumberCols(sheetId) - 1;
43950
43991
  }
@@ -43958,6 +43999,9 @@ class InternalViewport {
43958
43999
  const sheetId = this.sheetId;
43959
44000
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
43960
44001
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
44002
+ if (this.top === -1) {
44003
+ this.top = this.boundaries.top;
44004
+ }
43961
44005
  if (this.bottom === -1) {
43962
44006
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
43963
44007
  }
@@ -50558,6 +50602,6 @@ exports.setTranslationMethod = setTranslationMethod;
50558
50602
  exports.tokenize = tokenize;
50559
50603
 
50560
50604
 
50561
- __info__.version = '16.4.4';
50562
- __info__.date = '2023-08-17T11:08:07.524Z';
50563
- __info__.hash = 'bdb3a4c';
50605
+ __info__.version = '16.4.6';
50606
+ __info__.date = '2023-09-12T11:43:54.243Z';
50607
+ __info__.hash = '5746355';
@@ -424,6 +424,7 @@ interface LineChartDefinition {
424
424
  readonly labelsAsText: boolean;
425
425
  readonly stacked: boolean;
426
426
  readonly aggregated?: boolean;
427
+ readonly cumulative: boolean;
427
428
  }
428
429
  type LineChartRuntime = {
429
430
  chartJsConfig: ChartConfiguration;
@@ -490,6 +491,7 @@ interface ExcelChartDefinition {
490
491
  readonly verticalAxisPosition: VerticalAxisPosition;
491
492
  readonly legendPosition: LegendPosition;
492
493
  readonly stacked?: boolean;
494
+ readonly cumulative?: boolean;
493
495
  }
494
496
  interface ChartCreationContext {
495
497
  readonly range?: string[];
@@ -3462,11 +3464,11 @@ declare class HeaderSizePlugin extends CorePlugin<HeaderSizeState$1> implements
3462
3464
  }
3463
3465
 
3464
3466
  declare class HeaderVisibilityPlugin extends CorePlugin {
3465
- static getters: readonly ["canRemoveHeaders", "getHiddenColsGroups", "getHiddenRowsGroups", "isRowHiddenByUser", "isColHiddenByUser"];
3467
+ static getters: readonly ["checkElementsIncludeAllVisibleHeaders", "getHiddenColsGroups", "getHiddenRowsGroups", "isRowHiddenByUser", "isColHiddenByUser"];
3466
3468
  private readonly hiddenHeaders;
3467
3469
  allowDispatch(cmd: Command): CommandResult.Success | CommandResult.NotEnoughElements | CommandResult.InvalidSheetId | CommandResult.TooManyHiddenElements | CommandResult.InvalidHeaderIndex;
3468
3470
  handle(cmd: Command): void;
3469
- canRemoveHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
3471
+ checkElementsIncludeAllVisibleHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
3470
3472
  isRowHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
3471
3473
  isColHiddenByUser(sheetId: UID, index: HeaderIndex): boolean;
3472
3474
  getHiddenColsGroups(sheetId: UID): ConsecutiveIndexes[];
@@ -3603,7 +3605,7 @@ interface SheetState$1 {
3603
3605
  readonly cellPosition: Record<UID, CellPosition | undefined>;
3604
3606
  }
3605
3607
  declare class SheetPlugin extends CorePlugin<SheetState$1> implements SheetState$1 {
3606
- 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", "getUnboundedZone"];
3608
+ 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", "getUnboundedZone", "checkElementsIncludeAllNonFrozenHeaders"];
3607
3609
  readonly sheetIdsMapName: Record<string, UID | undefined>;
3608
3610
  readonly orderedSheetIds: UID[];
3609
3611
  readonly sheets: Record<UID, Sheet | undefined>;
@@ -3646,6 +3648,11 @@ declare class SheetPlugin extends CorePlugin<SheetState$1> implements SheetState
3646
3648
  getUnboundedZone(sheetId: UID, zone: Zone): UnboundedZone;
3647
3649
  getPaneDivisions(sheetId: UID): Readonly<PaneDivision>;
3648
3650
  private setPaneDivisions;
3651
+ /**
3652
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
3653
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
3654
+ */
3655
+ checkElementsIncludeAllNonFrozenHeaders(sheetId: UID, dimension: Dimension, elements: HeaderIndex[]): boolean;
3649
3656
  /**
3650
3657
  * Check if a zone only contains empty cells
3651
3658
  */
@@ -5354,6 +5361,7 @@ declare class LineConfigPanel extends LineBarPieConfigPanel {
5354
5361
  onUpdateLabelsAsText(ev: any): void;
5355
5362
  onUpdateStacked(ev: any): void;
5356
5363
  onUpdateAggregated(ev: any): void;
5364
+ onUpdateCumulative(ev: any): void;
5357
5365
  }
5358
5366
 
5359
5367
  interface Props$y {
@@ -6061,7 +6061,7 @@ class Menu extends Component {
6061
6061
  };
6062
6062
  }
6063
6063
  get childrenHaveIcon() {
6064
- return this.props.menuItems.some((menuItem) => !!menuItem.icon || !!menuItem.isActive);
6064
+ return this.props.menuItems.some((menuItem) => !!this.getIconName(menuItem));
6065
6065
  }
6066
6066
  getIconName(menu) {
6067
6067
  if (menu.icon(this.env)) {
@@ -16874,6 +16874,7 @@ class LineChart extends AbstractChart {
16874
16874
  aggregated;
16875
16875
  type = "line";
16876
16876
  dataSetsHaveTitle;
16877
+ cumulative;
16877
16878
  constructor(definition, sheetId, getters) {
16878
16879
  super(definition, sheetId, getters);
16879
16880
  this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
@@ -16885,6 +16886,7 @@ class LineChart extends AbstractChart {
16885
16886
  this.stacked = definition.stacked;
16886
16887
  this.aggregated = definition.aggregated;
16887
16888
  this.dataSetsHaveTitle = definition.dataSetsHaveTitle;
16889
+ this.cumulative = definition.cumulative;
16888
16890
  }
16889
16891
  static validateChartDefinition(validator, definition) {
16890
16892
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -16905,6 +16907,7 @@ class LineChart extends AbstractChart {
16905
16907
  labelRange: context.auxiliaryRange || undefined,
16906
16908
  stacked: false,
16907
16909
  aggregated: false,
16910
+ cumulative: false,
16908
16911
  };
16909
16912
  }
16910
16913
  getDefinition() {
@@ -16925,6 +16928,7 @@ class LineChart extends AbstractChart {
16925
16928
  labelsAsText: this.labelsAsText,
16926
16929
  stacked: this.stacked,
16927
16930
  aggregated: this.aggregated,
16931
+ cumulative: this.cumulative,
16928
16932
  };
16929
16933
  }
16930
16934
  getContextCreation() {
@@ -17135,6 +17139,16 @@ function createLineChartRuntime(chart, getters) {
17135
17139
  if (chart.stacked) {
17136
17140
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
17137
17141
  }
17142
+ if (chart.cumulative) {
17143
+ let accumulator = 0;
17144
+ data = data.map((value) => {
17145
+ if (!isNaN(value)) {
17146
+ accumulator += parseFloat(value);
17147
+ return accumulator;
17148
+ }
17149
+ return value;
17150
+ });
17151
+ }
17138
17152
  const backgroundColor = rgbaToHex(backgroundRGBA);
17139
17153
  const dataset = {
17140
17154
  label,
@@ -18009,6 +18023,7 @@ function getSmartChartDefinition(zone, getters) {
18009
18023
  labelsAsText: false,
18010
18024
  stacked: false,
18011
18025
  aggregated: false,
18026
+ cumulative: false,
18012
18027
  labelRange: labelRangeXc,
18013
18028
  type: "line",
18014
18029
  dataSetsHaveTitle,
@@ -18172,6 +18187,13 @@ const REMOVE_ROWS_ACTION = (env) => {
18172
18187
  elements: rows,
18173
18188
  });
18174
18189
  };
18190
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
18191
+ const sheetId = env.model.getters.getActiveSheetId();
18192
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
18193
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
18194
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
18195
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
18196
+ };
18175
18197
  const REMOVE_COLUMNS_NAME = (env) => {
18176
18198
  if (env.model.getters.getSelectedZones().length > 1) {
18177
18199
  return _lt("Delete columns");
@@ -18196,7 +18218,7 @@ const REMOVE_COLUMNS_NAME = (env) => {
18196
18218
  const NOT_ALL_VISIBLE_ROWS_SELECTED = (env) => {
18197
18219
  const sheetId = env.model.getters.getActiveSheetId();
18198
18220
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
18199
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
18221
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
18200
18222
  };
18201
18223
  const REMOVE_COLUMNS_ACTION = (env) => {
18202
18224
  let columns = [...env.model.getters.getActiveCols()];
@@ -18215,7 +18237,7 @@ const REMOVE_COLUMNS_ACTION = (env) => {
18215
18237
  const NOT_ALL_VISIBLE_COLS_SELECTED = (env) => {
18216
18238
  const sheetId = env.model.getters.getActiveSheetId();
18217
18239
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
18218
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
18240
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
18219
18241
  };
18220
18242
  const INSERT_ROWS_BEFORE_ACTION = (env) => {
18221
18243
  const activeRows = env.model.getters.getActiveRows();
@@ -18487,7 +18509,7 @@ const deleteValues = {
18487
18509
  const deleteRows = {
18488
18510
  name: REMOVE_ROWS_NAME,
18489
18511
  execute: REMOVE_ROWS_ACTION,
18490
- isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
18512
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
18491
18513
  };
18492
18514
  const deleteRow = {
18493
18515
  ...deleteRows,
@@ -18500,7 +18522,7 @@ const clearRows = {
18500
18522
  const deleteCols = {
18501
18523
  name: REMOVE_COLUMNS_NAME,
18502
18524
  execute: REMOVE_COLUMNS_ACTION,
18503
- isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
18525
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
18504
18526
  };
18505
18527
  const deleteCol = {
18506
18528
  ...deleteCols,
@@ -20727,34 +20749,25 @@ class BarConfigPanel extends LineBarPieConfigPanel {
20727
20749
  }
20728
20750
 
20729
20751
  function startDnd(onMouseMove, onMouseUp, onMouseDown = () => { }) {
20730
- const _onMouseDown = (ev) => {
20731
- ev.preventDefault();
20732
- onMouseDown(ev);
20733
- };
20734
- const _onMouseMove = (ev) => {
20735
- ev.preventDefault();
20736
- onMouseMove(ev);
20737
- };
20738
20752
  const _onMouseUp = (ev) => {
20739
- ev.preventDefault();
20740
20753
  onMouseUp(ev);
20741
- window.removeEventListener("mousedown", _onMouseDown);
20754
+ window.removeEventListener("mousedown", onMouseDown);
20742
20755
  window.removeEventListener("mouseup", _onMouseUp);
20743
20756
  window.removeEventListener("dragstart", _onDragStart);
20744
- window.removeEventListener("mousemove", _onMouseMove);
20745
- window.removeEventListener("wheel", _onMouseMove);
20757
+ window.removeEventListener("mousemove", onMouseMove);
20758
+ window.removeEventListener("wheel", onMouseMove);
20746
20759
  };
20747
20760
  function _onDragStart(ev) {
20748
20761
  ev.preventDefault();
20749
20762
  }
20750
- window.addEventListener("mousedown", _onMouseDown);
20763
+ window.addEventListener("mousedown", onMouseDown);
20751
20764
  window.addEventListener("mouseup", _onMouseUp);
20752
20765
  window.addEventListener("dragstart", _onDragStart);
20753
- window.addEventListener("mousemove", _onMouseMove);
20766
+ window.addEventListener("mousemove", onMouseMove);
20754
20767
  // mouse wheel on window is by default a passive event.
20755
20768
  // preventDefault() is not allowed in passive event handler.
20756
20769
  // https://chromestatus.com/feature/6662647093133312
20757
- window.addEventListener("wheel", _onMouseMove, { passive: false });
20770
+ window.addEventListener("wheel", onMouseMove, { passive: false });
20758
20771
  }
20759
20772
  /**
20760
20773
  * Function to be used during a mousedown event, this function allows to
@@ -21484,6 +21497,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
21484
21497
  aggregated: ev.target.checked,
21485
21498
  });
21486
21499
  }
21500
+ onUpdateCumulative(ev) {
21501
+ this.props.updateChart(this.props.figureId, {
21502
+ cumulative: ev.target.checked,
21503
+ });
21504
+ }
21487
21505
  }
21488
21506
 
21489
21507
  class LineChartDesignPanel extends LineBarPieDesignPanel {
@@ -26772,7 +26790,8 @@ class Grid extends Component {
26772
26790
  }
26773
26791
  let prevCol = col;
26774
26792
  let prevRow = row;
26775
- const onMouseMove = (col, row) => {
26793
+ const onMouseMove = (col, row, ev) => {
26794
+ ev.preventDefault();
26776
26795
  if ((col !== prevCol && col != -1) || (row !== prevRow && row != -1)) {
26777
26796
  prevCol = col === -1 ? prevCol : col;
26778
26797
  prevRow = row === -1 ? prevRow : row;
@@ -28456,6 +28475,7 @@ function convertChartData(chartData) {
28456
28475
  legendPosition: chartData.legendPosition,
28457
28476
  stacked: chartData.stacked || false,
28458
28477
  aggregated: false,
28478
+ cumulative: chartData.cumulative || false,
28459
28479
  labelsAsText: false,
28460
28480
  };
28461
28481
  }
@@ -33116,7 +33136,7 @@ class HeaderSizePlugin extends CorePlugin {
33116
33136
 
33117
33137
  class HeaderVisibilityPlugin extends CorePlugin {
33118
33138
  static getters = [
33119
- "canRemoveHeaders",
33139
+ "checkElementsIncludeAllVisibleHeaders",
33120
33140
  "getHiddenColsGroups",
33121
33141
  "getHiddenRowsGroups",
33122
33142
  "isRowHiddenByUser",
@@ -33150,7 +33170,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
33150
33170
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
33151
33171
  return 28 /* CommandResult.InvalidSheetId */;
33152
33172
  }
33153
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
33173
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
33154
33174
  return 8 /* CommandResult.NotEnoughElements */;
33155
33175
  }
33156
33176
  return 0 /* CommandResult.Success */;
@@ -33200,9 +33220,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
33200
33220
  }
33201
33221
  return;
33202
33222
  }
33203
- canRemoveHeaders(sheetId, dimension, elements) {
33223
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
33204
33224
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
33205
- return !includesAll(elements, visibleHeaders);
33225
+ return includesAll(elements, visibleHeaders);
33206
33226
  }
33207
33227
  isRowHiddenByUser(sheetId, index) {
33208
33228
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -34307,6 +34327,7 @@ class SheetPlugin extends CorePlugin {
34307
34327
  "checkZonesExistInSheet",
34308
34328
  "getCommandZones",
34309
34329
  "getUnboundedZone",
34330
+ "checkElementsIncludeAllNonFrozenHeaders",
34310
34331
  ];
34311
34332
  sheetIdsMapName = {};
34312
34333
  orderedSheetIds = [];
@@ -34363,6 +34384,9 @@ class SheetPlugin extends CorePlugin {
34363
34384
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
34364
34385
  return 87 /* CommandResult.InvalidHeaderIndex */;
34365
34386
  }
34387
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
34388
+ return 8 /* CommandResult.NotEnoughElements */;
34389
+ }
34366
34390
  else {
34367
34391
  return 0 /* CommandResult.Success */;
34368
34392
  }
@@ -34655,6 +34679,20 @@ class SheetPlugin extends CorePlugin {
34655
34679
  }
34656
34680
  this.history.update("sheets", sheetId, "panes", panes);
34657
34681
  }
34682
+ /**
34683
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
34684
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
34685
+ */
34686
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
34687
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
34688
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
34689
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
34690
+ if (!startIndex) {
34691
+ return false;
34692
+ }
34693
+ const indicesToCheck = range(startIndex, endIndex);
34694
+ return includesAll(elements, indicesToCheck);
34695
+ }
34658
34696
  // ---------------------------------------------------------------------------
34659
34697
  // Row/Col manipulation
34660
34698
  // ---------------------------------------------------------------------------
@@ -43941,6 +43979,9 @@ class InternalViewport {
43941
43979
  const sheetId = this.sheetId;
43942
43980
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
43943
43981
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
43982
+ if (this.left === -1) {
43983
+ this.left = this.boundaries.left;
43984
+ }
43944
43985
  if (this.right === -1) {
43945
43986
  this.right = this.getters.getNumberCols(sheetId) - 1;
43946
43987
  }
@@ -43954,6 +43995,9 @@ class InternalViewport {
43954
43995
  const sheetId = this.sheetId;
43955
43996
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
43956
43997
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
43998
+ if (this.top === -1) {
43999
+ this.top = this.boundaries.top;
44000
+ }
43957
44001
  if (this.bottom === -1) {
43958
44002
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
43959
44003
  }
@@ -50522,6 +50566,6 @@ const constants = {
50522
50566
  export { AbstractChart, CommandResult, CorePlugin, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, compile, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, invalidateCFEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, tokenize };
50523
50567
 
50524
50568
 
50525
- __info__.version = '16.4.4';
50526
- __info__.date = '2023-08-17T11:08:07.524Z';
50527
- __info__.hash = 'bdb3a4c';
50569
+ __info__.version = '16.4.6';
50570
+ __info__.date = '2023-09-12T11:43:54.243Z';
50571
+ __info__.hash = '5746355';