@odoo/o-spreadsheet 17.1.16 → 17.1.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.
@@ -2,9 +2,9 @@
2
2
  /**
3
3
  * This file is generated by o-spreadsheet build tools. Do not edit it.
4
4
  * @see https://github.com/odoo/o-spreadsheet
5
- * @version 17.1.16
6
- * @date 2024-05-24T11:27:23.083Z
7
- * @hash 3a41c3a
5
+ * @version 17.1.17
6
+ * @date 2024-06-03T14:54:06.711Z
7
+ * @hash 7dedb2f
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -2606,7 +2606,7 @@
2606
2606
  return false;
2607
2607
  }
2608
2608
  if (typeof operand === "number" && operator === "=") {
2609
- return toString(value) === toString(operand);
2609
+ return value.toString() === operand.toString();
2610
2610
  }
2611
2611
  if (operator === "<>" || operator === "=") {
2612
2612
  let result;
@@ -2666,14 +2666,13 @@
2666
2666
  if (countArg % 2 === 1) {
2667
2667
  throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects criteria_range and criterion to be in pairs."));
2668
2668
  }
2669
- const dimRow = args[0].length;
2670
- const dimCol = args[0][0].length;
2669
+ const firstArg = toMatrix(args[0]);
2670
+ const dimRow = firstArg.length;
2671
+ const dimCol = firstArg[0].length;
2671
2672
  let predicates = [];
2672
2673
  for (let i = 0; i < countArg - 1; i += 2) {
2673
- const criteriaRange = args[i];
2674
- if (!isMatrix(criteriaRange) ||
2675
- criteriaRange.length !== dimRow ||
2676
- criteriaRange[0].length !== dimCol) {
2674
+ const criteriaRange = toMatrix(args[i]);
2675
+ if (criteriaRange.length !== dimRow || criteriaRange[0].length !== dimCol) {
2677
2676
  throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects criteria_range to have the same dimension"));
2678
2677
  }
2679
2678
  const description = toString(args[i + 1]);
@@ -2683,7 +2682,7 @@
2683
2682
  for (let j = 0; j < dimCol; j++) {
2684
2683
  let validatedPredicates = true;
2685
2684
  for (let k = 0; k < countArg - 1; k += 2) {
2686
- const criteriaValue = args[k][i][j].value;
2685
+ const criteriaValue = toMatrix(args[k])[i][j].value;
2687
2686
  const criterion = predicates[k / 2];
2688
2687
  validatedPredicates = evaluatePredicate(criteriaValue ?? undefined, criterion);
2689
2688
  if (!validatedPredicates) {
@@ -4371,8 +4370,11 @@
4371
4370
  /**
4372
4371
  * Create a range from a xc. If the xc is empty, this function returns undefined.
4373
4372
  */
4374
- function createRange(getters, sheetId, range) {
4375
- return range ? getters.getRangeFromSheetXC(sheetId, range) : undefined;
4373
+ function createValidRange(getters, sheetId, xc) {
4374
+ if (!xc)
4375
+ return;
4376
+ const range = getters.getRangeFromSheetXC(sheetId, xc);
4377
+ return !(range.invalidSheetName || range.invalidXc) ? range : undefined;
4376
4378
  }
4377
4379
  /**
4378
4380
  * Spread multiple colrows zone to one row/col zone and add a many new input range as needed.
@@ -5303,8 +5305,8 @@
5303
5305
  type = "scorecard";
5304
5306
  constructor(definition, sheetId, getters) {
5305
5307
  super(definition, sheetId, getters);
5306
- this.keyValue = createRange(getters, sheetId, definition.keyValue);
5307
- this.baseline = createRange(getters, sheetId, definition.baseline);
5308
+ this.keyValue = createValidRange(getters, sheetId, definition.keyValue);
5309
+ this.baseline = createValidRange(getters, sheetId, definition.baseline);
5308
5310
  this.baselineMode = definition.baselineMode;
5309
5311
  this.baselineDescr = definition.baselineDescr;
5310
5312
  this.background = definition.background;
@@ -8647,7 +8649,7 @@
8647
8649
  constructor(definition, sheetId, getters) {
8648
8650
  super(definition, sheetId, getters);
8649
8651
  this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
8650
- this.labelRange = createRange(getters, sheetId, definition.labelRange);
8652
+ this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
8651
8653
  this.background = definition.background;
8652
8654
  this.verticalAxisPosition = definition.verticalAxisPosition;
8653
8655
  this.legendPosition = definition.legendPosition;
@@ -8890,7 +8892,7 @@
8890
8892
  type = "gauge";
8891
8893
  constructor(definition, sheetId, getters) {
8892
8894
  super(definition, sheetId, getters);
8893
- this.dataRange = createRange(this.getters, this.sheetId, definition.dataRange);
8895
+ this.dataRange = createValidRange(this.getters, this.sheetId, definition.dataRange);
8894
8896
  this.sectionRule = definition.sectionRule;
8895
8897
  this.background = definition.background;
8896
8898
  }
@@ -9224,7 +9226,7 @@
9224
9226
  constructor(definition, sheetId, getters) {
9225
9227
  super(definition, sheetId, getters);
9226
9228
  this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
9227
- this.labelRange = createRange(this.getters, sheetId, definition.labelRange);
9229
+ this.labelRange = createValidRange(this.getters, sheetId, definition.labelRange);
9228
9230
  this.background = definition.background;
9229
9231
  this.verticalAxisPosition = definition.verticalAxisPosition;
9230
9232
  this.legendPosition = definition.legendPosition;
@@ -9544,7 +9546,7 @@
9544
9546
  constructor(definition, sheetId, getters) {
9545
9547
  super(definition, sheetId, getters);
9546
9548
  this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
9547
- this.labelRange = createRange(getters, sheetId, definition.labelRange);
9549
+ this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
9548
9550
  this.background = definition.background;
9549
9551
  this.legendPosition = definition.legendPosition;
9550
9552
  this.aggregated = definition.aggregated;
@@ -11188,6 +11190,9 @@
11188
11190
  if (types.some((t) => t.startsWith("RANGE"))) {
11189
11191
  result.acceptMatrix = true;
11190
11192
  }
11193
+ if (types.every((t) => t.startsWith("RANGE"))) {
11194
+ result.acceptMatrixOnly = true;
11195
+ }
11191
11196
  return result;
11192
11197
  }
11193
11198
  /**
@@ -11469,11 +11474,16 @@
11469
11474
  compute: function (array, ...columns) {
11470
11475
  const _array = toMatrix(array);
11471
11476
  const _columns = flattenRowFirst(columns, (item) => toInteger(item?.value, this.locale));
11472
- assert(() => _columns.every((col) => col > 0 && col <= _array.length), _t("The columns arguments must be between 1 and %s (got %s).", _array.length.toString(), (_columns.find((col) => col <= 0 || col > _array.length) || 0).toString()));
11477
+ const argOutOfRange = _columns.filter((col) => col === 0 || _array.length < Math.abs(col));
11478
+ assert(() => argOutOfRange.length === 0, _t("The columns arguments must be between -%s and %s (got %s), excluding 0.", _array.length.toString(), _array.length.toString(), argOutOfRange.join(",")));
11473
11479
  const result = Array(_columns.length);
11474
11480
  for (let col = 0; col < _columns.length; col++) {
11475
- const colIndex = _columns[col] - 1; // -1 because columns arguments are 1-indexed
11476
- result[col] = _array[colIndex];
11481
+ if (_columns[col] > 0) {
11482
+ result[col] = _array[_columns[col] - 1]; // -1 because columns arguments are 1-indexed
11483
+ }
11484
+ else {
11485
+ result[col] = _array[_array.length + _columns[col]];
11486
+ }
11477
11487
  }
11478
11488
  return result;
11479
11489
  },
@@ -11494,8 +11504,14 @@
11494
11504
  const _array = toMatrix(array);
11495
11505
  const _rows = flattenRowFirst(rows, (item) => toInteger(item?.value, this.locale));
11496
11506
  const _nbColumns = _array.length;
11497
- assert(() => _rows.every((row) => row > 0 && row <= _array[0].length), _t("The rows arguments must be between 1 and %s (got %s).", _array[0].length.toString(), (_rows.find((row) => row <= 0 || row > _array[0].length) || 0).toString()));
11498
- return generateMatrix(_nbColumns, _rows.length, (col, row) => _array[col][_rows[row] - 1]); // -1 because rows arguments are 1-indexed
11507
+ const argOutOfRange = _rows.filter((row) => row === 0 || _array[0].length < Math.abs(row));
11508
+ assert(() => argOutOfRange.length === 0, _t("The rows arguments must be between -%s and %s (got %s), excluding 0.", _array[0].length.toString(), _array[0].length.toString(), argOutOfRange.join(",")));
11509
+ return generateMatrix(_nbColumns, _rows.length, (col, row) => {
11510
+ if (_rows[row] > 0) {
11511
+ return _array[col][_rows[row] - 1]; // -1 because columns arguments are 1-indexed
11512
+ }
11513
+ return _array[col][_array[col].length + _rows[row]];
11514
+ });
11499
11515
  },
11500
11516
  isExported: true,
11501
11517
  };
@@ -12403,7 +12419,7 @@
12403
12419
  compute: function (range, ...args) {
12404
12420
  let uniqueValues = new Set();
12405
12421
  visitMatchingRanges(args, (i, j) => {
12406
- const data = range[i][j];
12422
+ const data = range[i]?.[j];
12407
12423
  if (isDefined(data)) {
12408
12424
  uniqueValues.add(data.value);
12409
12425
  }
@@ -13033,7 +13049,7 @@
13033
13049
  }
13034
13050
  let sum = 0;
13035
13051
  visitMatchingRanges([criteriaRange, criterion], (i, j) => {
13036
- const value = sumRange[i][j].value;
13052
+ const value = sumRange[i]?.[j]?.value;
13037
13053
  if (typeof value === "number") {
13038
13054
  sum += value;
13039
13055
  }
@@ -13058,7 +13074,7 @@
13058
13074
  compute: function (sumRange, ...criters) {
13059
13075
  let sum = 0;
13060
13076
  visitMatchingRanges(criters, (i, j) => {
13061
- const value = sumRange[i][j].value;
13077
+ const value = sumRange[i]?.[j]?.value;
13062
13078
  if (typeof value === "number") {
13063
13079
  sum += value;
13064
13080
  }
@@ -13605,7 +13621,7 @@
13605
13621
  let count = 0;
13606
13622
  let sum = 0;
13607
13623
  visitMatchingRanges([criteriaRange, criterion], (i, j) => {
13608
- const value = _averageRange[i][j].value;
13624
+ const value = _averageRange[i]?.[j]?.value;
13609
13625
  if (typeof value === "number") {
13610
13626
  count += 1;
13611
13627
  sum += value;
@@ -13634,7 +13650,7 @@
13634
13650
  let count = 0;
13635
13651
  let sum = 0;
13636
13652
  visitMatchingRanges(args, (i, j) => {
13637
- const value = _averageRange[i][j].value;
13653
+ const value = _averageRange[i]?.[j]?.value;
13638
13654
  if (typeof value === "number") {
13639
13655
  count += 1;
13640
13656
  sum += value;
@@ -13939,7 +13955,7 @@
13939
13955
  compute: function (range, ...args) {
13940
13956
  let result = -Infinity;
13941
13957
  visitMatchingRanges(args, (i, j) => {
13942
- const value = range[i][j].value;
13958
+ const value = range[i]?.[j]?.value;
13943
13959
  if (typeof value === "number") {
13944
13960
  result = result < value ? value : result;
13945
13961
  }
@@ -14022,7 +14038,7 @@
14022
14038
  compute: function (range, ...args) {
14023
14039
  let result = Infinity;
14024
14040
  visitMatchingRanges(args, (i, j) => {
14025
- const value = range[i][j].value;
14041
+ const value = range[i]?.[j]?.value;
14026
14042
  if (typeof value === "number") {
14027
14043
  result = result > value ? value : result;
14028
14044
  }
@@ -19799,6 +19815,9 @@
19799
19815
  }
19800
19816
  args[i] = arg[0][0];
19801
19817
  }
19818
+ if (!isMatrix(arg) && argDefinition.acceptMatrixOnly) {
19819
+ throw new BadExpressionError(_t("Function [[FUNCTION_NAME]] expects the parameter '%s' to be reference to a cell or range.", (i + 1).toString()));
19820
+ }
19802
19821
  }
19803
19822
  return descr.compute.apply(this, args);
19804
19823
  }
@@ -22151,7 +22170,7 @@
22151
22170
  }
22152
22171
  const getters = this.env.model.getters;
22153
22172
  const sheetId = getters.getActiveSheetId();
22154
- const labelRange = createRange(getters, sheetId, this.labelRange);
22173
+ const labelRange = createValidRange(getters, sheetId, this.labelRange);
22155
22174
  const dataSets = createDataSets(getters, this.dataSeriesRanges, sheetId, this.props.definition.dataSetsHaveTitle);
22156
22175
  if (dataSets.length) {
22157
22176
  return dataSets[0].dataRange.zone.top + 1;
@@ -26274,14 +26293,14 @@
26274
26293
  }
26275
26294
  onKeyDown(ev) {
26276
26295
  const figure = this.props.figure;
26277
- switch (ev.key) {
26296
+ const keyDownShortcut = keyboardEventToShortcutString(ev);
26297
+ switch (keyDownShortcut) {
26278
26298
  case "Delete":
26279
26299
  this.env.model.dispatch("DELETE_FIGURE", {
26280
26300
  sheetId: this.env.model.getters.getActiveSheetId(),
26281
26301
  id: figure.id,
26282
26302
  });
26283
26303
  this.props.onFigureDeleted();
26284
- ev.stopPropagation();
26285
26304
  ev.preventDefault();
26286
26305
  ev.stopPropagation();
26287
26306
  break;
@@ -26302,7 +26321,22 @@
26302
26321
  x: figure.x + delta[0],
26303
26322
  y: figure.y + delta[1],
26304
26323
  });
26324
+ ev.preventDefault();
26325
+ ev.stopPropagation();
26326
+ break;
26327
+ case "Ctrl+A":
26328
+ // Maybe in the future we will implement a way to select all figures
26329
+ ev.preventDefault();
26305
26330
  ev.stopPropagation();
26331
+ break;
26332
+ case "Ctrl+Y":
26333
+ case "Ctrl+Z":
26334
+ if (keyDownShortcut === "Ctrl+Y") {
26335
+ this.env.model.dispatch("REQUEST_REDO");
26336
+ }
26337
+ else if (keyDownShortcut === "Ctrl+Z") {
26338
+ this.env.model.dispatch("REQUEST_UNDO");
26339
+ }
26306
26340
  ev.preventDefault();
26307
26341
  ev.stopPropagation();
26308
26342
  break;
@@ -35763,12 +35797,6 @@
35763
35797
  // detect when an argument need to be evaluated as a meta argument
35764
35798
  const isMeta = argTypes.includes("META");
35765
35799
  const hasRange = argTypes.some((t) => isRangeType(t));
35766
- const isRangeOnly = argTypes.every((t) => isRangeType(t));
35767
- if (isRangeOnly) {
35768
- if (!isRangeInput(currentArg)) {
35769
- throw new BadExpressionError(_t("Function %s expects the parameter %s to be reference to a cell or range, not a %s.", functionName, (i + 1).toString(), currentArg.type.toLowerCase()));
35770
- }
35771
- }
35772
35800
  compiledArgs.push(compileAST(currentArg, isMeta, hasRange, {
35773
35801
  functionName,
35774
35802
  paramIndex: i + 1,
@@ -35939,16 +35967,6 @@
35939
35967
  function isRangeType(type) {
35940
35968
  return type.startsWith("RANGE");
35941
35969
  }
35942
- function isRangeInput(arg) {
35943
- if (arg.type === "REFERENCE") {
35944
- return true;
35945
- }
35946
- if (arg.type === "FUNCALL") {
35947
- const fnDef = functions$1[arg.value.toUpperCase()];
35948
- return fnDef && isRangeType(fnDef.returns[0]);
35949
- }
35950
- return false;
35951
- }
35952
35970
 
35953
35971
  /**
35954
35972
  * Add the following information on tokens:
@@ -39061,6 +39079,9 @@
39061
39079
  if (range.invalidXc) {
39062
39080
  return range.invalidXc;
39063
39081
  }
39082
+ if (!this.getters.tryGetSheet(range.sheetId)) {
39083
+ return CellErrorType.InvalidReference;
39084
+ }
39064
39085
  if (range.zone.bottom - range.zone.top < 0 || range.zone.right - range.zone.left < 0) {
39065
39086
  return CellErrorType.InvalidReference;
39066
39087
  }
@@ -42508,16 +42529,22 @@
42508
42529
  let newContent = undefined;
42509
42530
  let newFormat = undefined;
42510
42531
  let isExported = true;
42532
+ const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
42511
42533
  const formulaCell = this.getCorrespondingFormulaCell(position);
42512
42534
  if (formulaCell) {
42513
42535
  isExported = isExportableToExcel(formulaCell.compiledFormula.tokens);
42514
42536
  isFormula = isExported;
42515
42537
  if (!isExported) {
42516
- newContent = value.toString();
42517
- newFormat = evaluatedCell.format;
42538
+ // If the cell contains a non-exported formula and that is evaluates to
42539
+ // nothing* ,we don't export it.
42540
+ // * non-falsy value are relevant and so are 0 and FALSE, which only leaves
42541
+ // the empty string.
42542
+ if (value !== "") {
42543
+ newContent = value.toString();
42544
+ newFormat = evaluatedCell.format;
42545
+ }
42518
42546
  }
42519
42547
  }
42520
- const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
42521
42548
  const exportedCellData = exportedSheetData.cells[xc] || {};
42522
42549
  const format = newFormat
42523
42550
  ? getItemId(newFormat, data.formats)
@@ -52014,9 +52041,11 @@
52014
52041
  if (ev.key === "Enter") {
52015
52042
  ev.preventDefault();
52016
52043
  this.stopEdition();
52044
+ this.env.focusableElement.focus();
52017
52045
  }
52018
52046
  if (ev.key === "Escape") {
52019
52047
  this.cancelEdition();
52048
+ this.env.focusableElement.focus();
52020
52049
  }
52021
52050
  }
52022
52051
  onClickSheetName(ev) {
@@ -56711,7 +56740,11 @@
56711
56740
  let cellNode = escapeXml ``;
56712
56741
  // Either formula or static value inside the cell
56713
56742
  if (cell.isFormula) {
56714
- ({ attrs: additionalAttrs, node: cellNode } = addFormula(cell));
56743
+ const res = addFormula(cell);
56744
+ if (!res) {
56745
+ continue;
56746
+ }
56747
+ ({ attrs: additionalAttrs, node: cellNode } = res);
56715
56748
  }
56716
56749
  else if (cell.content && isMarkdownLink(cell.content)) {
56717
56750
  const { label } = parseMarkdownLink(cell.content);
@@ -57741,9 +57774,9 @@
57741
57774
  exports.tokenize = tokenize;
57742
57775
 
57743
57776
 
57744
- __info__.version = "17.1.16";
57745
- __info__.date = "2024-05-24T11:27:23.083Z";
57746
- __info__.hash = "3a41c3a";
57777
+ __info__.version = "17.1.17";
57778
+ __info__.date = "2024-06-03T14:54:06.711Z";
57779
+ __info__.hash = "7dedb2f";
57747
57780
 
57748
57781
 
57749
57782
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);