@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.
@@ -987,13 +987,17 @@ function getAddHeaderStartIndex(position, base) {
987
987
  return position === "after" ? base + 1 : base;
988
988
  }
989
989
  /**
990
- * Compare two objects.
990
+ * Compares two objects.
991
991
  */
992
992
  function deepEquals(o1, o2) {
993
993
  if (o1 === o2)
994
994
  return true;
995
995
  if ((o1 && !o2) || (o2 && !o1))
996
996
  return false;
997
+ if (typeof o1 !== typeof o2)
998
+ return false;
999
+ if (typeof o1 !== "object")
1000
+ return o1 === o2;
997
1001
  // Objects can have different keys if the values are undefined
998
1002
  const keys = new Set();
999
1003
  Object.keys(o1).forEach((key) => keys.add(key));
@@ -4679,6 +4683,7 @@ css /* scss */ `
4679
4683
  padding: 10px;
4680
4684
  width: ${ERROR_TOOLTIP_WIDTH}px;
4681
4685
  box-sizing: border-box !important;
4686
+ overflow-wrap: break-word;
4682
4687
  }
4683
4688
  `;
4684
4689
  class ErrorToolTip extends Component {
@@ -4860,6 +4865,9 @@ class FilterMenu extends Component {
4860
4865
  });
4861
4866
  this.state.values = this.getFilterValues(this.props.filterPosition);
4862
4867
  }
4868
+ get isReadonly() {
4869
+ return this.env.model.getters.isReadonly();
4870
+ }
4863
4871
  getFilterValues(position) {
4864
4872
  const sheetId = this.env.model.getters.getActiveSheetId();
4865
4873
  const filter = this.env.model.getters.getFilter({ sheetId, ...position });
@@ -7241,6 +7249,7 @@ class LineChart extends AbstractChart {
7241
7249
  this.labelsAsText = definition.labelsAsText;
7242
7250
  this.stacked = definition.stacked;
7243
7251
  this.aggregated = definition.aggregated;
7252
+ this.cumulative = definition.cumulative;
7244
7253
  }
7245
7254
  static validateChartDefinition(validator, definition) {
7246
7255
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -7261,6 +7270,7 @@ class LineChart extends AbstractChart {
7261
7270
  labelRange: context.auxiliaryRange || undefined,
7262
7271
  stacked: false,
7263
7272
  aggregated: false,
7273
+ cumulative: false,
7264
7274
  };
7265
7275
  }
7266
7276
  getDefinition() {
@@ -7281,6 +7291,7 @@ class LineChart extends AbstractChart {
7281
7291
  labelsAsText: this.labelsAsText,
7282
7292
  stacked: this.stacked,
7283
7293
  aggregated: this.aggregated,
7294
+ cumulative: this.cumulative,
7284
7295
  };
7285
7296
  }
7286
7297
  getContextCreation() {
@@ -7484,6 +7495,16 @@ function createLineChartRuntime(chart, getters) {
7484
7495
  if (chart.stacked) {
7485
7496
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
7486
7497
  }
7498
+ if (chart.cumulative) {
7499
+ let accumulator = 0;
7500
+ data = data.map((value) => {
7501
+ if (!isNaN(value)) {
7502
+ accumulator += parseFloat(value);
7503
+ return accumulator;
7504
+ }
7505
+ return value;
7506
+ });
7507
+ }
7487
7508
  const backgroundColor = rgbaToHex(backgroundRGBA);
7488
7509
  const dataset = {
7489
7510
  label,
@@ -8266,6 +8287,7 @@ function getSmartChartDefinition(zone, getters) {
8266
8287
  labelsAsText: false,
8267
8288
  stacked: false,
8268
8289
  aggregated: false,
8290
+ cumulative: false,
8269
8291
  labelRange: labelRangeXc,
8270
8292
  type: "line",
8271
8293
  dataSetsHaveTitle,
@@ -8628,6 +8650,13 @@ const REMOVE_ROWS_ACTION = (env) => {
8628
8650
  elements: rows,
8629
8651
  });
8630
8652
  };
8653
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
8654
+ const sheetId = env.model.getters.getActiveSheetId();
8655
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
8656
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
8657
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
8658
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
8659
+ };
8631
8660
  const REMOVE_COLUMNS_NAME = (env) => {
8632
8661
  if (env.model.getters.getSelectedZones().length > 1) {
8633
8662
  return _lt("Delete columns");
@@ -9218,11 +9247,7 @@ colMenuRegistry
9218
9247
  name: REMOVE_COLUMNS_NAME,
9219
9248
  sequence: 90,
9220
9249
  action: REMOVE_COLUMNS_ACTION,
9221
- isVisible: (env) => {
9222
- const sheetId = env.model.getters.getActiveSheetId();
9223
- const selectedCols = env.model.getters.getElementsFromSelection("COL");
9224
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
9225
- },
9250
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
9226
9251
  })
9227
9252
  .add("clear_column", {
9228
9253
  name: DELETE_CONTENT_COLUMNS_NAME,
@@ -9236,7 +9261,7 @@ colMenuRegistry
9236
9261
  isVisible: (env) => {
9237
9262
  const sheetId = env.model.getters.getActiveSheetId();
9238
9263
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
9239
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
9264
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
9240
9265
  },
9241
9266
  separator: true,
9242
9267
  })
@@ -9310,11 +9335,7 @@ rowMenuRegistry
9310
9335
  name: REMOVE_ROWS_NAME,
9311
9336
  sequence: 70,
9312
9337
  action: REMOVE_ROWS_ACTION,
9313
- isVisible: (env) => {
9314
- const sheetId = env.model.getters.getActiveSheetId();
9315
- const selectedRows = env.model.getters.getElementsFromSelection("ROW");
9316
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
9317
- },
9338
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
9318
9339
  })
9319
9340
  .add("clear_row", {
9320
9341
  name: DELETE_CONTENT_ROWS_NAME,
@@ -9328,7 +9349,7 @@ rowMenuRegistry
9328
9349
  isVisible: (env) => {
9329
9350
  const sheetId = env.model.getters.getActiveSheetId();
9330
9351
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
9331
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
9352
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
9332
9353
  },
9333
9354
  separator: true,
9334
9355
  })
@@ -16174,11 +16195,13 @@ topbarMenuRegistry
16174
16195
  name: REMOVE_ROWS_NAME,
16175
16196
  sequence: 80,
16176
16197
  action: REMOVE_ROWS_ACTION,
16198
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
16177
16199
  })
16178
16200
  .addChild("edit_delete_column", ["edit"], {
16179
16201
  name: REMOVE_COLUMNS_NAME,
16180
16202
  sequence: 90,
16181
16203
  action: REMOVE_COLUMNS_ACTION,
16204
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
16182
16205
  })
16183
16206
  .addChild("edit_delete_cell_shift_up", ["edit"], {
16184
16207
  name: _lt("Delete cell and shift up"),
@@ -17491,6 +17514,11 @@ class LineConfigPanel extends LineBarPieConfigPanel {
17491
17514
  aggregated: ev.target.checked,
17492
17515
  });
17493
17516
  }
17517
+ onUpdateCumulative(ev) {
17518
+ this.props.updateChart(this.props.figureId, {
17519
+ cumulative: ev.target.checked,
17520
+ });
17521
+ }
17494
17522
  }
17495
17523
  LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
17496
17524
 
@@ -18680,9 +18708,9 @@ class FindAndReplacePanel extends Component {
18680
18708
  }
18681
18709
  setup() {
18682
18710
  this.showFormulaState = this.env.model.getters.shouldShowFormulas();
18683
- this.debouncedUpdateSearch = debounce(this.updateSearch.bind(this), 200);
18684
18711
  onMounted(() => this.focusInput());
18685
18712
  onWillUnmount(() => {
18713
+ clearTimeout(this.debounceTimeoutId);
18686
18714
  this.env.model.dispatch("CLEAR_SEARCH");
18687
18715
  this.env.model.dispatch("SET_FORMULA_VISIBILITY", { show: this.showFormulaState });
18688
18716
  });
@@ -18727,6 +18755,13 @@ class FindAndReplacePanel extends Component {
18727
18755
  searchOptions: this.state.searchOptions,
18728
18756
  });
18729
18757
  }
18758
+ debouncedUpdateSearch() {
18759
+ clearTimeout(this.debounceTimeoutId);
18760
+ this.debounceTimeoutId = setTimeout(() => {
18761
+ this.updateSearch();
18762
+ this.debounceTimeoutId = undefined;
18763
+ }, 200);
18764
+ }
18730
18765
  replace() {
18731
18766
  this.env.model.dispatch("REPLACE_SEARCH", {
18732
18767
  replaceWith: this.state.replaceWith,
@@ -20850,9 +20885,11 @@ function useCellHovered(env, gridRef, callback) {
20850
20885
  }
20851
20886
  }
20852
20887
  function updateMousePosition(e) {
20853
- x = e.offsetX;
20854
- y = e.offsetY;
20855
- lastMoved = Date.now();
20888
+ if (gridRef.el === e.target) {
20889
+ x = e.offsetX;
20890
+ y = e.offsetY;
20891
+ lastMoved = Date.now();
20892
+ }
20856
20893
  }
20857
20894
  function recompute() {
20858
20895
  const { col, row } = getPosition();
@@ -24965,6 +25002,7 @@ function convertChartData(chartData) {
24965
25002
  legendPosition: chartData.legendPosition,
24966
25003
  stacked: chartData.stacked || false,
24967
25004
  aggregated: false,
25005
+ cumulative: chartData.cumulative || false,
24968
25006
  labelsAsText: false,
24969
25007
  };
24970
25008
  }
@@ -29403,7 +29441,11 @@ class HeaderSizePlugin extends CorePlugin {
29403
29441
  let sizes = [...this.sizes[cmd.sheetId][cmd.dimension]];
29404
29442
  const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
29405
29443
  const baseSize = sizes[cmd.base];
29406
- sizes.splice(addIndex, 0, ...Array(cmd.quantity).fill(baseSize));
29444
+ const sizesToInsert = range(0, cmd.quantity).map(() => ({
29445
+ manualSize: baseSize.manualSize,
29446
+ computedSize: lazy(baseSize.computedSize()),
29447
+ }));
29448
+ sizes.splice(addIndex, 0, ...sizesToInsert);
29407
29449
  sizes = sizes.map((size, row) => {
29408
29450
  if (cmd.dimension === "ROW" && row > cmd.base + cmd.quantity) {
29409
29451
  // invalidate sizes
@@ -29619,7 +29661,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
29619
29661
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
29620
29662
  return 27 /* CommandResult.InvalidSheetId */;
29621
29663
  }
29622
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29664
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
29623
29665
  return 8 /* CommandResult.NotEnoughElements */;
29624
29666
  }
29625
29667
  return 0 /* CommandResult.Success */;
@@ -29669,9 +29711,9 @@ class HeaderVisibilityPlugin extends CorePlugin {
29669
29711
  }
29670
29712
  return;
29671
29713
  }
29672
- canRemoveHeaders(sheetId, dimension, elements) {
29714
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
29673
29715
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
29674
- return !includesAll(elements, visibleHeaders);
29716
+ return includesAll(elements, visibleHeaders);
29675
29717
  }
29676
29718
  isRowHiddenByUser(sheetId, index) {
29677
29719
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -29767,7 +29809,7 @@ class HeaderVisibilityPlugin extends CorePlugin {
29767
29809
  }
29768
29810
  }
29769
29811
  HeaderVisibilityPlugin.getters = [
29770
- "canRemoveHeaders",
29812
+ "checkElementsIncludeAllVisibleHeaders",
29771
29813
  "getHiddenColsGroups",
29772
29814
  "getHiddenRowsGroups",
29773
29815
  "isRowHiddenByUser",
@@ -30804,6 +30846,9 @@ class SheetPlugin extends CorePlugin {
30804
30846
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
30805
30847
  return 86 /* CommandResult.InvalidHeaderIndex */;
30806
30848
  }
30849
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
30850
+ return 8 /* CommandResult.NotEnoughElements */;
30851
+ }
30807
30852
  else {
30808
30853
  return 0 /* CommandResult.Success */;
30809
30854
  }
@@ -31090,6 +31135,20 @@ class SheetPlugin extends CorePlugin {
31090
31135
  }
31091
31136
  this.history.update("sheets", sheetId, "panes", panes);
31092
31137
  }
31138
+ /**
31139
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
31140
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
31141
+ */
31142
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
31143
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
31144
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
31145
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
31146
+ if (!startIndex) {
31147
+ return false;
31148
+ }
31149
+ const indicesToCheck = range(startIndex, endIndex);
31150
+ return includesAll(elements, indicesToCheck);
31151
+ }
31093
31152
  // ---------------------------------------------------------------------------
31094
31153
  // Row/Col manipulation
31095
31154
  // ---------------------------------------------------------------------------
@@ -31618,6 +31677,7 @@ SheetPlugin.getters = [
31618
31677
  "getSheetSize",
31619
31678
  "getSheetZone",
31620
31679
  "getPaneDivisions",
31680
+ "checkElementsIncludeAllNonFrozenHeaders",
31621
31681
  ];
31622
31682
 
31623
31683
  /**
@@ -32184,6 +32244,7 @@ class EvaluationConditionalFormatPlugin extends UIPlugin {
32184
32244
  // stores the computed styles in the format of computedStyles.sheetName[col][row] = Style
32185
32245
  this.computedStyles = {};
32186
32246
  this.computedIcons = {};
32247
+ this.uuidGenerator = new UuidGenerator();
32187
32248
  /**
32188
32249
  * Execute the predicate to know if a conditional formatting rule should be applied to a cell
32189
32250
  */
@@ -32536,13 +32597,20 @@ class EvaluationConditionalFormatPlugin extends UIPlugin {
32536
32597
  this.adaptRules(origin.sheetId, cf, [xc], toRemoveRange);
32537
32598
  }
32538
32599
  else {
32539
- this.adaptRules(target.sheetId, cf, [xc], []);
32540
32600
  this.adaptRules(origin.sheetId, cf, [], toRemoveRange);
32601
+ const cfToCopyTo = this.getCFToCopyTo(target.sheetId, cf);
32602
+ this.adaptRules(target.sheetId, cfToCopyTo, [xc], []);
32541
32603
  }
32542
32604
  }
32543
32605
  }
32544
32606
  }
32545
32607
  }
32608
+ getCFToCopyTo(targetSheetId, originCF) {
32609
+ const cfInTarget = this.getters
32610
+ .getConditionalFormats(targetSheetId)
32611
+ .find((cf) => cf.stopIfTrue === originCF.stopIfTrue && deepEquals(cf.rule, originCF.rule));
32612
+ return cfInTarget ? cfInTarget : { ...originCF, id: this.uuidGenerator.uuidv4(), ranges: [] };
32613
+ }
32546
32614
  }
32547
32615
  EvaluationConditionalFormatPlugin.getters = ["getConditionalIcon", "getCellComputedStyle"];
32548
32616
 
@@ -32890,30 +32958,26 @@ class InternalViewport {
32890
32958
  const { end } = this.getters.getColDimensions(sheetId, targetCol);
32891
32959
  const maxCol = this.getters.getNumberCols(sheetId);
32892
32960
  if (this.offsetX + this.offsetCorrectionX + this.viewportWidth < end) {
32893
- for (let col = this.left; this.offsetX + this.offsetCorrectionX + this.viewportWidth < end; col++) {
32894
- if (col > maxCol) {
32895
- break;
32896
- }
32897
- if (this.getters.isColHidden(sheetId, col)) {
32898
- continue;
32899
- }
32900
- this.offsetX = this.getters.getColDimensions(sheetId, col).end - this.offsetCorrectionX;
32901
- this.offsetScrollbarX = this.offsetX;
32902
- this.adjustViewportZoneX();
32961
+ let finalTarget = targetCol;
32962
+ while (this.getters.isColHidden(sheetId, finalTarget) && targetCol < maxCol) {
32963
+ finalTarget++;
32903
32964
  }
32965
+ const finalTargetEnd = this.getters.getColDimensions(sheetId, finalTarget).end;
32966
+ const startIndex = this.searchHeaderIndex("COL", finalTargetEnd - this.viewportWidth - this.offsetCorrectionX, this.boundaries.left, true);
32967
+ this.offsetX =
32968
+ this.getters.getColDimensions(sheetId, startIndex).end - this.offsetCorrectionX;
32969
+ this.offsetScrollbarX = this.offsetX;
32970
+ this.adjustViewportZoneX();
32904
32971
  }
32905
32972
  else if (this.left > targetCol) {
32906
- for (let col = this.left; col >= targetCol; col--) {
32907
- if (col < 0) {
32908
- break;
32909
- }
32910
- if (this.getters.isColHidden(sheetId, col)) {
32911
- continue;
32912
- }
32913
- this.offsetX = this.getters.getColDimensions(sheetId, col).start - this.offsetCorrectionX;
32914
- this.offsetScrollbarX = this.offsetX;
32915
- this.adjustViewportZoneX();
32973
+ let finalTarget = targetCol;
32974
+ while (this.getters.isColHidden(sheetId, finalTarget) && targetCol > 0) {
32975
+ finalTarget--;
32916
32976
  }
32977
+ this.offsetX =
32978
+ this.getters.getColDimensions(sheetId, finalTarget).start - this.offsetCorrectionX;
32979
+ this.offsetScrollbarX = this.offsetX;
32980
+ this.adjustViewportZoneX();
32917
32981
  }
32918
32982
  }
32919
32983
  adjustPositionY(targetRow) {
@@ -32921,30 +32985,26 @@ class InternalViewport {
32921
32985
  const { end } = this.getters.getRowDimensions(sheetId, targetRow);
32922
32986
  const maxRow = this.getters.getNumberRows(sheetId);
32923
32987
  if (this.offsetY + this.viewportHeight + this.offsetCorrectionY < end) {
32924
- for (let row = this.top; this.offsetY + this.viewportHeight + this.offsetCorrectionY < end; row++) {
32925
- if (row > maxRow) {
32926
- break;
32927
- }
32928
- if (this.getters.isRowHidden(sheetId, row)) {
32929
- continue;
32930
- }
32931
- this.offsetY = this.getters.getRowDimensions(sheetId, row).end - this.offsetCorrectionY;
32932
- this.offsetScrollbarY = this.offsetY;
32933
- this.adjustViewportZoneY();
32988
+ let finalTarget = targetRow;
32989
+ while (this.getters.isRowHidden(sheetId, finalTarget) && targetRow < maxRow) {
32990
+ finalTarget++;
32934
32991
  }
32992
+ const finalTargetEnd = this.getters.getRowDimensions(sheetId, finalTarget).end;
32993
+ const startIndex = this.searchHeaderIndex("ROW", finalTargetEnd - this.viewportHeight - this.offsetCorrectionY, this.boundaries.top, true);
32994
+ this.offsetY =
32995
+ this.getters.getRowDimensions(sheetId, startIndex).end - this.offsetCorrectionY;
32996
+ this.offsetScrollbarY = this.offsetY;
32997
+ this.adjustViewportZoneY();
32935
32998
  }
32936
32999
  else if (this.top > targetRow) {
32937
- for (let row = this.top; row >= targetRow; row--) {
32938
- if (row < 0) {
32939
- break;
32940
- }
32941
- if (this.getters.isRowHidden(sheetId, row)) {
32942
- continue;
32943
- }
32944
- this.offsetY = this.getters.getRowDimensions(sheetId, row).start - this.offsetCorrectionY;
32945
- this.offsetScrollbarY = this.offsetY;
32946
- this.adjustViewportZoneY();
33000
+ let finalTarget = targetRow;
33001
+ while (this.getters.isRowHidden(sheetId, finalTarget) && targetRow > 0) {
33002
+ finalTarget--;
32947
33003
  }
33004
+ this.offsetY =
33005
+ this.getters.getRowDimensions(sheetId, finalTarget).start - this.offsetCorrectionY;
33006
+ this.offsetScrollbarY = this.offsetY;
33007
+ this.adjustViewportZoneY();
32948
33008
  }
32949
33009
  }
32950
33010
  setViewportOffset(offsetX, offsetY) {
@@ -33064,6 +33124,9 @@ class InternalViewport {
33064
33124
  const sheetId = this.sheetId;
33065
33125
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
33066
33126
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
33127
+ if (this.left === -1) {
33128
+ this.left = this.boundaries.left;
33129
+ }
33067
33130
  if (this.right === -1) {
33068
33131
  this.right = this.getters.getNumberCols(sheetId) - 1;
33069
33132
  }
@@ -33077,6 +33140,9 @@ class InternalViewport {
33077
33140
  const sheetId = this.sheetId;
33078
33141
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
33079
33142
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
33143
+ if (this.top === -1) {
33144
+ this.top = this.boundaries.top;
33145
+ }
33080
33146
  if (this.bottom === -1) {
33081
33147
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
33082
33148
  }
@@ -34513,14 +34579,10 @@ class FindAndReplacePlugin extends UIPlugin {
34513
34579
  case "REPLACE_ALL_SEARCH":
34514
34580
  this.replaceAll(cmd.replaceWith);
34515
34581
  break;
34516
- case "EVALUATE_CELLS":
34517
- case "UPDATE_CELL":
34518
- case "REMOVE_FILTER_TABLE":
34519
- case "UPDATE_FILTER":
34520
- this.isSearchDirty = true;
34521
- break;
34522
34582
  case "UNDO":
34523
34583
  case "REDO":
34584
+ case "REMOVE_FILTER_TABLE":
34585
+ case "UPDATE_FILTER":
34524
34586
  case "REMOVE_COLUMNS_ROWS":
34525
34587
  case "HIDE_COLUMNS_ROWS":
34526
34588
  case "UNHIDE_COLUMNS_ROWS":
@@ -37520,7 +37582,7 @@ class ClipboardCellsState extends ClipboardCellsAbstractState {
37520
37582
  });
37521
37583
  for (const filterTable of this.copiedTables) {
37522
37584
  this.dispatch("REMOVE_FILTER_TABLE", {
37523
- sheetId: this.getters.getActiveSheetId(),
37585
+ sheetId: this.sheetId,
37524
37586
  target: [filterTable.zone],
37525
37587
  });
37526
37588
  }
@@ -37998,7 +38060,7 @@ class ClipboardPlugin extends UIPlugin {
37998
38060
  allowDispatch(cmd) {
37999
38061
  switch (cmd.type) {
38000
38062
  case "CUT":
38001
- const zones = cmd.target || this.getters.getSelectedZones();
38063
+ const zones = this.getters.getSelectedZones();
38002
38064
  const state = this.getClipboardState(zones, cmd.type);
38003
38065
  return state.isCutAllowed(zones);
38004
38066
  case "PASTE":
@@ -38029,7 +38091,7 @@ class ClipboardPlugin extends UIPlugin {
38029
38091
  switch (cmd.type) {
38030
38092
  case "COPY":
38031
38093
  case "CUT":
38032
- const zones = ("target" in cmd && cmd.target) || this.getters.getSelectedZones();
38094
+ const zones = this.getters.getSelectedZones();
38033
38095
  this.state = this.getClipboardState(zones, cmd.type);
38034
38096
  this.status = "visible";
38035
38097
  break;
@@ -39409,26 +39471,24 @@ class GridSelectionPlugin extends UIPlugin {
39409
39471
  const isBasedBefore = cmd.base < start;
39410
39472
  const deltaCol = isBasedBefore && isCol ? thickness : 0;
39411
39473
  const deltaRow = isBasedBefore && !isCol ? thickness : 0;
39412
- this.dispatch("CUT", {
39413
- target: [
39414
- {
39415
- left: isCol ? start + deltaCol : 0,
39416
- right: isCol ? end + deltaCol : this.getters.getNumberCols(cmd.sheetId) - 1,
39417
- top: !isCol ? start + deltaRow : 0,
39418
- bottom: !isCol ? end + deltaRow : this.getters.getNumberRows(cmd.sheetId) - 1,
39419
- },
39420
- ],
39421
- });
39422
- this.dispatch("PASTE", {
39423
- target: [
39424
- {
39425
- left: isCol ? cmd.base : 0,
39426
- right: isCol ? cmd.base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
39427
- top: !isCol ? cmd.base : 0,
39428
- bottom: !isCol ? cmd.base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
39429
- },
39430
- ],
39431
- });
39474
+ const target = [
39475
+ {
39476
+ left: isCol ? start + deltaCol : 0,
39477
+ right: isCol ? end + deltaCol : this.getters.getNumberCols(cmd.sheetId) - 1,
39478
+ top: !isCol ? start + deltaRow : 0,
39479
+ bottom: !isCol ? end + deltaRow : this.getters.getNumberRows(cmd.sheetId) - 1,
39480
+ },
39481
+ ];
39482
+ const state = new ClipboardCellsState(target, "CUT", this.getters, this.dispatch, this.selection);
39483
+ const pasteTarget = [
39484
+ {
39485
+ left: isCol ? cmd.base : 0,
39486
+ right: isCol ? cmd.base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
39487
+ top: !isCol ? cmd.base : 0,
39488
+ bottom: !isCol ? cmd.base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
39489
+ },
39490
+ ];
39491
+ state.paste(pasteTarget, { selectTarget: true });
39432
39492
  const toRemove = isBasedBefore ? cmd.elements.map((el) => el + thickness) : cmd.elements;
39433
39493
  let currentIndex = cmd.base;
39434
39494
  for (const element of toRemove) {
@@ -45368,6 +45428,6 @@ function addFunction(functionName, functionDescription) {
45368
45428
  export { AbstractChart, CommandResult, CorePlugin, DATETIME_FORMAT, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, compile, components, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, invalidateEvaluationCommands, links, load, parse, readonlyAllowedCommands, registries, setTranslationMethod, tokenize };
45369
45429
 
45370
45430
 
45371
- __info__.version = '16.2.14';
45372
- __info__.date = '2023-08-29T13:54:14.962Z';
45373
- __info__.hash = 'ad037b1';
45431
+ __info__.version = '16.2.17';
45432
+ __info__.date = '2023-10-03T12:42:54.642Z';
45433
+ __info__.hash = '146867a';