@odoo/o-spreadsheet 16.3.9 → 16.3.11

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.
@@ -1031,13 +1031,17 @@
1031
1031
  return position === "after" ? base + 1 : base;
1032
1032
  }
1033
1033
  /**
1034
- * Compare two objects.
1034
+ * Compares two objects.
1035
1035
  */
1036
1036
  function deepEquals(o1, o2) {
1037
1037
  if (o1 === o2)
1038
1038
  return true;
1039
1039
  if ((o1 && !o2) || (o2 && !o1))
1040
1040
  return false;
1041
+ if (typeof o1 !== typeof o2)
1042
+ return false;
1043
+ if (typeof o1 !== "object")
1044
+ return o1 === o2;
1041
1045
  // Objects can have different keys if the values are undefined
1042
1046
  const keys = new Set();
1043
1047
  Object.keys(o1).forEach((key) => keys.add(key));
@@ -4803,6 +4807,7 @@
4803
4807
  padding: 10px;
4804
4808
  width: ${ERROR_TOOLTIP_WIDTH}px;
4805
4809
  box-sizing: border-box !important;
4810
+ overflow-wrap: break-word;
4806
4811
  }
4807
4812
  `;
4808
4813
  class ErrorToolTip extends owl.Component {
@@ -7463,6 +7468,7 @@
7463
7468
  aggregated;
7464
7469
  type = "line";
7465
7470
  dataSetsHaveTitle;
7471
+ cumulative;
7466
7472
  constructor(definition, sheetId, getters) {
7467
7473
  super(definition, sheetId, getters);
7468
7474
  this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
@@ -7474,6 +7480,7 @@
7474
7480
  this.stacked = definition.stacked;
7475
7481
  this.aggregated = definition.aggregated;
7476
7482
  this.dataSetsHaveTitle = definition.dataSetsHaveTitle;
7483
+ this.cumulative = definition.cumulative;
7477
7484
  }
7478
7485
  static validateChartDefinition(validator, definition) {
7479
7486
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -7494,6 +7501,7 @@
7494
7501
  labelRange: context.auxiliaryRange || undefined,
7495
7502
  stacked: false,
7496
7503
  aggregated: false,
7504
+ cumulative: false,
7497
7505
  };
7498
7506
  }
7499
7507
  getDefinition() {
@@ -7514,6 +7522,7 @@
7514
7522
  labelsAsText: this.labelsAsText,
7515
7523
  stacked: this.stacked,
7516
7524
  aggregated: this.aggregated,
7525
+ cumulative: this.cumulative,
7517
7526
  };
7518
7527
  }
7519
7528
  getContextCreation() {
@@ -7722,6 +7731,16 @@
7722
7731
  if (chart.stacked) {
7723
7732
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
7724
7733
  }
7734
+ if (chart.cumulative) {
7735
+ let accumulator = 0;
7736
+ data = data.map((value) => {
7737
+ if (!isNaN(value)) {
7738
+ accumulator += parseFloat(value);
7739
+ return accumulator;
7740
+ }
7741
+ return value;
7742
+ });
7743
+ }
7725
7744
  const backgroundColor = rgbaToHex(backgroundRGBA);
7726
7745
  const dataset = {
7727
7746
  label,
@@ -8543,6 +8562,7 @@
8543
8562
  labelsAsText: false,
8544
8563
  stacked: false,
8545
8564
  aggregated: false,
8565
+ cumulative: false,
8546
8566
  labelRange: labelRangeXc,
8547
8567
  type: "line",
8548
8568
  dataSetsHaveTitle,
@@ -8905,6 +8925,13 @@
8905
8925
  elements: rows,
8906
8926
  });
8907
8927
  };
8928
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
8929
+ const sheetId = env.model.getters.getActiveSheetId();
8930
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
8931
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
8932
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
8933
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
8934
+ };
8908
8935
  const REMOVE_COLUMNS_NAME = (env) => {
8909
8936
  if (env.model.getters.getSelectedZones().length > 1) {
8910
8937
  return _lt("Delete columns");
@@ -8929,7 +8956,7 @@
8929
8956
  const NOT_ALL_VISIBLE_ROWS_SELECTED = (env) => {
8930
8957
  const sheetId = env.model.getters.getActiveSheetId();
8931
8958
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
8932
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
8959
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
8933
8960
  };
8934
8961
  const REMOVE_COLUMNS_ACTION = (env) => {
8935
8962
  let columns = [...env.model.getters.getActiveCols()];
@@ -8948,7 +8975,7 @@
8948
8975
  const NOT_ALL_VISIBLE_COLS_SELECTED = (env) => {
8949
8976
  const sheetId = env.model.getters.getActiveSheetId();
8950
8977
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
8951
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
8978
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
8952
8979
  };
8953
8980
  const INSERT_CELL_SHIFT_DOWN = (env) => {
8954
8981
  const zone = env.model.getters.getSelectedZone();
@@ -9405,7 +9432,7 @@
9405
9432
  const deleteRows = {
9406
9433
  name: REMOVE_ROWS_NAME,
9407
9434
  execute: REMOVE_ROWS_ACTION,
9408
- isVisible: NOT_ALL_VISIBLE_ROWS_SELECTED,
9435
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
9409
9436
  };
9410
9437
  const deleteRow = {
9411
9438
  ...deleteRows,
@@ -9418,7 +9445,7 @@
9418
9445
  const deleteCols = {
9419
9446
  name: REMOVE_COLUMNS_NAME,
9420
9447
  execute: REMOVE_COLUMNS_ACTION,
9421
- isVisible: NOT_ALL_VISIBLE_COLS_SELECTED,
9448
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
9422
9449
  };
9423
9450
  const deleteCol = {
9424
9451
  ...deleteCols,
@@ -18466,6 +18493,11 @@
18466
18493
  aggregated: ev.target.checked,
18467
18494
  });
18468
18495
  }
18496
+ onUpdateCumulative(ev) {
18497
+ this.props.updateChart(this.props.figureId, {
18498
+ cumulative: ev.target.checked,
18499
+ });
18500
+ }
18469
18501
  }
18470
18502
 
18471
18503
  class LineChartDesignPanel extends LineBarPieDesignPanel {
@@ -22191,9 +22223,11 @@
22191
22223
  }
22192
22224
  }
22193
22225
  function updateMousePosition(e) {
22194
- x = e.offsetX;
22195
- y = e.offsetY;
22196
- lastMoved = Date.now();
22226
+ if (gridRef.el === e.target) {
22227
+ x = e.offsetX;
22228
+ y = e.offsetY;
22229
+ lastMoved = Date.now();
22230
+ }
22197
22231
  }
22198
22232
  function recompute() {
22199
22233
  const { col, row } = getPosition();
@@ -26405,6 +26439,7 @@
26405
26439
  legendPosition: chartData.legendPosition,
26406
26440
  stacked: chartData.stacked || false,
26407
26441
  aggregated: false,
26442
+ cumulative: chartData.cumulative || false,
26408
26443
  labelsAsText: false,
26409
26444
  };
26410
26445
  }
@@ -31085,7 +31120,7 @@
31085
31120
 
31086
31121
  class HeaderVisibilityPlugin extends CorePlugin {
31087
31122
  static getters = [
31088
- "canRemoveHeaders",
31123
+ "checkElementsIncludeAllVisibleHeaders",
31089
31124
  "getHiddenColsGroups",
31090
31125
  "getHiddenRowsGroups",
31091
31126
  "isRowHiddenByUser",
@@ -31119,7 +31154,7 @@
31119
31154
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
31120
31155
  return 27 /* CommandResult.InvalidSheetId */;
31121
31156
  }
31122
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31157
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31123
31158
  return 8 /* CommandResult.NotEnoughElements */;
31124
31159
  }
31125
31160
  return 0 /* CommandResult.Success */;
@@ -31169,9 +31204,9 @@
31169
31204
  }
31170
31205
  return;
31171
31206
  }
31172
- canRemoveHeaders(sheetId, dimension, elements) {
31207
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
31173
31208
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
31174
- return !includesAll(elements, visibleHeaders);
31209
+ return includesAll(elements, visibleHeaders);
31175
31210
  }
31176
31211
  isRowHiddenByUser(sheetId, index) {
31177
31212
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -32258,6 +32293,7 @@
32258
32293
  "getPaneDivisions",
32259
32294
  "checkZonesExistInSheet",
32260
32295
  "getCommandZones",
32296
+ "checkElementsIncludeAllNonFrozenHeaders",
32261
32297
  ];
32262
32298
  sheetIdsMapName = {};
32263
32299
  orderedSheetIds = [];
@@ -32314,6 +32350,9 @@
32314
32350
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
32315
32351
  return 86 /* CommandResult.InvalidHeaderIndex */;
32316
32352
  }
32353
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
32354
+ return 8 /* CommandResult.NotEnoughElements */;
32355
+ }
32317
32356
  else {
32318
32357
  return 0 /* CommandResult.Success */;
32319
32358
  }
@@ -32596,6 +32635,20 @@
32596
32635
  }
32597
32636
  this.history.update("sheets", sheetId, "panes", panes);
32598
32637
  }
32638
+ /**
32639
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
32640
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
32641
+ */
32642
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
32643
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
32644
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
32645
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
32646
+ if (!startIndex) {
32647
+ return false;
32648
+ }
32649
+ const indicesToCheck = range(startIndex, endIndex);
32650
+ return includesAll(elements, indicesToCheck);
32651
+ }
32599
32652
  // ---------------------------------------------------------------------------
32600
32653
  // Row/Col manipulation
32601
32654
  // ---------------------------------------------------------------------------
@@ -33674,6 +33727,7 @@
33674
33727
  // stores the computed styles in the format of computedStyles.sheetName[col][row] = Style
33675
33728
  computedStyles = {};
33676
33729
  computedIcons = {};
33730
+ uuidGenerator = new UuidGenerator();
33677
33731
  // ---------------------------------------------------------------------------
33678
33732
  // Command Handling
33679
33733
  // ---------------------------------------------------------------------------
@@ -34021,13 +34075,20 @@
34021
34075
  this.adaptRules(origin.sheetId, cf, [xc], toRemoveRange);
34022
34076
  }
34023
34077
  else {
34024
- this.adaptRules(target.sheetId, cf, [xc], []);
34025
34078
  this.adaptRules(origin.sheetId, cf, [], toRemoveRange);
34079
+ const cfToCopyTo = this.getCFToCopyTo(target.sheetId, cf);
34080
+ this.adaptRules(target.sheetId, cfToCopyTo, [xc], []);
34026
34081
  }
34027
34082
  }
34028
34083
  }
34029
34084
  }
34030
34085
  }
34086
+ getCFToCopyTo(targetSheetId, originCF) {
34087
+ const cfInTarget = this.getters
34088
+ .getConditionalFormats(targetSheetId)
34089
+ .find((cf) => cf.stopIfTrue === originCF.stopIfTrue && deepEquals(cf.rule, originCF.rule));
34090
+ return cfInTarget ? cfInTarget : { ...originCF, id: this.uuidGenerator.uuidv4(), ranges: [] };
34091
+ }
34031
34092
  }
34032
34093
 
34033
34094
  class FilterEvaluationPlugin extends UIPlugin {
@@ -34560,6 +34621,9 @@
34560
34621
  const sheetId = this.sheetId;
34561
34622
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
34562
34623
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
34624
+ if (this.left === -1) {
34625
+ this.left = this.boundaries.left;
34626
+ }
34563
34627
  if (this.right === -1) {
34564
34628
  this.right = this.getters.getNumberCols(sheetId) - 1;
34565
34629
  }
@@ -34573,6 +34637,9 @@
34573
34637
  const sheetId = this.sheetId;
34574
34638
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
34575
34639
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
34640
+ if (this.top === -1) {
34641
+ this.top = this.boundaries.top;
34642
+ }
34576
34643
  if (this.bottom === -1) {
34577
34644
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
34578
34645
  }
@@ -40139,7 +40206,7 @@
40139
40206
  allowDispatch(cmd) {
40140
40207
  switch (cmd.type) {
40141
40208
  case "CUT":
40142
- const zones = cmd.cutTarget || this.getters.getSelectedZones();
40209
+ const zones = this.getters.getSelectedZones();
40143
40210
  const state = this.getClipboardState(zones, cmd.type);
40144
40211
  return state.isCutAllowed(zones);
40145
40212
  case "PASTE":
@@ -40169,7 +40236,7 @@
40169
40236
  switch (cmd.type) {
40170
40237
  case "COPY":
40171
40238
  case "CUT":
40172
- const zones = ("cutTarget" in cmd && cmd.cutTarget) || this.getters.getSelectedZones();
40239
+ const zones = this.getters.getSelectedZones();
40173
40240
  this.state = this.getClipboardState(zones, cmd.type);
40174
40241
  this.status = "visible";
40175
40242
  break;
@@ -41589,26 +41656,24 @@
41589
41656
  const isBasedBefore = cmd.base < start;
41590
41657
  const deltaCol = isBasedBefore && isCol ? thickness : 0;
41591
41658
  const deltaRow = isBasedBefore && !isCol ? thickness : 0;
41592
- this.dispatch("CUT", {
41593
- cutTarget: [
41594
- {
41595
- left: isCol ? start + deltaCol : 0,
41596
- right: isCol ? end + deltaCol : this.getters.getNumberCols(cmd.sheetId) - 1,
41597
- top: !isCol ? start + deltaRow : 0,
41598
- bottom: !isCol ? end + deltaRow : this.getters.getNumberRows(cmd.sheetId) - 1,
41599
- },
41600
- ],
41601
- });
41602
- this.dispatch("PASTE", {
41603
- target: [
41604
- {
41605
- left: isCol ? cmd.base : 0,
41606
- right: isCol ? cmd.base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
41607
- top: !isCol ? cmd.base : 0,
41608
- bottom: !isCol ? cmd.base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
41609
- },
41610
- ],
41611
- });
41659
+ const target = [
41660
+ {
41661
+ left: isCol ? start + deltaCol : 0,
41662
+ right: isCol ? end + deltaCol : this.getters.getNumberCols(cmd.sheetId) - 1,
41663
+ top: !isCol ? start + deltaRow : 0,
41664
+ bottom: !isCol ? end + deltaRow : this.getters.getNumberRows(cmd.sheetId) - 1,
41665
+ },
41666
+ ];
41667
+ const state = new ClipboardCellsState(target, "CUT", this.getters, this.dispatch, this.selection);
41668
+ const pasteTarget = [
41669
+ {
41670
+ left: isCol ? cmd.base : 0,
41671
+ right: isCol ? cmd.base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
41672
+ top: !isCol ? cmd.base : 0,
41673
+ bottom: !isCol ? cmd.base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
41674
+ },
41675
+ ];
41676
+ state.paste(pasteTarget, { selectTarget: true });
41612
41677
  const toRemove = isBasedBefore ? cmd.elements.map((el) => el + thickness) : cmd.elements;
41613
41678
  let currentIndex = cmd.base;
41614
41679
  for (const element of toRemove) {
@@ -47654,9 +47719,9 @@
47654
47719
  Object.defineProperty(exports, '__esModule', { value: true });
47655
47720
 
47656
47721
 
47657
- __info__.version = '16.3.9';
47658
- __info__.date = '2023-08-29T13:54:26.065Z';
47659
- __info__.hash = '79cedd4';
47722
+ __info__.version = '16.3.11';
47723
+ __info__.date = '2023-09-21T15:56:40.754Z';
47724
+ __info__.hash = '245df8c';
47660
47725
 
47661
47726
 
47662
47727
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);