@odoo/o-spreadsheet 16.1.19 → 16.1.23

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.
@@ -318,7 +318,16 @@
318
318
  const mdyDateRegexp = /^\d{1,2}(\/|-|\s)\d{1,2}((\/|-|\s)\d{1,4})?$/;
319
319
  const ymdDateRegexp = /^\d{3,4}(\/|-|\s)\d{1,2}(\/|-|\s)\d{1,2}$/;
320
320
  const timeRegexp = /((\d+(:\d+)?(:\d+)?\s*(AM|PM))|(\d+:\d+(:\d+)?))$/;
321
+ const CACHE = {};
321
322
  function parseDateTime(str) {
323
+ if (str in CACHE) {
324
+ return CACHE[str];
325
+ }
326
+ const date = _parseDateTime(str);
327
+ CACHE[str] = date;
328
+ return date;
329
+ }
330
+ function _parseDateTime(str) {
322
331
  str = str.trim();
323
332
  let time;
324
333
  const timeMatch = str.match(timeRegexp);
@@ -1003,13 +1012,17 @@
1003
1012
  return position === "after" ? base + 1 : base;
1004
1013
  }
1005
1014
  /**
1006
- * Compare two objects.
1015
+ * Compares two objects.
1007
1016
  */
1008
1017
  function deepEquals(o1, o2) {
1009
1018
  if (o1 === o2)
1010
1019
  return true;
1011
1020
  if ((o1 && !o2) || (o2 && !o1))
1012
1021
  return false;
1022
+ if (typeof o1 !== typeof o2)
1023
+ return false;
1024
+ if (typeof o1 !== "object")
1025
+ return o1 === o2;
1013
1026
  // Objects can have different keys if the values are undefined
1014
1027
  const keys = new Set();
1015
1028
  Object.keys(o1).forEach((key) => keys.add(key));
@@ -2118,8 +2131,9 @@
2118
2131
  }
2119
2132
  get zone() {
2120
2133
  const { left, top, bottom, right } = this._zone;
2121
- if (right !== undefined && bottom !== undefined)
2122
- return { left, top, right, bottom };
2134
+ if (right !== undefined && bottom !== undefined) {
2135
+ return this._zone;
2136
+ }
2123
2137
  else if (bottom === undefined && right !== undefined) {
2124
2138
  return { right, top, left, bottom: this.getSheetSize(this.sheetId).height - 1 };
2125
2139
  }
@@ -3645,6 +3659,9 @@
3645
3659
  CommandResult[CommandResult["InvalidQuantity"] = 87] = "InvalidQuantity";
3646
3660
  })(exports.CommandResult || (exports.CommandResult = {}));
3647
3661
 
3662
+ function isMatrix(x) {
3663
+ return Array.isArray(x) && Array.isArray(x[0]);
3664
+ }
3648
3665
  var DIRECTION;
3649
3666
  (function (DIRECTION) {
3650
3667
  DIRECTION["UP"] = "up";
@@ -4827,6 +4844,7 @@
4827
4844
  this.labelsAsText = definition.labelsAsText;
4828
4845
  this.stacked = definition.stacked;
4829
4846
  this.aggregated = definition.aggregated;
4847
+ this.cumulative = definition.cumulative;
4830
4848
  }
4831
4849
  static validateChartDefinition(validator, definition) {
4832
4850
  return validator.checkValidations(definition, checkDataset, checkLabelRange);
@@ -4847,6 +4865,7 @@
4847
4865
  labelRange: context.auxiliaryRange || undefined,
4848
4866
  stacked: false,
4849
4867
  aggregated: false,
4868
+ cumulative: false,
4850
4869
  };
4851
4870
  }
4852
4871
  getDefinition() {
@@ -4867,6 +4886,7 @@
4867
4886
  labelsAsText: this.labelsAsText,
4868
4887
  stacked: this.stacked,
4869
4888
  aggregated: this.aggregated,
4889
+ cumulative: this.cumulative,
4870
4890
  };
4871
4891
  }
4872
4892
  getContextCreation() {
@@ -5060,6 +5080,16 @@
5060
5080
  if (chart.stacked) {
5061
5081
  backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
5062
5082
  }
5083
+ if (chart.cumulative) {
5084
+ let accumulator = 0;
5085
+ data = data.map((value) => {
5086
+ if (!isNaN(value)) {
5087
+ accumulator += parseFloat(value);
5088
+ return accumulator;
5089
+ }
5090
+ return value;
5091
+ });
5092
+ }
5063
5093
  const backgroundColor = rgbaToHex(backgroundRGBA);
5064
5094
  const dataset = {
5065
5095
  label,
@@ -6401,6 +6431,7 @@
6401
6431
  labelsAsText: false,
6402
6432
  stacked: false,
6403
6433
  aggregated: false,
6434
+ cumulative: false,
6404
6435
  labelRange: labelRangeXc,
6405
6436
  type: "line",
6406
6437
  dataSetsHaveTitle,
@@ -6754,6 +6785,13 @@
6754
6785
  elements: rows,
6755
6786
  });
6756
6787
  };
6788
+ const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
6789
+ const sheetId = env.model.getters.getActiveSheetId();
6790
+ const selectedElements = env.model.getters.getElementsFromSelection(dimension);
6791
+ const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
6792
+ const includesAllNonFrozenHeaders = env.model.getters.checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, selectedElements);
6793
+ return !includesAllVisibleHeaders && !includesAllNonFrozenHeaders;
6794
+ };
6757
6795
  const REMOVE_COLUMNS_NAME = (env) => {
6758
6796
  if (env.model.getters.getSelectedZones().length > 1) {
6759
6797
  return _lt("Delete columns");
@@ -7344,11 +7382,7 @@
7344
7382
  name: REMOVE_COLUMNS_NAME,
7345
7383
  sequence: 90,
7346
7384
  action: REMOVE_COLUMNS_ACTION,
7347
- isVisible: (env) => {
7348
- const sheetId = env.model.getters.getActiveSheetId();
7349
- const selectedCols = env.model.getters.getElementsFromSelection("COL");
7350
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
7351
- },
7385
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
7352
7386
  })
7353
7387
  .add("clear_column", {
7354
7388
  name: DELETE_CONTENT_COLUMNS_NAME,
@@ -7362,7 +7396,7 @@
7362
7396
  isVisible: (env) => {
7363
7397
  const sheetId = env.model.getters.getActiveSheetId();
7364
7398
  const selectedCols = env.model.getters.getElementsFromSelection("COL");
7365
- return env.model.getters.canRemoveHeaders(sheetId, "COL", selectedCols);
7399
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "COL", selectedCols);
7366
7400
  },
7367
7401
  separator: true,
7368
7402
  })
@@ -7436,11 +7470,7 @@
7436
7470
  name: REMOVE_ROWS_NAME,
7437
7471
  sequence: 70,
7438
7472
  action: REMOVE_ROWS_ACTION,
7439
- isVisible: (env) => {
7440
- const sheetId = env.model.getters.getActiveSheetId();
7441
- const selectedRows = env.model.getters.getElementsFromSelection("ROW");
7442
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
7443
- },
7473
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
7444
7474
  })
7445
7475
  .add("clear_row", {
7446
7476
  name: DELETE_CONTENT_ROWS_NAME,
@@ -7454,7 +7484,7 @@
7454
7484
  isVisible: (env) => {
7455
7485
  const sheetId = env.model.getters.getActiveSheetId();
7456
7486
  const selectedRows = env.model.getters.getElementsFromSelection("ROW");
7457
- return env.model.getters.canRemoveHeaders(sheetId, "ROW", selectedRows);
7487
+ return !env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, "ROW", selectedRows);
7458
7488
  },
7459
7489
  separator: true,
7460
7490
  })
@@ -14101,6 +14131,36 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
14101
14131
  isExported: true,
14102
14132
  };
14103
14133
  // -----------------------------------------------------------------------------
14134
+ // INDEX
14135
+ // -----------------------------------------------------------------------------
14136
+ const INDEX = {
14137
+ description: _lt(`Returns the content of a cell, specified by row and column offset.`),
14138
+ args: args(`
14139
+ reference (any, range) ${_lt("The range of cells from which the value is returned.")}
14140
+ row (number) ${_lt("The index of the row to be returned from within the reference range of cells.")}
14141
+ column (number) ${_lt("The index of the column to be returned from within the reference range of cells.")}
14142
+ `),
14143
+ returns: ["ANY"],
14144
+ computeFormat: (reference, row, column) => {
14145
+ var _a;
14146
+ const _row = toNumber(row.value);
14147
+ const _column = toNumber(column.value);
14148
+ return (_a = reference[_column - 1][_row - 1]) === null || _a === void 0 ? void 0 : _a.format;
14149
+ },
14150
+ compute: function (reference, row, column) {
14151
+ const _reference = isMatrix(reference) ? reference : [[reference]];
14152
+ const _row = toNumber(row);
14153
+ const _column = toNumber(column);
14154
+ assert(() => _column >= 0 &&
14155
+ _column - 1 < _reference.length &&
14156
+ _row >= 0 &&
14157
+ _row - 1 < _reference[0].length, _lt("Index out of range."));
14158
+ assert(() => row !== 0 && column !== 0, _lt("This function can only return a single cell value, not an array. Provide valid row and column indices."));
14159
+ return _reference[_column - 1][_row - 1];
14160
+ },
14161
+ isExported: true,
14162
+ };
14163
+ // -----------------------------------------------------------------------------
14104
14164
  // LOOKUP
14105
14165
  // -----------------------------------------------------------------------------
14106
14166
  const LOOKUP = {
@@ -14294,6 +14354,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
14294
14354
  COLUMN: COLUMN,
14295
14355
  COLUMNS: COLUMNS,
14296
14356
  HLOOKUP: HLOOKUP,
14357
+ INDEX: INDEX,
14297
14358
  LOOKUP: LOOKUP,
14298
14359
  MATCH: MATCH,
14299
14360
  ROW: ROW,
@@ -18271,6 +18332,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
18271
18332
  padding: 10px;
18272
18333
  width: ${ERROR_TOOLTIP_WIDTH}px;
18273
18334
  box-sizing: border-box !important;
18335
+ overflow-wrap: break-word;
18274
18336
  }
18275
18337
  `;
18276
18338
  class ErrorToolTip extends owl.Component {
@@ -18451,6 +18513,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
18451
18513
  });
18452
18514
  this.state.values = this.getFilterValues(this.props.filterPosition);
18453
18515
  }
18516
+ get isReadonly() {
18517
+ return this.env.model.getters.isReadonly();
18518
+ }
18454
18519
  getFilterValues(position) {
18455
18520
  const sheetId = this.env.model.getters.getActiveSheetId();
18456
18521
  const filter = this.env.model.getters.getFilter({ sheetId, ...position });
@@ -19331,11 +19396,13 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
19331
19396
  name: REMOVE_ROWS_NAME,
19332
19397
  sequence: 80,
19333
19398
  action: REMOVE_ROWS_ACTION,
19399
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("ROW", env),
19334
19400
  })
19335
19401
  .addChild("edit_delete_column", ["edit"], {
19336
19402
  name: REMOVE_COLUMNS_NAME,
19337
19403
  sequence: 90,
19338
19404
  action: REMOVE_COLUMNS_ACTION,
19405
+ isVisible: (env) => CAN_REMOVE_COLUMNS_ROWS("COL", env),
19339
19406
  })
19340
19407
  .addChild("edit_delete_cell_shift_up", ["edit"], {
19341
19408
  name: _lt("Delete cell and shift up"),
@@ -20515,6 +20582,11 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
20515
20582
  aggregated: ev.target.checked,
20516
20583
  });
20517
20584
  }
20585
+ onUpdateCumulative(ev) {
20586
+ this.props.updateChart(this.props.figureId, {
20587
+ cumulative: ev.target.checked,
20588
+ });
20589
+ }
20518
20590
  }
20519
20591
  LineConfigPanel.template = "o-spreadsheet-LineConfigPanel";
20520
20592
 
@@ -21706,9 +21778,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
21706
21778
  }
21707
21779
  setup() {
21708
21780
  this.showFormulaState = this.env.model.getters.shouldShowFormulas();
21709
- this.debouncedUpdateSearch = debounce(this.updateSearch.bind(this), 200);
21710
21781
  owl.onMounted(() => this.focusInput());
21711
21782
  owl.onWillUnmount(() => {
21783
+ clearTimeout(this.debounceTimeoutId);
21712
21784
  this.env.model.dispatch("CLEAR_SEARCH");
21713
21785
  this.env.model.dispatch("SET_FORMULA_VISIBILITY", { show: this.showFormulaState });
21714
21786
  });
@@ -21753,6 +21825,13 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
21753
21825
  searchOptions: this.state.searchOptions,
21754
21826
  });
21755
21827
  }
21828
+ debouncedUpdateSearch() {
21829
+ clearTimeout(this.debounceTimeoutId);
21830
+ this.debounceTimeoutId = setTimeout(() => {
21831
+ this.updateSearch();
21832
+ this.debounceTimeoutId = undefined;
21833
+ }, 200);
21834
+ }
21756
21835
  replace() {
21757
21836
  this.env.model.dispatch("REPLACE_SEARCH", {
21758
21837
  replaceWith: this.state.replaceWith,
@@ -22403,9 +22482,11 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
22403
22482
  }
22404
22483
  }
22405
22484
  function updateMousePosition(e) {
22406
- x = e.offsetX;
22407
- y = e.offsetY;
22408
- lastMoved = Date.now();
22485
+ if (gridRef.el === e.target) {
22486
+ x = e.offsetX;
22487
+ y = e.offsetY;
22488
+ lastMoved = Date.now();
22489
+ }
22409
22490
  }
22410
22491
  function recompute() {
22411
22492
  const { col, row } = getPosition();
@@ -22688,7 +22769,14 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
22688
22769
  return;
22689
22770
  }
22690
22771
  if (this.state.waitingForMove === true) {
22691
- this.startMovement(ev);
22772
+ if (!this.env.model.getters.isGridSelectionActive()) {
22773
+ this._selectElement(index, false);
22774
+ }
22775
+ else {
22776
+ // FIXME: Consider reintroducing this feature for all type of selection if we find
22777
+ // a way to have the grid selection follow the other selections evolution
22778
+ this.startMovement(ev);
22779
+ }
22692
22780
  return;
22693
22781
  }
22694
22782
  if (this.env.model.getters.getEditionMode() === "editing") {
@@ -25485,6 +25573,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
25485
25573
  legendPosition: chartData.legendPosition,
25486
25574
  stacked: chartData.stacked || false,
25487
25575
  aggregated: false,
25576
+ cumulative: chartData.cumulative || false,
25488
25577
  labelsAsText: false,
25489
25578
  };
25490
25579
  }
@@ -28521,10 +28610,11 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
28521
28610
  * Reconstructs the original formula string based on a normalized form and its dependencies
28522
28611
  */
28523
28612
  buildFormulaContent(sheetId, cell, dependencies) {
28524
- const ranges = dependencies || [...cell.dependencies];
28613
+ const ranges = dependencies || cell.dependencies;
28614
+ let rangeIndex = 0;
28525
28615
  return concat(cell.compiledFormula.tokens.map((token) => {
28526
28616
  if (token.type === "REFERENCE") {
28527
- const range = ranges.shift();
28617
+ const range = ranges[rangeIndex++];
28528
28618
  return this.getters.getRangeString(range, sheetId);
28529
28619
  }
28530
28620
  return token.value;
@@ -30049,7 +30139,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
30049
30139
  if (!this.getters.tryGetSheet(cmd.sheetId)) {
30050
30140
  return 27 /* CommandResult.InvalidSheetId */;
30051
30141
  }
30052
- if (!this.canRemoveHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
30142
+ if (this.checkElementsIncludeAllVisibleHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
30053
30143
  return 8 /* CommandResult.NotEnoughElements */;
30054
30144
  }
30055
30145
  return 0 /* CommandResult.Success */;
@@ -30099,9 +30189,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
30099
30189
  }
30100
30190
  return;
30101
30191
  }
30102
- canRemoveHeaders(sheetId, dimension, elements) {
30192
+ checkElementsIncludeAllVisibleHeaders(sheetId, dimension, elements) {
30103
30193
  const visibleHeaders = this.getAllVisibleHeaders(sheetId, dimension);
30104
- return !includesAll(elements, visibleHeaders);
30194
+ return includesAll(elements, visibleHeaders);
30105
30195
  }
30106
30196
  isRowHiddenByUser(sheetId, index) {
30107
30197
  return this.hiddenHeaders[sheetId].ROW[index];
@@ -30197,7 +30287,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
30197
30287
  }
30198
30288
  }
30199
30289
  HeaderVisibilityPlugin.getters = [
30200
- "canRemoveHeaders",
30290
+ "checkElementsIncludeAllVisibleHeaders",
30201
30291
  "getHiddenColsGroups",
30202
30292
  "getHiddenRowsGroups",
30203
30293
  "isRowHiddenByUser",
@@ -31225,6 +31315,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
31225
31315
  if (Math.min(...cmd.elements) < 0 || Math.max(...cmd.elements) > elements) {
31226
31316
  return 86 /* CommandResult.InvalidHeaderIndex */;
31227
31317
  }
31318
+ else if (this.checkElementsIncludeAllNonFrozenHeaders(cmd.sheetId, cmd.dimension, cmd.elements)) {
31319
+ return 8 /* CommandResult.NotEnoughElements */;
31320
+ }
31228
31321
  else {
31229
31322
  return 0 /* CommandResult.Success */;
31230
31323
  }
@@ -31511,6 +31604,20 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
31511
31604
  }
31512
31605
  this.history.update("sheets", sheetId, "panes", panes);
31513
31606
  }
31607
+ /**
31608
+ * Checks if all non-frozen header indices are present in the provided elements of selected rows/columns.
31609
+ * This validation ensures that all rows or columns cannot be deleted when frozen panes exist.
31610
+ */
31611
+ checkElementsIncludeAllNonFrozenHeaders(sheetId, dimension, elements) {
31612
+ const paneDivisions = this.getters.getPaneDivisions(sheetId);
31613
+ const startIndex = dimension === "ROW" ? paneDivisions.ySplit : paneDivisions.xSplit;
31614
+ const endIndex = this.getters.getNumberHeaders(sheetId, dimension);
31615
+ if (!startIndex) {
31616
+ return false;
31617
+ }
31618
+ const indicesToCheck = range(startIndex, endIndex);
31619
+ return includesAll(elements, indicesToCheck);
31620
+ }
31514
31621
  // ---------------------------------------------------------------------------
31515
31622
  // Row/Col manipulation
31516
31623
  // ---------------------------------------------------------------------------
@@ -32043,6 +32150,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
32043
32150
  "getSheetSize",
32044
32151
  "getSheetZone",
32045
32152
  "getPaneDivisions",
32153
+ "checkElementsIncludeAllNonFrozenHeaders",
32046
32154
  ];
32047
32155
 
32048
32156
  /**
@@ -32581,6 +32689,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
32581
32689
  // stores the computed styles in the format of computedStyles.sheetName[col][row] = Style
32582
32690
  this.computedStyles = {};
32583
32691
  this.computedIcons = {};
32692
+ this.uuidGenerator = new UuidGenerator();
32584
32693
  /**
32585
32694
  * Execute the predicate to know if a conditional formatting rule should be applied to a cell
32586
32695
  */
@@ -32933,13 +33042,20 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
32933
33042
  this.adaptRules(origin.sheetId, cf, [xc], toRemoveRange);
32934
33043
  }
32935
33044
  else {
32936
- this.adaptRules(target.sheetId, cf, [xc], []);
32937
33045
  this.adaptRules(origin.sheetId, cf, [], toRemoveRange);
33046
+ const cfToCopyTo = this.getCFToCopyTo(target.sheetId, cf);
33047
+ this.adaptRules(target.sheetId, cfToCopyTo, [xc], []);
32938
33048
  }
32939
33049
  }
32940
33050
  }
32941
33051
  }
32942
33052
  }
33053
+ getCFToCopyTo(targetSheetId, originCF) {
33054
+ const cfInTarget = this.getters
33055
+ .getConditionalFormats(targetSheetId)
33056
+ .find((cf) => cf.stopIfTrue === originCF.stopIfTrue && deepEquals(cf.rule, originCF.rule));
33057
+ return cfInTarget ? cfInTarget : { ...originCF, id: this.uuidGenerator.uuidv4(), ranges: [] };
33058
+ }
32943
33059
  }
32944
33060
  EvaluationConditionalFormatPlugin.getters = ["getConditionalIcon", "getCellComputedStyle"];
32945
33061
 
@@ -33287,30 +33403,26 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
33287
33403
  const { end } = this.getters.getColDimensions(sheetId, targetCol);
33288
33404
  const maxCol = this.getters.getNumberCols(sheetId);
33289
33405
  if (this.offsetX + this.offsetCorrectionX + this.viewportWidth < end) {
33290
- for (let col = this.left; this.offsetX + this.offsetCorrectionX + this.viewportWidth < end; col++) {
33291
- if (col > maxCol) {
33292
- break;
33293
- }
33294
- if (this.getters.isColHidden(sheetId, col)) {
33295
- continue;
33296
- }
33297
- this.offsetX = this.getters.getColDimensions(sheetId, col).end - this.offsetCorrectionX;
33298
- this.offsetScrollbarX = this.offsetX;
33299
- this.adjustViewportZoneX();
33406
+ let finalTarget = targetCol;
33407
+ while (this.getters.isColHidden(sheetId, finalTarget) && targetCol < maxCol) {
33408
+ finalTarget++;
33300
33409
  }
33410
+ const finalTargetEnd = this.getters.getColDimensions(sheetId, finalTarget).end;
33411
+ const startIndex = this.searchHeaderIndex("COL", finalTargetEnd - this.viewportWidth - this.offsetCorrectionX, this.boundaries.left, true);
33412
+ this.offsetX =
33413
+ this.getters.getColDimensions(sheetId, startIndex).end - this.offsetCorrectionX;
33414
+ this.offsetScrollbarX = this.offsetX;
33415
+ this.adjustViewportZoneX();
33301
33416
  }
33302
33417
  else if (this.left > targetCol) {
33303
- for (let col = this.left; col >= targetCol; col--) {
33304
- if (col < 0) {
33305
- break;
33306
- }
33307
- if (this.getters.isColHidden(sheetId, col)) {
33308
- continue;
33309
- }
33310
- this.offsetX = this.getters.getColDimensions(sheetId, col).start - this.offsetCorrectionX;
33311
- this.offsetScrollbarX = this.offsetX;
33312
- this.adjustViewportZoneX();
33418
+ let finalTarget = targetCol;
33419
+ while (this.getters.isColHidden(sheetId, finalTarget) && targetCol > 0) {
33420
+ finalTarget--;
33313
33421
  }
33422
+ this.offsetX =
33423
+ this.getters.getColDimensions(sheetId, finalTarget).start - this.offsetCorrectionX;
33424
+ this.offsetScrollbarX = this.offsetX;
33425
+ this.adjustViewportZoneX();
33314
33426
  }
33315
33427
  }
33316
33428
  adjustPositionY(targetRow) {
@@ -33318,30 +33430,26 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
33318
33430
  const { end } = this.getters.getRowDimensions(sheetId, targetRow);
33319
33431
  const maxRow = this.getters.getNumberRows(sheetId);
33320
33432
  if (this.offsetY + this.viewportHeight + this.offsetCorrectionY < end) {
33321
- for (let row = this.top; this.offsetY + this.viewportHeight + this.offsetCorrectionY < end; row++) {
33322
- if (row > maxRow) {
33323
- break;
33324
- }
33325
- if (this.getters.isRowHidden(sheetId, row)) {
33326
- continue;
33327
- }
33328
- this.offsetY = this.getters.getRowDimensions(sheetId, row).end - this.offsetCorrectionY;
33329
- this.offsetScrollbarY = this.offsetY;
33330
- this.adjustViewportZoneY();
33433
+ let finalTarget = targetRow;
33434
+ while (this.getters.isRowHidden(sheetId, finalTarget) && targetRow < maxRow) {
33435
+ finalTarget++;
33331
33436
  }
33437
+ const finalTargetEnd = this.getters.getRowDimensions(sheetId, finalTarget).end;
33438
+ const startIndex = this.searchHeaderIndex("ROW", finalTargetEnd - this.viewportHeight - this.offsetCorrectionY, this.boundaries.top, true);
33439
+ this.offsetY =
33440
+ this.getters.getRowDimensions(sheetId, startIndex).end - this.offsetCorrectionY;
33441
+ this.offsetScrollbarY = this.offsetY;
33442
+ this.adjustViewportZoneY();
33332
33443
  }
33333
33444
  else if (this.top > targetRow) {
33334
- for (let row = this.top; row >= targetRow; row--) {
33335
- if (row < 0) {
33336
- break;
33337
- }
33338
- if (this.getters.isRowHidden(sheetId, row)) {
33339
- continue;
33340
- }
33341
- this.offsetY = this.getters.getRowDimensions(sheetId, row).start - this.offsetCorrectionY;
33342
- this.offsetScrollbarY = this.offsetY;
33343
- this.adjustViewportZoneY();
33445
+ let finalTarget = targetRow;
33446
+ while (this.getters.isRowHidden(sheetId, finalTarget) && targetRow > 0) {
33447
+ finalTarget--;
33344
33448
  }
33449
+ this.offsetY =
33450
+ this.getters.getRowDimensions(sheetId, finalTarget).start - this.offsetCorrectionY;
33451
+ this.offsetScrollbarY = this.offsetY;
33452
+ this.adjustViewportZoneY();
33345
33453
  }
33346
33454
  }
33347
33455
  setViewportOffset(offsetX, offsetY) {
@@ -33461,6 +33569,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
33461
33569
  const sheetId = this.sheetId;
33462
33570
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
33463
33571
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
33572
+ if (this.left === -1) {
33573
+ this.left = this.boundaries.left;
33574
+ }
33464
33575
  if (this.right === -1) {
33465
33576
  this.right = this.getters.getNumberCols(sheetId) - 1;
33466
33577
  }
@@ -33474,6 +33585,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
33474
33585
  const sheetId = this.sheetId;
33475
33586
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
33476
33587
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
33588
+ if (this.top === -1) {
33589
+ this.top = this.boundaries.top;
33590
+ }
33477
33591
  if (this.bottom === -1) {
33478
33592
  this.bottom = this.getters.getNumberRows(sheetId) - 1;
33479
33593
  }
@@ -34909,14 +35023,10 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
34909
35023
  case "REPLACE_ALL_SEARCH":
34910
35024
  this.replaceAll(cmd.replaceWith);
34911
35025
  break;
34912
- case "EVALUATE_CELLS":
34913
- case "UPDATE_CELL":
34914
- case "REMOVE_FILTER_TABLE":
34915
- case "UPDATE_FILTER":
34916
- this.isSearchDirty = true;
34917
- break;
34918
35026
  case "UNDO":
34919
35027
  case "REDO":
35028
+ case "REMOVE_FILTER_TABLE":
35029
+ case "UPDATE_FILTER":
34920
35030
  case "REMOVE_COLUMNS_ROWS":
34921
35031
  case "HIDE_COLUMNS_ROWS":
34922
35032
  case "UNHIDE_COLUMNS_ROWS":
@@ -37908,7 +38018,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
37908
38018
  });
37909
38019
  for (const filterTable of this.copiedTables) {
37910
38020
  this.dispatch("REMOVE_FILTER_TABLE", {
37911
- sheetId: this.getters.getActiveSheetId(),
38021
+ sheetId: this.sheetId,
37912
38022
  target: [filterTable.zone],
37913
38023
  });
37914
38024
  }
@@ -38386,7 +38496,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
38386
38496
  allowDispatch(cmd) {
38387
38497
  switch (cmd.type) {
38388
38498
  case "CUT":
38389
- const zones = cmd.target || this.getters.getSelectedZones();
38499
+ const zones = this.getters.getSelectedZones();
38390
38500
  const state = this.getClipboardState(zones, cmd.type);
38391
38501
  return state.isCutAllowed(zones);
38392
38502
  case "PASTE":
@@ -38417,7 +38527,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
38417
38527
  switch (cmd.type) {
38418
38528
  case "COPY":
38419
38529
  case "CUT":
38420
- const zones = ("target" in cmd && cmd.target) || this.getters.getSelectedZones();
38530
+ const zones = this.getters.getSelectedZones();
38421
38531
  this.state = this.getClipboardState(zones, cmd.type);
38422
38532
  this.status = "visible";
38423
38533
  break;
@@ -38848,6 +38958,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
38848
38958
  // ---------------------------------------------------------------------------
38849
38959
  // Getters
38850
38960
  // ---------------------------------------------------------------------------
38961
+ isGridSelectionActive() {
38962
+ return this.selection.isListening(this);
38963
+ }
38851
38964
  getActiveSheet() {
38852
38965
  return this.activeSheet;
38853
38966
  }
@@ -39078,26 +39191,24 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
39078
39191
  const isBasedBefore = cmd.base < start;
39079
39192
  const deltaCol = isBasedBefore && isCol ? thickness : 0;
39080
39193
  const deltaRow = isBasedBefore && !isCol ? thickness : 0;
39081
- this.dispatch("CUT", {
39082
- target: [
39083
- {
39084
- left: isCol ? start + deltaCol : 0,
39085
- right: isCol ? end + deltaCol : this.getters.getNumberCols(cmd.sheetId) - 1,
39086
- top: !isCol ? start + deltaRow : 0,
39087
- bottom: !isCol ? end + deltaRow : this.getters.getNumberRows(cmd.sheetId) - 1,
39088
- },
39089
- ],
39090
- });
39091
- this.dispatch("PASTE", {
39092
- target: [
39093
- {
39094
- left: isCol ? cmd.base : 0,
39095
- right: isCol ? cmd.base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
39096
- top: !isCol ? cmd.base : 0,
39097
- bottom: !isCol ? cmd.base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
39098
- },
39099
- ],
39100
- });
39194
+ const target = [
39195
+ {
39196
+ left: isCol ? start + deltaCol : 0,
39197
+ right: isCol ? end + deltaCol : this.getters.getNumberCols(cmd.sheetId) - 1,
39198
+ top: !isCol ? start + deltaRow : 0,
39199
+ bottom: !isCol ? end + deltaRow : this.getters.getNumberRows(cmd.sheetId) - 1,
39200
+ },
39201
+ ];
39202
+ const state = new ClipboardCellsState(target, "CUT", this.getters, this.dispatch, this.selection);
39203
+ const pasteTarget = [
39204
+ {
39205
+ left: isCol ? cmd.base : 0,
39206
+ right: isCol ? cmd.base + thickness - 1 : this.getters.getNumberCols(cmd.sheetId) - 1,
39207
+ top: !isCol ? cmd.base : 0,
39208
+ bottom: !isCol ? cmd.base + thickness - 1 : this.getters.getNumberRows(cmd.sheetId) - 1,
39209
+ },
39210
+ ];
39211
+ state.paste(pasteTarget, { selectTarget: true });
39101
39212
  const toRemove = isBasedBefore ? cmd.elements.map((el) => el + thickness) : cmd.elements;
39102
39213
  let currentIndex = cmd.base;
39103
39214
  for (const element of toRemove) {
@@ -39224,6 +39335,7 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
39224
39335
  "getSheetPosition",
39225
39336
  "isSelected",
39226
39337
  "getElementsFromSelection",
39338
+ "isGridSelectionActive",
39227
39339
  ];
39228
39340
 
39229
39341
  const corePluginRegistry = new Registry()
@@ -42016,6 +42128,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
42016
42128
  anchor: { zone, cell: this.anchor.cell },
42017
42129
  });
42018
42130
  }
42131
+ isListening(owner) {
42132
+ return this.stream.isListening(owner);
42133
+ }
42019
42134
  /**
42020
42135
  * Process a new anchor selection event. If the new anchor is inside
42021
42136
  * the sheet boundaries, the event is pushed to the event stream to
@@ -44304,9 +44419,9 @@ day_count_convention (number, default=${DEFAULT_DAY_COUNT_CONVENTION} ) ${_lt("A
44304
44419
  Object.defineProperty(exports, '__esModule', { value: true });
44305
44420
 
44306
44421
 
44307
- __info__.version = '16.1.19';
44308
- __info__.date = '2023-08-29T13:54:21.626Z';
44309
- __info__.hash = '053a843';
44422
+ __info__.version = '16.1.23';
44423
+ __info__.date = '2023-10-10T07:27:03.376Z';
44424
+ __info__.hash = '13bfa8f';
44310
44425
 
44311
44426
 
44312
44427
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);