@odoo/o-spreadsheet 16.0.17 → 16.0.19

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.
@@ -1007,13 +1007,17 @@
1007
1007
  return position === "after" ? base + 1 : base;
1008
1008
  }
1009
1009
  /**
1010
- * Compare two objects.
1010
+ * Compares two objects.
1011
1011
  */
1012
1012
  function deepEquals(o1, o2) {
1013
1013
  if (o1 === o2)
1014
1014
  return true;
1015
1015
  if ((o1 && !o2) || (o2 && !o1))
1016
1016
  return false;
1017
+ if (typeof o1 !== typeof o2)
1018
+ return false;
1019
+ if (typeof o1 !== "object")
1020
+ return o1 === o2;
1017
1021
  // Objects can have different keys if the values are undefined
1018
1022
  const keys = new Set();
1019
1023
  Object.keys(o1).forEach((key) => keys.add(key));
@@ -3516,6 +3520,7 @@
3516
3520
  background-color: white;
3517
3521
  border-left: 3px solid red;
3518
3522
  padding: 10px;
3523
+ overflow-wrap: break-word;
3519
3524
  }
3520
3525
  `;
3521
3526
  class ErrorToolTip extends owl.Component {
@@ -5032,6 +5037,13 @@
5032
5037
  elements: rows,
5033
5038
  });
5034
5039
  };
5040
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
5041
+ const sheetId = env.model.getters.getActiveSheetId();
5042
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
5043
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
5044
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
5045
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
5046
+ };
5035
5047
  const REMOVE_COLUMNS_NAME = (env) => {
5036
5048
  if (env.model.getters.getSelectedZones().length > 1) {
5037
5049
  return _lt("Delete columns");
@@ -5636,11 +5648,7 @@
5636
5648
  name: REMOVE_COLUMNS_NAME,
5637
5649
  sequence: 90,
5638
5650
  action: REMOVE_COLUMNS_ACTION,
5639
- isVisible: (env) => {
5640
- const sheetId = env.model.getters.getActiveSheetId();
5641
- const selectedCols = env.model.getters.getElementsFromSelection("COL");
5642
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
5643
- },
5651
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
5644
5652
  })
5645
5653
  .add("clear_column", {
5646
5654
  name: DELETE_CONTENT_COLUMNS_NAME,
@@ -5654,7 +5662,7 @@
5654
5662
  isVisible: (env) => {
5655
5663
  const sheetId = env.model.getters.getActiveSheetId();
5656
5664
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
5657
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
5665
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
5658
5666
  },
5659
5667
  separator: true,
5660
5668
  })
@@ -5728,11 +5736,7 @@
5728
5736
  name: REMOVE_ROWS_NAME,
5729
5737
  sequence: 70,
5730
5738
  action: REMOVE_ROWS_ACTION,
5731
- isVisible: (env) => {
5732
- const sheetId = env.model.getters.getActiveSheetId();
5733
- const selectedRows = env.model.getters.getElementsFromSelection("ROW");
5734
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
5735
- },
5739
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
5736
5740
  })
5737
5741
  .add("clear_row", {
5738
5742
  name: DELETE_CONTENT_ROWS_NAME,
@@ -5746,7 +5750,7 @@
5746
5750
  isVisible: (env) => {
5747
5751
  const sheetId = env.model.getters.getActiveSheetId();
5748
5752
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
5749
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
5753
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
5750
5754
  },
5751
5755
  separator: true,
5752
5756
  })
@@ -6040,11 +6044,13 @@
6040
6044
  name: REMOVE_ROWS_NAME,
6041
6045
  sequence: 80,
6042
6046
  action: REMOVE_ROWS_ACTION,
6047
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
6043
6048
  })
6044
6049
  .addChild("edit_delete_column", ["edit"], {
6045
6050
  name: REMOVE_COLUMNS_NAME,
6046
6051
  sequence: 90,
6047
6052
  action: REMOVE_COLUMNS_ACTION,
6053
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
6048
6054
  })
6049
6055
  .addChild("edit_delete_cell_shift_up", ["edit"], {
6050
6056
  name: _lt("Delete cell and shift up"),
@@ -7811,6 +7817,7 @@
7811
7817
  this.legendPosition = definition.legendPosition;
7812
7818
  this.labelsAsText = definition.labelsAsText;
7813
7819
  this.stacked = definition.stacked;
7820
+ this.cumulative = definition.cumulative;
7814
7821
  }
7815
7822
  static validateChartDefinition(validator, definition) {
7816
7823
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -7830,6 +7837,7 @@
7830
7837
  verticalAxisPosition: "left",
7831
7838
  labelRange: context.auxiliaryRange || undefined,
7832
7839
  stacked: false,
7840
+ cumulative: false,
7833
7841
  };
7834
7842
  }
7835
7843
  getDefinition() {
@@ -7849,6 +7857,7 @@
7849
7857
  title: this.title,
7850
7858
  labelsAsText: this.labelsAsText,
7851
7859
  stacked: this.stacked,
7860
+ cumulative: this.cumulative,
7852
7861
  };
7853
7862
  }
7854
7863
  getContextCreation() {
@@ -8033,6 +8042,16 @@
8033
8042
  if (chart.stacked) {
8034
8043
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
8035
8044
  }
8045
+ if (chart.cumulative) {
8046
+ let accumulator = 0;
8047
+ data = data.map((value) => {
8048
+ if (!isNaN(value)) {
8049
+ accumulator += parseFloat(value);
8050
+ return accumulator;
8051
+ }
8052
+ return value;
8053
+ });
8054
+ }
8036
8055
  const backgroundColor = rgbaToHex(backgroundRGBA);
8037
8056
  const dataset = {
8038
8057
  label,
@@ -8818,6 +8837,11 @@
8818
8837
  stacked: ev.target.checked,
8819
8838
  });
8820
8839
  }
8840
+ onUpdateCumulative(ev) {
8841
+ this.props.updateChart(this.props.figureId, {
8842
+ cumulative: ev.target.checked,
8843
+ });
8844
+ }
8821
8845
  }
8822
8846
  LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
8823
8847
 
@@ -21277,9 +21301,11 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
21277
21301
  }
21278
21302
  }
21279
21303
  function updateMousePosition(e) {
21280
- x = e.offsetX;
21281
- y = e.offsetY;
21282
- lastMoved = Date.now();
21304
+ if (gridRef.el === e.target) {
21305
+ x = e.offsetX;
21306
+ y = e.offsetY;
21307
+ lastMoved = Date.now();
21308
+ }
21283
21309
  }
21284
21310
  function recompute() {
21285
21311
  const { col, row } = getPosition();
@@ -24647,6 +24673,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
24647
24673
  verticalAxisPosition: chartData.verticalAxisPosition,
24648
24674
  legendPosition: chartData.legendPosition,
24649
24675
  stacked: chartData.stacked || false,
24676
+ cumulative: chartData.cumulative || false,
24650
24677
  labelsAsText: false,
24651
24678
  };
24652
24679
  }
@@ -28922,7 +28949,11 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
28922
28949
  let sizes = [...this.sizes[cmd.sheetId][cmd.dimension]];
28923
28950
  const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
28924
28951
  const baseSize = sizes[cmd.base];
28925
- sizes.splice(addIndex, 0, ...Array(cmd.quantity).fill(baseSize));
28952
+ const sizesToInsert = range(0, cmd.quantity).map(() => ({
28953
+ manualSize: baseSize.manualSize,
28954
+ computedSize: lazy(baseSize.computedSize()),
28955
+ }));
28956
+ sizes.splice(addIndex, 0, ...sizesToInsert);
28926
28957
  sizes = sizes.map((size, row) => {
28927
28958
  if (cmd.dimension === "ROW" && row > cmd.base + cmd.quantity) {
28928
28959
  // invalidate sizes
@@ -29139,7 +29170,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
29139
29170
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
29140
29171
  return 27 /* CommandResult.InvalidSheetId */;
29141
29172
  }
29142
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29173
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29143
29174
  return 8 /* CommandResult.NotEnoughElements */;
29144
29175
  }
29145
29176
  return 0 /* CommandResult.Success */;
@@ -29189,9 +29220,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
29189
29220
  }
29190
29221
  return;
29191
29222
  }
29192
- canRemoveHeaders(sheetId, dimension, elements) {
29223
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
29193
29224
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
29194
- return !includesAll(elements, visibleHeaders);
29225
+ return includesAll(elements, visibleHeaders);
29195
29226
  }
29196
29227
  isRowHiddenByUser(sheetId, index) {
29197
29228
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -29287,7 +29318,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
29287
29318
  }
29288
29319
  }
29289
29320
  HeaderVisibilityPlugin.getters = [
29290
- "canRemoveHeaders",
29321
+ "checkElementsIncludeAllVisibleHeaders",
29291
29322
  "getHiddenColsGroups",
29292
29323
  "getHiddenRowsGroups",
29293
29324
  "isRowHiddenByUser",
@@ -29806,6 +29837,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
29806
29837
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
29807
29838
  return 85 /* CommandResult.InvalidHeaderIndex */;
29808
29839
  }
29840
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29841
+ return 8 /* CommandResult.NotEnoughElements */;
29842
+ }
29809
29843
  else {
29810
29844
  return 0 /* CommandResult.Success */;
29811
29845
  }
@@ -30105,6 +30139,20 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
30105
30139
  }
30106
30140
  this.history.update("sheets", sheetId, "panes", panes);
30107
30141
  }
30142
+ /**
30143
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
30144
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
30145
+ */
30146
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
30147
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
30148
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
30149
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
30150
+ if (!startIndex) {
30151
+ return false;
30152
+ }
30153
+ const indicesToCheck = range(startIndex, endIndex);
30154
+ return includesAll(elements, indicesToCheck);
30155
+ }
30108
30156
  // ---------------------------------------------------------------------------
30109
30157
  // Row/Col manipulation
30110
30158
  // ---------------------------------------------------------------------------
@@ -30639,6 +30687,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
30639
30687
  "getSheetSize",
30640
30688
  "getSheetZone",
30641
30689
  "getPaneDivisions",
30690
+ "checkElementsIncludeAllNonFrozenHeaders",
30642
30691
  ];
30643
30692
 
30644
30693
  /**
@@ -32020,7 +32069,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
32020
32069
  allowDispatch(cmd) {
32021
32070
  switch (cmd.type) {
32022
32071
  case "CUT":
32023
- const zones = cmd.target || this.getters.getSelectedZones();
32072
+ const zones = this.getters.getSelectedZones();
32024
32073
  const state = this.getClipboardState(zones, cmd.type);
32025
32074
  return state.isCutAllowed(zones);
32026
32075
  case "PASTE":
@@ -32051,7 +32100,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
32051
32100
  switch (cmd.type) {
32052
32101
  case "COPY":
32053
32102
  case "CUT":
32054
- const zones = ("target" in cmd && cmd.target) || this.getters.getSelectedZones();
32103
+ const zones = this.getters.getSelectedZones();
32055
32104
  this.state = this.getClipboardState(zones, cmd.type);
32056
32105
  this.status = "visible";
32057
32106
  break;
@@ -32669,6 +32718,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
32669
32718
  // stores the computed styles in the format of computedStyles.sheetName[col][row] = Style
32670
32719
  this.computedStyles = {};
32671
32720
  this.computedIcons = {};
32721
+ this.uuidGenerator = new UuidGenerator();
32672
32722
  /**
32673
32723
  * Execute the predicate to know if a conditional formatting rule should be applied to a cell
32674
32724
  */
@@ -33020,8 +33070,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
33020
33070
  this.adaptRules(origin.sheetId, cf, [xc], toRemoveRange);
33021
33071
  }
33022
33072
  else {
33023
- this.adaptRules(target.sheetId, cf, [xc], []);
33024
33073
  this.adaptRules(origin.sheetId, cf, [], toRemoveRange);
33074
+ const cfToCopyTo = this.getCFToCopyTo(target.sheetId, cf);
33075
+ this.adaptRules(target.sheetId, cfToCopyTo, [xc], []);
33025
33076
  }
33026
33077
  }
33027
33078
  }
@@ -33030,6 +33081,12 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
33030
33081
  isCellValueNumber(value) {
33031
33082
  return typeof value === "number";
33032
33083
  }
33084
+ getCFToCopyTo(targetSheetId, originCF) {
33085
+ const cfInTarget = this.getters
33086
+ .getConditionalFormats(targetSheetId)
33087
+ .find((cf) => cf.stopIfTrue === originCF.stopIfTrue && deepEquals(cf.rule, originCF.rule));
33088
+ return cfInTarget ? cfInTarget : { ...originCF, id: this.uuidGenerator.uuidv4(), ranges: [] };
33089
+ }
33033
33090
  }
33034
33091
  EvaluationConditionalFormatPlugin.getters = ["getConditionalIcon", "getCellComputedStyle"];
33035
33092
 
@@ -34797,26 +34854,24 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
34797
34854
  const isBasedBefore = cmd.base < start;
34798
34855
  const deltaCol = isBasedBefore && isCol ? thickness : 0;
34799
34856
  const deltaRow = isBasedBefore && !isCol ? thickness : 0;
34800
- this.dispatch("CUT", {
34801
- target: [
34802
- {
34803
- left: isCol ? start + deltaCol : 0,
34804
- right: isCol ? end + deltaCol : this.getters.getNumberCols(cmd.sheetId) - 1,
34805
- top: !isCol ? start + deltaRow : 0,
34806
- bottom: !isCol ? end + deltaRow : this.getters.getNumberRows(cmd.sheetId) - 1,
34807
- },
34808
- ],
34809
- });
34810
- this.dispatch("PASTE", {
34811
- target: [
34812
- {
34813
- left: isCol ? cmd.base : 0,
34814
- right: isCol ? cmd.base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
34815
- top: !isCol ? cmd.base : 0,
34816
- bottom: !isCol ? cmd.base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
34817
- },
34818
- ],
34819
- });
34857
+ const target = [
34858
+ {
34859
+ left: isCol ? start + deltaCol : 0,
34860
+ right: isCol ? end + deltaCol : this.getters.getNumberCols(cmd.sheetId) - 1,
34861
+ top: !isCol ? start + deltaRow : 0,
34862
+ bottom: !isCol ? end + deltaRow : this.getters.getNumberRows(cmd.sheetId) - 1,
34863
+ },
34864
+ ];
34865
+ const state = new ClipboardCellsState(target, "CUT", this.getters, this.dispatch, this.selection);
34866
+ const pasteTarget = [
34867
+ {
34868
+ left: isCol ? cmd.base : 0,
34869
+ right: isCol ? cmd.base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
34870
+ top: !isCol ? cmd.base : 0,
34871
+ bottom: !isCol ? cmd.base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
34872
+ },
34873
+ ];
34874
+ state.paste(pasteTarget, { selectTarget: true });
34820
34875
  const toRemove = isBasedBefore ? cmd.elements.map((el) => el + thickness) : cmd.elements;
34821
34876
  let currentIndex = cmd.base;
34822
34877
  for (const element of toRemove) {
@@ -36432,6 +36487,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
36432
36487
  const sheetId = this.sheetId;
36433
36488
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
36434
36489
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
36490
+ if (this.left === -1) {
36491
+ this.left = this.boundaries.left;
36492
+ }
36435
36493
  if (this.right === -1) {
36436
36494
  this.right = this.getters.getNumberCols(sheetId) - 1;
36437
36495
  }
@@ -36445,6 +36503,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
36445
36503
  const sheetId = this.sheetId;
36446
36504
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
36447
36505
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
36506
+ if (this.top === -1) {
36507
+ this.top = this.boundaries.top;
36508
+ }
36448
36509
  if (this.bottom === -1) {
36449
36510
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
36450
36511
  }
@@ -42860,9 +42921,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
42860
42921
  Object.defineProperty(exports, '__esModule', { value: true });
42861
42922
 
42862
42923
 
42863
- __info__.version = '16.0.17';
42864
- __info__.date = '2023-08-17T11:08:00.168Z';
42865
- __info__.hash = '34011c3';
42924
+ __info__.version = '16.0.19';
42925
+ __info__.date = '2023-09-21T15:56:31.776Z';
42926
+ __info__.hash = '229c563';
42866
42927
 
42867
42928
 
42868
42929
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);