@odoo/o-spreadsheet 16.2.14 → 16.2.17

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 {
@@ -4861,6 +4866,9 @@
4861
4866
  });
4862
4867
  this.state.values = this.getFilterValues(this.props.filterPosition);
4863
4868
  }
4869
+ get isReadonly() {
4870
+ return this.env.model.getters.isReadonly();
4871
+ }
4864
4872
  getFilterValues(position) {
4865
4873
  const sheetId = this.env.model.getters.getActiveSheetId();
4866
4874
  const filter = this.env.model.getters.getFilter({ sheetId, ...position });
@@ -7242,6 +7250,7 @@
7242
7250
  this.labelsAsText = definition.labelsAsText;
7243
7251
  this.stacked = definition.stacked;
7244
7252
  this.aggregated = definition.aggregated;
7253
+ this.cumulative = definition.cumulative;
7245
7254
  }
7246
7255
  static validateChartDefinition(validator, definition) {
7247
7256
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -7262,6 +7271,7 @@
7262
7271
  labelRange: context.auxiliaryRange || undefined,
7263
7272
  stacked: false,
7264
7273
  aggregated: false,
7274
+ cumulative: false,
7265
7275
  };
7266
7276
  }
7267
7277
  getDefinition() {
@@ -7282,6 +7292,7 @@
7282
7292
  labelsAsText: this.labelsAsText,
7283
7293
  stacked: this.stacked,
7284
7294
  aggregated: this.aggregated,
7295
+ cumulative: this.cumulative,
7285
7296
  };
7286
7297
  }
7287
7298
  getContextCreation() {
@@ -7485,6 +7496,16 @@
7485
7496
  if (chart.stacked) {
7486
7497
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
7487
7498
  }
7499
+ if (chart.cumulative) {
7500
+ let accumulator = 0;
7501
+ data = data.map((value) => {
7502
+ if (!isNaN(value)) {
7503
+ accumulator += parseFloat(value);
7504
+ return accumulator;
7505
+ }
7506
+ return value;
7507
+ });
7508
+ }
7488
7509
  const backgroundColor = rgbaToHex(backgroundRGBA);
7489
7510
  const dataset = {
7490
7511
  label,
@@ -8267,6 +8288,7 @@
8267
8288
  labelsAsText: false,
8268
8289
  stacked: false,
8269
8290
  aggregated: false,
8291
+ cumulative: false,
8270
8292
  labelRange: labelRangeXc,
8271
8293
  type: "line",
8272
8294
  dataSetsHaveTitle,
@@ -8629,6 +8651,13 @@
8629
8651
  elements: rows,
8630
8652
  });
8631
8653
  };
8654
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
8655
+ const sheetId = env.model.getters.getActiveSheetId();
8656
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
8657
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
8658
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
8659
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
8660
+ };
8632
8661
  const REMOVE_COLUMNS_NAME = (env) => {
8633
8662
  if (env.model.getters.getSelectedZones().length > 1) {
8634
8663
  return _lt("Delete columns");
@@ -9219,11 +9248,7 @@
9219
9248
  name: REMOVE_COLUMNS_NAME,
9220
9249
  sequence: 90,
9221
9250
  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
- },
9251
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
9227
9252
  })
9228
9253
  .add("clear_column", {
9229
9254
  name: DELETE_CONTENT_COLUMNS_NAME,
@@ -9237,7 +9262,7 @@
9237
9262
  isVisible: (env) => {
9238
9263
  const sheetId = env.model.getters.getActiveSheetId();
9239
9264
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
9240
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
9265
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
9241
9266
  },
9242
9267
  separator: true,
9243
9268
  })
@@ -9311,11 +9336,7 @@
9311
9336
  name: REMOVE_ROWS_NAME,
9312
9337
  sequence: 70,
9313
9338
  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
- },
9339
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
9319
9340
  })
9320
9341
  .add("clear_row", {
9321
9342
  name: DELETE_CONTENT_ROWS_NAME,
@@ -9329,7 +9350,7 @@
9329
9350
  isVisible: (env) => {
9330
9351
  const sheetId = env.model.getters.getActiveSheetId();
9331
9352
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
9332
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
9353
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
9333
9354
  },
9334
9355
  separator: true,
9335
9356
  })
@@ -16175,11 +16196,13 @@
16175
16196
  name: REMOVE_ROWS_NAME,
16176
16197
  sequence: 80,
16177
16198
  action: REMOVE_ROWS_ACTION,
16199
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
16178
16200
  })
16179
16201
  .addChild("edit_delete_column", ["edit"], {
16180
16202
  name: REMOVE_COLUMNS_NAME,
16181
16203
  sequence: 90,
16182
16204
  action: REMOVE_COLUMNS_ACTION,
16205
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
16183
16206
  })
16184
16207
  .addChild("edit_delete_cell_shift_up", ["edit"], {
16185
16208
  name: _lt("Delete cell and shift up"),
@@ -17492,6 +17515,11 @@
17492
17515
  aggregated: ev.target.checked,
17493
17516
  });
17494
17517
  }
17518
+ onUpdateCumulative(ev) {
17519
+ this.props.updateChart(this.props.figureId, {
17520
+ cumulative: ev.target.checked,
17521
+ });
17522
+ }
17495
17523
  }
17496
17524
  LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
17497
17525
 
@@ -18681,9 +18709,9 @@
18681
18709
  }
18682
18710
  setup() {
18683
18711
  this.showFormulaState = this.env.model.getters.shouldShowFormulas();
18684
- this.debouncedUpdateSearch = debounce(this.updateSearch.bind(this), 200);
18685
18712
  owl.onMounted(() => this.focusInput());
18686
18713
  owl.onWillUnmount(() => {
18714
+ clearTimeout(this.debounceTimeoutId);
18687
18715
  this.env.model.dispatch("CLEAR_SEARCH");
18688
18716
  this.env.model.dispatch("SET_FORMULA_VISIBILITY", { show: this.showFormulaState });
18689
18717
  });
@@ -18728,6 +18756,13 @@
18728
18756
  searchOptions: this.state.searchOptions,
18729
18757
  });
18730
18758
  }
18759
+ debouncedUpdateSearch() {
18760
+ clearTimeout(this.debounceTimeoutId);
18761
+ this.debounceTimeoutId = setTimeout(() => {
18762
+ this.updateSearch();
18763
+ this.debounceTimeoutId = undefined;
18764
+ }, 200);
18765
+ }
18731
18766
  replace() {
18732
18767
  this.env.model.dispatch("REPLACE_SEARCH", {
18733
18768
  replaceWith: this.state.replaceWith,
@@ -20851,9 +20886,11 @@
20851
20886
  }
20852
20887
  }
20853
20888
  function updateMousePosition(e) {
20854
- x = e.offsetX;
20855
- y = e.offsetY;
20856
- lastMoved = Date.now();
20889
+ if (gridRef.el === e.target) {
20890
+ x = e.offsetX;
20891
+ y = e.offsetY;
20892
+ lastMoved = Date.now();
20893
+ }
20857
20894
  }
20858
20895
  function recompute() {
20859
20896
  const { col, row } = getPosition();
@@ -24966,6 +25003,7 @@
24966
25003
  legendPosition: chartData.legendPosition,
24967
25004
  stacked: chartData.stacked || false,
24968
25005
  aggregated: false,
25006
+ cumulative: chartData.cumulative || false,
24969
25007
  labelsAsText: false,
24970
25008
  };
24971
25009
  }
@@ -29404,7 +29442,11 @@
29404
29442
  let sizes = [...this.sizes[cmd.sheetId][cmd.dimension]];
29405
29443
  const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
29406
29444
  const baseSize = sizes[cmd.base];
29407
- sizes.splice(addIndex, 0, ...Array(cmd.quantity).fill(baseSize));
29445
+ const sizesToInsert = range(0, cmd.quantity).map(() => ({
29446
+ manualSize: baseSize.manualSize,
29447
+ computedSize: lazy(baseSize.computedSize()),
29448
+ }));
29449
+ sizes.splice(addIndex, 0, ...sizesToInsert);
29408
29450
  sizes = sizes.map((size, row) => {
29409
29451
  if (cmd.dimension === "ROW" && row > cmd.base + cmd.quantity) {
29410
29452
  // invalidate sizes
@@ -29620,7 +29662,7 @@
29620
29662
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
29621
29663
  return 27 /* CommandResult.InvalidSheetId */;
29622
29664
  }
29623
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29665
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29624
29666
  return 8 /* CommandResult.NotEnoughElements */;
29625
29667
  }
29626
29668
  return 0 /* CommandResult.Success */;
@@ -29670,9 +29712,9 @@
29670
29712
  }
29671
29713
  return;
29672
29714
  }
29673
- canRemoveHeaders(sheetId, dimension, elements) {
29715
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
29674
29716
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
29675
- return !includesAll(elements, visibleHeaders);
29717
+ return includesAll(elements, visibleHeaders);
29676
29718
  }
29677
29719
  isRowHiddenByUser(sheetId, index) {
29678
29720
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -29768,7 +29810,7 @@
29768
29810
  }
29769
29811
  }
29770
29812
  HeaderVisibilityPlugin.getters = [
29771
- "canRemoveHeaders",
29813
+ "checkElementsIncludeAllVisibleHeaders",
29772
29814
  "getHiddenColsGroups",
29773
29815
  "getHiddenRowsGroups",
29774
29816
  "isRowHiddenByUser",
@@ -30805,6 +30847,9 @@
30805
30847
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
30806
30848
  return 86 /* CommandResult.InvalidHeaderIndex */;
30807
30849
  }
30850
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
30851
+ return 8 /* CommandResult.NotEnoughElements */;
30852
+ }
30808
30853
  else {
30809
30854
  return 0 /* CommandResult.Success */;
30810
30855
  }
@@ -31091,6 +31136,20 @@
31091
31136
  }
31092
31137
  this.history.update("sheets", sheetId, "panes", panes);
31093
31138
  }
31139
+ /**
31140
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
31141
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
31142
+ */
31143
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
31144
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
31145
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
31146
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
31147
+ if (!startIndex) {
31148
+ return false;
31149
+ }
31150
+ const indicesToCheck = range(startIndex, endIndex);
31151
+ return includesAll(elements, indicesToCheck);
31152
+ }
31094
31153
  // ---------------------------------------------------------------------------
31095
31154
  // Row/Col manipulation
31096
31155
  // ---------------------------------------------------------------------------
@@ -31619,6 +31678,7 @@
31619
31678
  "getSheetSize",
31620
31679
  "getSheetZone",
31621
31680
  "getPaneDivisions",
31681
+ "checkElementsIncludeAllNonFrozenHeaders",
31622
31682
  ];
31623
31683
 
31624
31684
  /**
@@ -32185,6 +32245,7 @@
32185
32245
  // stores the computed styles in the format of computedStyles.sheetName[col][row] = Style
32186
32246
  this.computedStyles = {};
32187
32247
  this.computedIcons = {};
32248
+ this.uuidGenerator = new UuidGenerator();
32188
32249
  /**
32189
32250
  * Execute the predicate to know if a conditional formatting rule should be applied to a cell
32190
32251
  */
@@ -32537,13 +32598,20 @@
32537
32598
  this.adaptRules(origin.sheetId, cf, [xc], toRemoveRange);
32538
32599
  }
32539
32600
  else {
32540
- this.adaptRules(target.sheetId, cf, [xc], []);
32541
32601
  this.adaptRules(origin.sheetId, cf, [], toRemoveRange);
32602
+ const cfToCopyTo = this.getCFToCopyTo(target.sheetId, cf);
32603
+ this.adaptRules(target.sheetId, cfToCopyTo, [xc], []);
32542
32604
  }
32543
32605
  }
32544
32606
  }
32545
32607
  }
32546
32608
  }
32609
+ getCFToCopyTo(targetSheetId, originCF) {
32610
+ const cfInTarget = this.getters
32611
+ .getConditionalFormats(targetSheetId)
32612
+ .find((cf) => cf.stopIfTrue === originCF.stopIfTrue && deepEquals(cf.rule, originCF.rule));
32613
+ return cfInTarget ? cfInTarget : { ...originCF, id: this.uuidGenerator.uuidv4(), ranges: [] };
32614
+ }
32547
32615
  }
32548
32616
  EvaluationConditionalFormatPlugin.getters = ["getConditionalIcon", "getCellComputedStyle"];
32549
32617
 
@@ -32891,30 +32959,26 @@
32891
32959
  const { end } = this.getters.getColDimensions(sheetId, targetCol);
32892
32960
  const maxCol = this.getters.getNumberCols(sheetId);
32893
32961
  if (this.offsetX + this.offsetCorrectionX + this.viewportWidth < end) {
32894
- for (let col = this.left; this.offsetX + this.offsetCorrectionX + this.viewportWidth < end; col++) {
32895
- if (col > maxCol) {
32896
- break;
32897
- }
32898
- if (this.getters.isColHidden(sheetId, col)) {
32899
- continue;
32900
- }
32901
- this.offsetX = this.getters.getColDimensions(sheetId, col).end - this.offsetCorrectionX;
32902
- this.offsetScrollbarX = this.offsetX;
32903
- this.adjustViewportZoneX();
32962
+ let finalTarget = targetCol;
32963
+ while (this.getters.isColHidden(sheetId, finalTarget) && targetCol < maxCol) {
32964
+ finalTarget++;
32904
32965
  }
32966
+ const finalTargetEnd = this.getters.getColDimensions(sheetId, finalTarget).end;
32967
+ const startIndex = this.searchHeaderIndex("COL", finalTargetEnd - this.viewportWidth - this.offsetCorrectionX, this.boundaries.left, true);
32968
+ this.offsetX =
32969
+ this.getters.getColDimensions(sheetId, startIndex).end - this.offsetCorrectionX;
32970
+ this.offsetScrollbarX = this.offsetX;
32971
+ this.adjustViewportZoneX();
32905
32972
  }
32906
32973
  else if (this.left > targetCol) {
32907
- for (let col = this.left; col >= targetCol; col--) {
32908
- if (col < 0) {
32909
- break;
32910
- }
32911
- if (this.getters.isColHidden(sheetId, col)) {
32912
- continue;
32913
- }
32914
- this.offsetX = this.getters.getColDimensions(sheetId, col).start - this.offsetCorrectionX;
32915
- this.offsetScrollbarX = this.offsetX;
32916
- this.adjustViewportZoneX();
32974
+ let finalTarget = targetCol;
32975
+ while (this.getters.isColHidden(sheetId, finalTarget) && targetCol > 0) {
32976
+ finalTarget--;
32917
32977
  }
32978
+ this.offsetX =
32979
+ this.getters.getColDimensions(sheetId, finalTarget).start - this.offsetCorrectionX;
32980
+ this.offsetScrollbarX = this.offsetX;
32981
+ this.adjustViewportZoneX();
32918
32982
  }
32919
32983
  }
32920
32984
  adjustPositionY(targetRow) {
@@ -32922,30 +32986,26 @@
32922
32986
  const { end } = this.getters.getRowDimensions(sheetId, targetRow);
32923
32987
  const maxRow = this.getters.getNumberRows(sheetId);
32924
32988
  if (this.offsetY + this.viewportHeight + this.offsetCorrectionY < end) {
32925
- for (let row = this.top; this.offsetY + this.viewportHeight + this.offsetCorrectionY < end; row++) {
32926
- if (row > maxRow) {
32927
- break;
32928
- }
32929
- if (this.getters.isRowHidden(sheetId, row)) {
32930
- continue;
32931
- }
32932
- this.offsetY = this.getters.getRowDimensions(sheetId, row).end - this.offsetCorrectionY;
32933
- this.offsetScrollbarY = this.offsetY;
32934
- this.adjustViewportZoneY();
32989
+ let finalTarget = targetRow;
32990
+ while (this.getters.isRowHidden(sheetId, finalTarget) && targetRow < maxRow) {
32991
+ finalTarget++;
32935
32992
  }
32993
+ const finalTargetEnd = this.getters.getRowDimensions(sheetId, finalTarget).end;
32994
+ const startIndex = this.searchHeaderIndex("ROW", finalTargetEnd - this.viewportHeight - this.offsetCorrectionY, this.boundaries.top, true);
32995
+ this.offsetY =
32996
+ this.getters.getRowDimensions(sheetId, startIndex).end - this.offsetCorrectionY;
32997
+ this.offsetScrollbarY = this.offsetY;
32998
+ this.adjustViewportZoneY();
32936
32999
  }
32937
33000
  else if (this.top > targetRow) {
32938
- for (let row = this.top; row >= targetRow; row--) {
32939
- if (row < 0) {
32940
- break;
32941
- }
32942
- if (this.getters.isRowHidden(sheetId, row)) {
32943
- continue;
32944
- }
32945
- this.offsetY = this.getters.getRowDimensions(sheetId, row).start - this.offsetCorrectionY;
32946
- this.offsetScrollbarY = this.offsetY;
32947
- this.adjustViewportZoneY();
33001
+ let finalTarget = targetRow;
33002
+ while (this.getters.isRowHidden(sheetId, finalTarget) && targetRow > 0) {
33003
+ finalTarget--;
32948
33004
  }
33005
+ this.offsetY =
33006
+ this.getters.getRowDimensions(sheetId, finalTarget).start - this.offsetCorrectionY;
33007
+ this.offsetScrollbarY = this.offsetY;
33008
+ this.adjustViewportZoneY();
32949
33009
  }
32950
33010
  }
32951
33011
  setViewportOffset(offsetX, offsetY) {
@@ -33065,6 +33125,9 @@
33065
33125
  const sheetId = this.sheetId;
33066
33126
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
33067
33127
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
33128
+ if (this.left === -1) {
33129
+ this.left = this.boundaries.left;
33130
+ }
33068
33131
  if (this.right === -1) {
33069
33132
  this.right = this.getters.getNumberCols(sheetId) - 1;
33070
33133
  }
@@ -33078,6 +33141,9 @@
33078
33141
  const sheetId = this.sheetId;
33079
33142
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
33080
33143
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
33144
+ if (this.top === -1) {
33145
+ this.top = this.boundaries.top;
33146
+ }
33081
33147
  if (this.bottom === -1) {
33082
33148
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
33083
33149
  }
@@ -34514,14 +34580,10 @@
34514
34580
  case "REPLACE_ALL_SEARCH":
34515
34581
  this.replaceAll(cmd.replaceWith);
34516
34582
  break;
34517
- case "EVALUATE_CELLS":
34518
- case "UPDATE_CELL":
34519
- case "REMOVE_FILTER_TABLE":
34520
- case "UPDATE_FILTER":
34521
- this.isSearchDirty = true;
34522
- break;
34523
34583
  case "UNDO":
34524
34584
  case "REDO":
34585
+ case "REMOVE_FILTER_TABLE":
34586
+ case "UPDATE_FILTER":
34525
34587
  case "REMOVE_COLUMNS_ROWS":
34526
34588
  case "HIDE_COLUMNS_ROWS":
34527
34589
  case "UNHIDE_COLUMNS_ROWS":
@@ -37521,7 +37583,7 @@
37521
37583
  });
37522
37584
  for (const filterTable of this.copiedTables) {
37523
37585
  this.dispatch("REMOVE_FILTER_TABLE", {
37524
- sheetId: this.getters.getActiveSheetId(),
37586
+ sheetId: this.sheetId,
37525
37587
  target: [filterTable.zone],
37526
37588
  });
37527
37589
  }
@@ -37999,7 +38061,7 @@
37999
38061
  allowDispatch(cmd) {
38000
38062
  switch (cmd.type) {
38001
38063
  case "CUT":
38002
- const zones = cmd.target || this.getters.getSelectedZones();
38064
+ const zones = this.getters.getSelectedZones();
38003
38065
  const state = this.getClipboardState(zones, cmd.type);
38004
38066
  return state.isCutAllowed(zones);
38005
38067
  case "PASTE":
@@ -38030,7 +38092,7 @@
38030
38092
  switch (cmd.type) {
38031
38093
  case "COPY":
38032
38094
  case "CUT":
38033
- const zones = ("target" in cmd && cmd.target) || this.getters.getSelectedZones();
38095
+ const zones = this.getters.getSelectedZones();
38034
38096
  this.state = this.getClipboardState(zones, cmd.type);
38035
38097
  this.status = "visible";
38036
38098
  break;
@@ -39410,26 +39472,24 @@
39410
39472
  const isBasedBefore = cmd.base < start;
39411
39473
  const deltaCol = isBasedBefore && isCol ? thickness : 0;
39412
39474
  const deltaRow = isBasedBefore && !isCol ? thickness : 0;
39413
- this.dispatch("CUT", {
39414
- target: [
39415
- {
39416
- left: isCol ? start + deltaCol : 0,
39417
- right: isCol ? end + deltaCol : this.getters.getNumberCols(cmd.sheetId) - 1,
39418
- top: !isCol ? start + deltaRow : 0,
39419
- bottom: !isCol ? end + deltaRow : this.getters.getNumberRows(cmd.sheetId) - 1,
39420
- },
39421
- ],
39422
- });
39423
- this.dispatch("PASTE", {
39424
- target: [
39425
- {
39426
- left: isCol ? cmd.base : 0,
39427
- right: isCol ? cmd.base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
39428
- top: !isCol ? cmd.base : 0,
39429
- bottom: !isCol ? cmd.base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
39430
- },
39431
- ],
39432
- });
39475
+ const target = [
39476
+ {
39477
+ left: isCol ? start + deltaCol : 0,
39478
+ right: isCol ? end + deltaCol : this.getters.getNumberCols(cmd.sheetId) - 1,
39479
+ top: !isCol ? start + deltaRow : 0,
39480
+ bottom: !isCol ? end + deltaRow : this.getters.getNumberRows(cmd.sheetId) - 1,
39481
+ },
39482
+ ];
39483
+ const state = new ClipboardCellsState(target, "CUT", this.getters, this.dispatch, this.selection);
39484
+ const pasteTarget = [
39485
+ {
39486
+ left: isCol ? cmd.base : 0,
39487
+ right: isCol ? cmd.base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
39488
+ top: !isCol ? cmd.base : 0,
39489
+ bottom: !isCol ? cmd.base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
39490
+ },
39491
+ ];
39492
+ state.paste(pasteTarget, { selectTarget: true });
39433
39493
  const toRemove = isBasedBefore ? cmd.elements.map((el) => el + thickness) : cmd.elements;
39434
39494
  let currentIndex = cmd.base;
39435
39495
  for (const element of toRemove) {
@@ -45399,9 +45459,9 @@
45399
45459
  Object.defineProperty(exports, '__esModule', { value: true });
45400
45460
 
45401
45461
 
45402
- __info__.version = '16.2.14';
45403
- __info__.date = '2023-08-29T13:54:14.962Z';
45404
- __info__.hash = 'ad037b1';
45462
+ __info__.version = '16.2.17';
45463
+ __info__.date = '2023-10-03T12:42:54.642Z';
45464
+ __info__.hash = '146867a';
45405
45465
 
45406
45466
 
45407
45467
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);