@odoo/o-spreadsheet 16.2.13 → 16.2.16

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.
@@ -988,13 +988,17 @@
988
988
  return position === "after" ? base + 1 : base;
989
989
  }
990
990
  /**
991
- * Compare two objects.
991
+ * Compares two objects.
992
992
  */
993
993
  function deepEquals(o1, o2) {
994
994
  if (o1 === o2)
995
995
  return true;
996
996
  if ((o1 && !o2) || (o2 && !o1))
997
997
  return false;
998
+ if (typeof o1 !== typeof o2)
999
+ return false;
1000
+ if (typeof o1 !== "object")
1001
+ return o1 === o2;
998
1002
  // Objects can have different keys if the values are undefined
999
1003
  const keys = new Set();
1000
1004
  Object.keys(o1).forEach((key) => keys.add(key));
@@ -4680,6 +4684,7 @@
4680
4684
  padding: 10px;
4681
4685
  width: ${ERROR_TOOLTIP_WIDTH}px;
4682
4686
  box-sizing: border-box !important;
4687
+ overflow-wrap: break-word;
4683
4688
  }
4684
4689
  `;
4685
4690
  class ErrorToolTip extends owl.Component {
@@ -7242,6 +7247,7 @@
7242
7247
  this.labelsAsText = definition.labelsAsText;
7243
7248
  this.stacked = definition.stacked;
7244
7249
  this.aggregated = definition.aggregated;
7250
+ this.cumulative = definition.cumulative;
7245
7251
  }
7246
7252
  static validateChartDefinition(validator, definition) {
7247
7253
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -7262,6 +7268,7 @@
7262
7268
  labelRange: context.auxiliaryRange || undefined,
7263
7269
  stacked: false,
7264
7270
  aggregated: false,
7271
+ cumulative: false,
7265
7272
  };
7266
7273
  }
7267
7274
  getDefinition() {
@@ -7282,6 +7289,7 @@
7282
7289
  labelsAsText: this.labelsAsText,
7283
7290
  stacked: this.stacked,
7284
7291
  aggregated: this.aggregated,
7292
+ cumulative: this.cumulative,
7285
7293
  };
7286
7294
  }
7287
7295
  getContextCreation() {
@@ -7485,6 +7493,16 @@
7485
7493
  if (chart.stacked) {
7486
7494
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
7487
7495
  }
7496
+ if (chart.cumulative) {
7497
+ let accumulator = 0;
7498
+ data = data.map((value) => {
7499
+ if (!isNaN(value)) {
7500
+ accumulator += parseFloat(value);
7501
+ return accumulator;
7502
+ }
7503
+ return value;
7504
+ });
7505
+ }
7488
7506
  const backgroundColor = rgbaToHex(backgroundRGBA);
7489
7507
  const dataset = {
7490
7508
  label,
@@ -8267,6 +8285,7 @@
8267
8285
  labelsAsText: false,
8268
8286
  stacked: false,
8269
8287
  aggregated: false,
8288
+ cumulative: false,
8270
8289
  labelRange: labelRangeXc,
8271
8290
  type: "line",
8272
8291
  dataSetsHaveTitle,
@@ -8629,6 +8648,13 @@
8629
8648
  elements: rows,
8630
8649
  });
8631
8650
  };
8651
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
8652
+ const sheetId = env.model.getters.getActiveSheetId();
8653
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
8654
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
8655
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
8656
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
8657
+ };
8632
8658
  const REMOVE_COLUMNS_NAME = (env) => {
8633
8659
  if (env.model.getters.getSelectedZones().length > 1) {
8634
8660
  return _lt("Delete columns");
@@ -9219,11 +9245,7 @@
9219
9245
  name: REMOVE_COLUMNS_NAME,
9220
9246
  sequence: 90,
9221
9247
  action: REMOVE_COLUMNS_ACTION,
9222
- isVisible: (env) => {
9223
- const sheetId = env.model.getters.getActiveSheetId();
9224
- const selectedCols = env.model.getters.getElementsFromSelection("COL");
9225
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
9226
- },
9248
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
9227
9249
  })
9228
9250
  .add("clear_column", {
9229
9251
  name: DELETE_CONTENT_COLUMNS_NAME,
@@ -9237,7 +9259,7 @@
9237
9259
  isVisible: (env) => {
9238
9260
  const sheetId = env.model.getters.getActiveSheetId();
9239
9261
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
9240
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
9262
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
9241
9263
  },
9242
9264
  separator: true,
9243
9265
  })
@@ -9311,11 +9333,7 @@
9311
9333
  name: REMOVE_ROWS_NAME,
9312
9334
  sequence: 70,
9313
9335
  action: REMOVE_ROWS_ACTION,
9314
- isVisible: (env) => {
9315
- const sheetId = env.model.getters.getActiveSheetId();
9316
- const selectedRows = env.model.getters.getElementsFromSelection("ROW");
9317
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
9318
- },
9336
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
9319
9337
  })
9320
9338
  .add("clear_row", {
9321
9339
  name: DELETE_CONTENT_ROWS_NAME,
@@ -9329,7 +9347,7 @@
9329
9347
  isVisible: (env) => {
9330
9348
  const sheetId = env.model.getters.getActiveSheetId();
9331
9349
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
9332
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
9350
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
9333
9351
  },
9334
9352
  separator: true,
9335
9353
  })
@@ -16175,11 +16193,13 @@
16175
16193
  name: REMOVE_ROWS_NAME,
16176
16194
  sequence: 80,
16177
16195
  action: REMOVE_ROWS_ACTION,
16196
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
16178
16197
  })
16179
16198
  .addChild("edit_delete_column", ["edit"], {
16180
16199
  name: REMOVE_COLUMNS_NAME,
16181
16200
  sequence: 90,
16182
16201
  action: REMOVE_COLUMNS_ACTION,
16202
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
16183
16203
  })
16184
16204
  .addChild("edit_delete_cell_shift_up", ["edit"], {
16185
16205
  name: _lt("Delete cell and shift up"),
@@ -17492,6 +17512,11 @@
17492
17512
  aggregated: ev.target.checked,
17493
17513
  });
17494
17514
  }
17515
+ onUpdateCumulative(ev) {
17516
+ this.props.updateChart(this.props.figureId, {
17517
+ cumulative: ev.target.checked,
17518
+ });
17519
+ }
17495
17520
  }
17496
17521
  LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
17497
17522
 
@@ -19031,34 +19056,25 @@
19031
19056
  };
19032
19057
 
19033
19058
  function startDnd(onMouseMove, onMouseUp, onMouseDown = () => { }) {
19034
- const _onMouseDown = (ev) => {
19035
- ev.preventDefault();
19036
- onMouseDown(ev);
19037
- };
19038
- const _onMouseMove = (ev) => {
19039
- ev.preventDefault();
19040
- onMouseMove(ev);
19041
- };
19042
19059
  const _onMouseUp = (ev) => {
19043
- ev.preventDefault();
19044
19060
  onMouseUp(ev);
19045
- window.removeEventListener("mousedown", _onMouseDown);
19061
+ window.removeEventListener("mousedown", onMouseDown);
19046
19062
  window.removeEventListener("mouseup", _onMouseUp);
19047
19063
  window.removeEventListener("dragstart", _onDragStart);
19048
- window.removeEventListener("mousemove", _onMouseMove);
19049
- window.removeEventListener("wheel", _onMouseMove);
19064
+ window.removeEventListener("mousemove", onMouseMove);
19065
+ window.removeEventListener("wheel", onMouseMove);
19050
19066
  };
19051
19067
  function _onDragStart(ev) {
19052
19068
  ev.preventDefault();
19053
19069
  }
19054
- window.addEventListener("mousedown", _onMouseDown);
19070
+ window.addEventListener("mousedown", onMouseDown);
19055
19071
  window.addEventListener("mouseup", _onMouseUp);
19056
19072
  window.addEventListener("dragstart", _onDragStart);
19057
- window.addEventListener("mousemove", _onMouseMove);
19073
+ window.addEventListener("mousemove", onMouseMove);
19058
19074
  // mouse wheel on window is by default a passive event.
19059
19075
  // preventDefault() is not allowed in passive event handler.
19060
19076
  // https://chromestatus.com/feature/6662647093133312
19061
- window.addEventListener("wheel", _onMouseMove, { passive: false });
19077
+ window.addEventListener("wheel", onMouseMove, { passive: false });
19062
19078
  }
19063
19079
  /**
19064
19080
  * Function to be used during a mousedown event, this function allows to
@@ -20860,9 +20876,11 @@
20860
20876
  }
20861
20877
  }
20862
20878
  function updateMousePosition(e) {
20863
- x = e.offsetX;
20864
- y = e.offsetY;
20865
- lastMoved = Date.now();
20879
+ if (gridRef.el === e.target) {
20880
+ x = e.offsetX;
20881
+ y = e.offsetY;
20882
+ lastMoved = Date.now();
20883
+ }
20866
20884
  }
20867
20885
  function recompute() {
20868
20886
  const { col, row } = getPosition();
@@ -22303,7 +22321,8 @@
22303
22321
  }
22304
22322
  let prevCol = col;
22305
22323
  let prevRow = row;
22306
- const onMouseMove = (col, row) => {
22324
+ const onMouseMove = (col, row, ev) => {
22325
+ ev.preventDefault();
22307
22326
  if ((col !== prevCol && col != -1) || (row !== prevRow && row != -1)) {
22308
22327
  prevCol = col === -1 ? prevCol : col;
22309
22328
  prevRow = row === -1 ? prevRow : row;
@@ -24974,6 +24993,7 @@
24974
24993
  legendPosition: chartData.legendPosition,
24975
24994
  stacked: chartData.stacked || false,
24976
24995
  aggregated: false,
24996
+ cumulative: chartData.cumulative || false,
24977
24997
  labelsAsText: false,
24978
24998
  };
24979
24999
  }
@@ -29628,7 +29648,7 @@
29628
29648
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
29629
29649
  return 27 /* CommandResult.InvalidSheetId */;
29630
29650
  }
29631
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29651
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29632
29652
  return 8 /* CommandResult.NotEnoughElements */;
29633
29653
  }
29634
29654
  return 0 /* CommandResult.Success */;
@@ -29678,9 +29698,9 @@
29678
29698
  }
29679
29699
  return;
29680
29700
  }
29681
- canRemoveHeaders(sheetId, dimension, elements) {
29701
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
29682
29702
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
29683
- return !includesAll(elements, visibleHeaders);
29703
+ return includesAll(elements, visibleHeaders);
29684
29704
  }
29685
29705
  isRowHiddenByUser(sheetId, index) {
29686
29706
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -29776,7 +29796,7 @@
29776
29796
  }
29777
29797
  }
29778
29798
  HeaderVisibilityPlugin.getters = [
29779
- "canRemoveHeaders",
29799
+ "checkElementsIncludeAllVisibleHeaders",
29780
29800
  "getHiddenColsGroups",
29781
29801
  "getHiddenRowsGroups",
29782
29802
  "isRowHiddenByUser",
@@ -30813,6 +30833,9 @@
30813
30833
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
30814
30834
  return 86 /* CommandResult.InvalidHeaderIndex */;
30815
30835
  }
30836
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
30837
+ return 8 /* CommandResult.NotEnoughElements */;
30838
+ }
30816
30839
  else {
30817
30840
  return 0 /* CommandResult.Success */;
30818
30841
  }
@@ -31099,6 +31122,20 @@
31099
31122
  }
31100
31123
  this.history.update("sheets", sheetId, "panes", panes);
31101
31124
  }
31125
+ /**
31126
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
31127
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
31128
+ */
31129
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
31130
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
31131
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
31132
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
31133
+ if (!startIndex) {
31134
+ return false;
31135
+ }
31136
+ const indicesToCheck = range(startIndex, endIndex);
31137
+ return includesAll(elements, indicesToCheck);
31138
+ }
31102
31139
  // ---------------------------------------------------------------------------
31103
31140
  // Row/Col manipulation
31104
31141
  // ---------------------------------------------------------------------------
@@ -31627,6 +31664,7 @@
31627
31664
  "getSheetSize",
31628
31665
  "getSheetZone",
31629
31666
  "getPaneDivisions",
31667
+ "checkElementsIncludeAllNonFrozenHeaders",
31630
31668
  ];
31631
31669
 
31632
31670
  /**
@@ -32193,6 +32231,7 @@
32193
32231
  // stores the computed styles in the format of computedStyles.sheetName[col][row] = Style
32194
32232
  this.computedStyles = {};
32195
32233
  this.computedIcons = {};
32234
+ this.uuidGenerator = new UuidGenerator();
32196
32235
  /**
32197
32236
  * Execute the predicate to know if a conditional formatting rule should be applied to a cell
32198
32237
  */
@@ -32545,13 +32584,20 @@
32545
32584
  this.adaptRules(origin.sheetId, cf, [xc], toRemoveRange);
32546
32585
  }
32547
32586
  else {
32548
- this.adaptRules(target.sheetId, cf, [xc], []);
32549
32587
  this.adaptRules(origin.sheetId, cf, [], toRemoveRange);
32588
+ const cfToCopyTo = this.getCFToCopyTo(target.sheetId, cf);
32589
+ this.adaptRules(target.sheetId, cfToCopyTo, [xc], []);
32550
32590
  }
32551
32591
  }
32552
32592
  }
32553
32593
  }
32554
32594
  }
32595
+ getCFToCopyTo(targetSheetId, originCF) {
32596
+ const cfInTarget = this.getters
32597
+ .getConditionalFormats(targetSheetId)
32598
+ .find((cf) => cf.stopIfTrue === originCF.stopIfTrue && deepEquals(cf.rule, originCF.rule));
32599
+ return cfInTarget ? cfInTarget : { ...originCF, id: this.uuidGenerator.uuidv4(), ranges: [] };
32600
+ }
32555
32601
  }
32556
32602
  EvaluationConditionalFormatPlugin.getters = ["getConditionalIcon", "getCellComputedStyle"];
32557
32603
 
@@ -33073,6 +33119,9 @@
33073
33119
  const sheetId = this.sheetId;
33074
33120
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
33075
33121
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
33122
+ if (this.left === -1) {
33123
+ this.left = this.boundaries.left;
33124
+ }
33076
33125
  if (this.right === -1) {
33077
33126
  this.right = this.getters.getNumberCols(sheetId) - 1;
33078
33127
  }
@@ -33086,6 +33135,9 @@
33086
33135
  const sheetId = this.sheetId;
33087
33136
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
33088
33137
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
33138
+ if (this.top === -1) {
33139
+ this.top = this.boundaries.top;
33140
+ }
33089
33141
  if (this.bottom === -1) {
33090
33142
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
33091
33143
  }
@@ -38007,7 +38059,7 @@
38007
38059
  allowDispatch(cmd) {
38008
38060
  switch (cmd.type) {
38009
38061
  case "CUT":
38010
- const zones = cmd.target || this.getters.getSelectedZones();
38062
+ const zones = this.getters.getSelectedZones();
38011
38063
  const state = this.getClipboardState(zones, cmd.type);
38012
38064
  return state.isCutAllowed(zones);
38013
38065
  case "PASTE":
@@ -38038,7 +38090,7 @@
38038
38090
  switch (cmd.type) {
38039
38091
  case "COPY":
38040
38092
  case "CUT":
38041
- const zones = ("target" in cmd && cmd.target) || this.getters.getSelectedZones();
38093
+ const zones = this.getters.getSelectedZones();
38042
38094
  this.state = this.getClipboardState(zones, cmd.type);
38043
38095
  this.status = "visible";
38044
38096
  break;
@@ -39418,26 +39470,24 @@
39418
39470
  const isBasedBefore = cmd.base < start;
39419
39471
  const deltaCol = isBasedBefore && isCol ? thickness : 0;
39420
39472
  const deltaRow = isBasedBefore && !isCol ? thickness : 0;
39421
- this.dispatch("CUT", {
39422
- target: [
39423
- {
39424
- left: isCol ? start + deltaCol : 0,
39425
- right: isCol ? end + deltaCol : this.getters.getNumberCols(cmd.sheetId) - 1,
39426
- top: !isCol ? start + deltaRow : 0,
39427
- bottom: !isCol ? end + deltaRow : this.getters.getNumberRows(cmd.sheetId) - 1,
39428
- },
39429
- ],
39430
- });
39431
- this.dispatch("PASTE", {
39432
- target: [
39433
- {
39434
- left: isCol ? cmd.base : 0,
39435
- right: isCol ? cmd.base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
39436
- top: !isCol ? cmd.base : 0,
39437
- bottom: !isCol ? cmd.base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
39438
- },
39439
- ],
39440
- });
39473
+ const target = [
39474
+ {
39475
+ left: isCol ? start + deltaCol : 0,
39476
+ right: isCol ? end + deltaCol : this.getters.getNumberCols(cmd.sheetId) - 1,
39477
+ top: !isCol ? start + deltaRow : 0,
39478
+ bottom: !isCol ? end + deltaRow : this.getters.getNumberRows(cmd.sheetId) - 1,
39479
+ },
39480
+ ];
39481
+ const state = new ClipboardCellsState(target, "CUT", this.getters, this.dispatch, this.selection);
39482
+ const pasteTarget = [
39483
+ {
39484
+ left: isCol ? cmd.base : 0,
39485
+ right: isCol ? cmd.base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
39486
+ top: !isCol ? cmd.base : 0,
39487
+ bottom: !isCol ? cmd.base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
39488
+ },
39489
+ ];
39490
+ state.paste(pasteTarget, { selectTarget: true });
39441
39491
  const toRemove = isBasedBefore ? cmd.elements.map((el) => el + thickness) : cmd.elements;
39442
39492
  let currentIndex = cmd.base;
39443
39493
  for (const element of toRemove) {
@@ -45407,9 +45457,9 @@
45407
45457
  Object.defineProperty(exports, '__esModule', { value: true });
45408
45458
 
45409
45459
 
45410
- __info__.version = '16.2.13';
45411
- __info__.date = '2023-08-09T09:09:10.050Z';
45412
- __info__.hash = '5620a2e';
45460
+ __info__.version = '16.2.16';
45461
+ __info__.date = '2023-09-21T15:56:53.639Z';
45462
+ __info__.hash = '1a70819';
45413
45463
 
45414
45464
 
45415
45465
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);