@odoo/o-spreadsheet 17.1.15 → 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.15
6
- * @date 2024-05-15T09:22:23.258Z
7
- * @hash fc959fe
5
+ * @version 17.1.17
6
+ * @date 2024-06-03T14:54:06.711Z
7
+ * @hash 7dedb2f
8
8
  */
9
9
 
10
10
  'use strict';
@@ -567,8 +567,9 @@ function deepEquals(o1, o2, ignoreFunctions) {
567
567
  return false;
568
568
  }
569
569
  else {
570
- if (ignoreFunctions && typeOfO1Key === "function")
571
- return true;
570
+ if (ignoreFunctions && typeOfO1Key === "function") {
571
+ continue;
572
+ }
572
573
  if (o1[key] !== o2[key])
573
574
  return false;
574
575
  }
@@ -1802,7 +1803,7 @@ class LazyTranslatedString extends String {
1802
1803
  }
1803
1804
  valueOf() {
1804
1805
  const str = super.valueOf();
1805
- return _loaded() ? sprintf(_translate(str), ...this.values) : str;
1806
+ return _loaded() ? sprintf(_translate(str), ...this.values) : sprintf(str, ...this.values);
1806
1807
  }
1807
1808
  toString() {
1808
1809
  return this.valueOf();
@@ -2606,7 +2607,7 @@ function evaluatePredicate(value, criterion) {
2606
2607
  return false;
2607
2608
  }
2608
2609
  if (typeof operand === "number" && operator === "=") {
2609
- return toString(value) === toString(operand);
2610
+ return value.toString() === operand.toString();
2610
2611
  }
2611
2612
  if (operator === "<>" || operator === "=") {
2612
2613
  let result;
@@ -2666,14 +2667,13 @@ function visitMatchingRanges(args, cb, locale, isQuery = false) {
2666
2667
  if (countArg % 2 === 1) {
2667
2668
  throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects criteria_range and criterion to be in pairs."));
2668
2669
  }
2669
- const dimRow = args[0].length;
2670
- const dimCol = args[0][0].length;
2670
+ const firstArg = toMatrix(args[0]);
2671
+ const dimRow = firstArg.length;
2672
+ const dimCol = firstArg[0].length;
2671
2673
  let predicates = [];
2672
2674
  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) {
2675
+ const criteriaRange = toMatrix(args[i]);
2676
+ if (criteriaRange.length !== dimRow || criteriaRange[0].length !== dimCol) {
2677
2677
  throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects criteria_range to have the same dimension"));
2678
2678
  }
2679
2679
  const description = toString(args[i + 1]);
@@ -2683,7 +2683,7 @@ function visitMatchingRanges(args, cb, locale, isQuery = false) {
2683
2683
  for (let j = 0; j < dimCol; j++) {
2684
2684
  let validatedPredicates = true;
2685
2685
  for (let k = 0; k < countArg - 1; k += 2) {
2686
- const criteriaValue = args[k][i][j].value;
2686
+ const criteriaValue = toMatrix(args[k])[i][j].value;
2687
2687
  const criterion = predicates[k / 2];
2688
2688
  validatedPredicates = evaluatePredicate(criteriaValue ?? undefined, criterion);
2689
2689
  if (!validatedPredicates) {
@@ -4371,8 +4371,11 @@ function copyRangeWithNewSheetId(sheetIdFrom, sheetIdTo, range) {
4371
4371
  /**
4372
4372
  * Create a range from a xc. If the xc is empty, this function returns undefined.
4373
4373
  */
4374
- function createRange(getters, sheetId, range) {
4375
- return range ? getters.getRangeFromSheetXC(sheetId, range) : undefined;
4374
+ function createValidRange(getters, sheetId, xc) {
4375
+ if (!xc)
4376
+ return;
4377
+ const range = getters.getRangeFromSheetXC(sheetId, xc);
4378
+ return !(range.invalidSheetName || range.invalidXc) ? range : undefined;
4376
4379
  }
4377
4380
  /**
4378
4381
  * Spread multiple colrows zone to one row/col zone and add a many new input range as needed.
@@ -5303,8 +5306,8 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
5303
5306
  type = "scorecard";
5304
5307
  constructor(definition, sheetId, getters) {
5305
5308
  super(definition, sheetId, getters);
5306
- this.keyValue = createRange(getters, sheetId, definition.keyValue);
5307
- this.baseline = createRange(getters, sheetId, definition.baseline);
5309
+ this.keyValue = createValidRange(getters, sheetId, definition.keyValue);
5310
+ this.baseline = createValidRange(getters, sheetId, definition.baseline);
5308
5311
  this.baselineMode = definition.baselineMode;
5309
5312
  this.baselineDescr = definition.baselineDescr;
5310
5313
  this.background = definition.background;
@@ -8647,7 +8650,7 @@ class BarChart extends AbstractChart {
8647
8650
  constructor(definition, sheetId, getters) {
8648
8651
  super(definition, sheetId, getters);
8649
8652
  this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
8650
- this.labelRange = createRange(getters, sheetId, definition.labelRange);
8653
+ this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
8651
8654
  this.background = definition.background;
8652
8655
  this.verticalAxisPosition = definition.verticalAxisPosition;
8653
8656
  this.legendPosition = definition.legendPosition;
@@ -8890,7 +8893,7 @@ class GaugeChart extends AbstractChart {
8890
8893
  type = "gauge";
8891
8894
  constructor(definition, sheetId, getters) {
8892
8895
  super(definition, sheetId, getters);
8893
- this.dataRange = createRange(this.getters, this.sheetId, definition.dataRange);
8896
+ this.dataRange = createValidRange(this.getters, this.sheetId, definition.dataRange);
8894
8897
  this.sectionRule = definition.sectionRule;
8895
8898
  this.background = definition.background;
8896
8899
  }
@@ -9224,7 +9227,7 @@ class LineChart extends AbstractChart {
9224
9227
  constructor(definition, sheetId, getters) {
9225
9228
  super(definition, sheetId, getters);
9226
9229
  this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
9227
- this.labelRange = createRange(this.getters, sheetId, definition.labelRange);
9230
+ this.labelRange = createValidRange(this.getters, sheetId, definition.labelRange);
9228
9231
  this.background = definition.background;
9229
9232
  this.verticalAxisPosition = definition.verticalAxisPosition;
9230
9233
  this.legendPosition = definition.legendPosition;
@@ -9544,7 +9547,7 @@ class PieChart extends AbstractChart {
9544
9547
  constructor(definition, sheetId, getters) {
9545
9548
  super(definition, sheetId, getters);
9546
9549
  this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
9547
- this.labelRange = createRange(getters, sheetId, definition.labelRange);
9550
+ this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
9548
9551
  this.background = definition.background;
9549
9552
  this.legendPosition = definition.legendPosition;
9550
9553
  this.aggregated = definition.aggregated;
@@ -11188,6 +11191,9 @@ function makeArg(str, description) {
11188
11191
  if (types.some((t) => t.startsWith("RANGE"))) {
11189
11192
  result.acceptMatrix = true;
11190
11193
  }
11194
+ if (types.every((t) => t.startsWith("RANGE"))) {
11195
+ result.acceptMatrixOnly = true;
11196
+ }
11191
11197
  return result;
11192
11198
  }
11193
11199
  /**
@@ -11469,11 +11475,16 @@ const CHOOSECOLS = {
11469
11475
  compute: function (array, ...columns) {
11470
11476
  const _array = toMatrix(array);
11471
11477
  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()));
11478
+ const argOutOfRange = _columns.filter((col) => col === 0 || _array.length < Math.abs(col));
11479
+ 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
11480
  const result = Array(_columns.length);
11474
11481
  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];
11482
+ if (_columns[col] > 0) {
11483
+ result[col] = _array[_columns[col] - 1]; // -1 because columns arguments are 1-indexed
11484
+ }
11485
+ else {
11486
+ result[col] = _array[_array.length + _columns[col]];
11487
+ }
11477
11488
  }
11478
11489
  return result;
11479
11490
  },
@@ -11494,8 +11505,14 @@ const CHOOSEROWS = {
11494
11505
  const _array = toMatrix(array);
11495
11506
  const _rows = flattenRowFirst(rows, (item) => toInteger(item?.value, this.locale));
11496
11507
  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
11508
+ const argOutOfRange = _rows.filter((row) => row === 0 || _array[0].length < Math.abs(row));
11509
+ 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(",")));
11510
+ return generateMatrix(_nbColumns, _rows.length, (col, row) => {
11511
+ if (_rows[row] > 0) {
11512
+ return _array[col][_rows[row] - 1]; // -1 because columns arguments are 1-indexed
11513
+ }
11514
+ return _array[col][_array[col].length + _rows[row]];
11515
+ });
11499
11516
  },
11500
11517
  isExported: true,
11501
11518
  };
@@ -12403,7 +12420,7 @@ const COUNTUNIQUEIFS = {
12403
12420
  compute: function (range, ...args) {
12404
12421
  let uniqueValues = new Set();
12405
12422
  visitMatchingRanges(args, (i, j) => {
12406
- const data = range[i][j];
12423
+ const data = range[i]?.[j];
12407
12424
  if (isDefined(data)) {
12408
12425
  uniqueValues.add(data.value);
12409
12426
  }
@@ -13033,7 +13050,7 @@ const SUMIF = {
13033
13050
  }
13034
13051
  let sum = 0;
13035
13052
  visitMatchingRanges([criteriaRange, criterion], (i, j) => {
13036
- const value = sumRange[i][j].value;
13053
+ const value = sumRange[i]?.[j]?.value;
13037
13054
  if (typeof value === "number") {
13038
13055
  sum += value;
13039
13056
  }
@@ -13058,7 +13075,7 @@ const SUMIFS = {
13058
13075
  compute: function (sumRange, ...criters) {
13059
13076
  let sum = 0;
13060
13077
  visitMatchingRanges(criters, (i, j) => {
13061
- const value = sumRange[i][j].value;
13078
+ const value = sumRange[i]?.[j]?.value;
13062
13079
  if (typeof value === "number") {
13063
13080
  sum += value;
13064
13081
  }
@@ -13605,7 +13622,7 @@ const AVERAGEIF = {
13605
13622
  let count = 0;
13606
13623
  let sum = 0;
13607
13624
  visitMatchingRanges([criteriaRange, criterion], (i, j) => {
13608
- const value = _averageRange[i][j].value;
13625
+ const value = _averageRange[i]?.[j]?.value;
13609
13626
  if (typeof value === "number") {
13610
13627
  count += 1;
13611
13628
  sum += value;
@@ -13634,7 +13651,7 @@ const AVERAGEIFS = {
13634
13651
  let count = 0;
13635
13652
  let sum = 0;
13636
13653
  visitMatchingRanges(args, (i, j) => {
13637
- const value = _averageRange[i][j].value;
13654
+ const value = _averageRange[i]?.[j]?.value;
13638
13655
  if (typeof value === "number") {
13639
13656
  count += 1;
13640
13657
  sum += value;
@@ -13939,7 +13956,7 @@ const MAXIFS = {
13939
13956
  compute: function (range, ...args) {
13940
13957
  let result = -Infinity;
13941
13958
  visitMatchingRanges(args, (i, j) => {
13942
- const value = range[i][j].value;
13959
+ const value = range[i]?.[j]?.value;
13943
13960
  if (typeof value === "number") {
13944
13961
  result = result < value ? value : result;
13945
13962
  }
@@ -14022,7 +14039,7 @@ const MINIFS = {
14022
14039
  compute: function (range, ...args) {
14023
14040
  let result = Infinity;
14024
14041
  visitMatchingRanges(args, (i, j) => {
14025
- const value = range[i][j].value;
14042
+ const value = range[i]?.[j]?.value;
14026
14043
  if (typeof value === "number") {
14027
14044
  result = result > value ? value : result;
14028
14045
  }
@@ -19799,6 +19816,9 @@ function addInputHandling(descr) {
19799
19816
  }
19800
19817
  args[i] = arg[0][0];
19801
19818
  }
19819
+ if (!isMatrix(arg) && argDefinition.acceptMatrixOnly) {
19820
+ throw new BadExpressionError(_t("Function [[FUNCTION_NAME]] expects the parameter '%s' to be reference to a cell or range.", (i + 1).toString()));
19821
+ }
19802
19822
  }
19803
19823
  return descr.compute.apply(this, args);
19804
19824
  }
@@ -22151,7 +22171,7 @@ class LineBarPieConfigPanel extends owl.Component {
22151
22171
  }
22152
22172
  const getters = this.env.model.getters;
22153
22173
  const sheetId = getters.getActiveSheetId();
22154
- const labelRange = createRange(getters, sheetId, this.labelRange);
22174
+ const labelRange = createValidRange(getters, sheetId, this.labelRange);
22155
22175
  const dataSets = createDataSets(getters, this.dataSeriesRanges, sheetId, this.props.definition.dataSetsHaveTitle);
22156
22176
  if (dataSets.length) {
22157
22177
  return dataSets[0].dataRange.zone.top + 1;
@@ -26274,14 +26294,14 @@ class FigureComponent extends owl.Component {
26274
26294
  }
26275
26295
  onKeyDown(ev) {
26276
26296
  const figure = this.props.figure;
26277
- switch (ev.key) {
26297
+ const keyDownShortcut = keyboardEventToShortcutString(ev);
26298
+ switch (keyDownShortcut) {
26278
26299
  case "Delete":
26279
26300
  this.env.model.dispatch("DELETE_FIGURE", {
26280
26301
  sheetId: this.env.model.getters.getActiveSheetId(),
26281
26302
  id: figure.id,
26282
26303
  });
26283
26304
  this.props.onFigureDeleted();
26284
- ev.stopPropagation();
26285
26305
  ev.preventDefault();
26286
26306
  ev.stopPropagation();
26287
26307
  break;
@@ -26302,7 +26322,22 @@ class FigureComponent extends owl.Component {
26302
26322
  x: figure.x + delta[0],
26303
26323
  y: figure.y + delta[1],
26304
26324
  });
26325
+ ev.preventDefault();
26305
26326
  ev.stopPropagation();
26327
+ break;
26328
+ case "Ctrl+A":
26329
+ // Maybe in the future we will implement a way to select all figures
26330
+ ev.preventDefault();
26331
+ ev.stopPropagation();
26332
+ break;
26333
+ case "Ctrl+Y":
26334
+ case "Ctrl+Z":
26335
+ if (keyDownShortcut === "Ctrl+Y") {
26336
+ this.env.model.dispatch("REQUEST_REDO");
26337
+ }
26338
+ else if (keyDownShortcut === "Ctrl+Z") {
26339
+ this.env.model.dispatch("REQUEST_UNDO");
26340
+ }
26306
26341
  ev.preventDefault();
26307
26342
  ev.stopPropagation();
26308
26343
  break;
@@ -27177,7 +27212,7 @@ class Composer extends owl.Component {
27177
27212
  "Ctrl+Enter": this.processNewLineEvent,
27178
27213
  Escape: this.processEscapeKey,
27179
27214
  F2: () => console.warn("Not implemented"),
27180
- F4: this.processF4Key,
27215
+ F4: (ev) => this.processF4Key(ev),
27181
27216
  Tab: (ev) => this.processTabKey(ev, "right"),
27182
27217
  "Shift+Tab": (ev) => this.processTabKey(ev, "left"),
27183
27218
  };
@@ -27291,9 +27326,10 @@ class Composer extends owl.Component {
27291
27326
  processEscapeKey() {
27292
27327
  this.env.model.dispatch("CANCEL_EDITION");
27293
27328
  }
27294
- processF4Key() {
27329
+ processF4Key(ev) {
27295
27330
  this.env.model.dispatch("CYCLE_EDITION_REFERENCES");
27296
27331
  this.processContent();
27332
+ ev.stopPropagation();
27297
27333
  }
27298
27334
  processNumpadDecimal(ev) {
27299
27335
  ev.stopPropagation();
@@ -35762,12 +35798,6 @@ function compileTokens(tokens) {
35762
35798
  // detect when an argument need to be evaluated as a meta argument
35763
35799
  const isMeta = argTypes.includes("META");
35764
35800
  const hasRange = argTypes.some((t) => isRangeType(t));
35765
- const isRangeOnly = argTypes.every((t) => isRangeType(t));
35766
- if (isRangeOnly) {
35767
- if (!isRangeInput(currentArg)) {
35768
- 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()));
35769
- }
35770
- }
35771
35801
  compiledArgs.push(compileAST(currentArg, isMeta, hasRange, {
35772
35802
  functionName,
35773
35803
  paramIndex: i + 1,
@@ -35938,16 +35968,6 @@ function assertEnoughArgs(ast) {
35938
35968
  function isRangeType(type) {
35939
35969
  return type.startsWith("RANGE");
35940
35970
  }
35941
- function isRangeInput(arg) {
35942
- if (arg.type === "REFERENCE") {
35943
- return true;
35944
- }
35945
- if (arg.type === "FUNCALL") {
35946
- const fnDef = functions$1[arg.value.toUpperCase()];
35947
- return fnDef && isRangeType(fnDef.returns[0]);
35948
- }
35949
- return false;
35950
- }
35951
35971
 
35952
35972
  /**
35953
35973
  * Add the following information on tokens:
@@ -38454,7 +38474,12 @@ class MergePlugin extends CorePlugin {
38454
38474
  * if they have at least a common cell
38455
38475
  */
38456
38476
  doesIntersectMerge(sheetId, zone) {
38457
- return positions(zone).some(({ col, row }) => this.getMerge({ sheetId, col, row }) !== undefined);
38477
+ for (const merge of this.getMerges(sheetId)) {
38478
+ if (overlap(zone, merge)) {
38479
+ return true;
38480
+ }
38481
+ }
38482
+ return false;
38458
38483
  }
38459
38484
  /**
38460
38485
  * Returns true if two columns have at least one merge in common
@@ -39055,6 +39080,9 @@ class RangeAdapter {
39055
39080
  if (range.invalidXc) {
39056
39081
  return range.invalidXc;
39057
39082
  }
39083
+ if (!this.getters.tryGetSheet(range.sheetId)) {
39084
+ return CellErrorType.InvalidReference;
39085
+ }
39058
39086
  if (range.zone.bottom - range.zone.top < 0 || range.zone.right - range.zone.left < 0) {
39059
39087
  return CellErrorType.InvalidReference;
39060
39088
  }
@@ -42502,16 +42530,22 @@ class EvaluationPlugin extends UIPlugin {
42502
42530
  let newContent = undefined;
42503
42531
  let newFormat = undefined;
42504
42532
  let isExported = true;
42533
+ const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
42505
42534
  const formulaCell = this.getCorrespondingFormulaCell(position);
42506
42535
  if (formulaCell) {
42507
42536
  isExported = isExportableToExcel(formulaCell.compiledFormula.tokens);
42508
42537
  isFormula = isExported;
42509
42538
  if (!isExported) {
42510
- newContent = value.toString();
42511
- newFormat = evaluatedCell.format;
42539
+ // If the cell contains a non-exported formula and that is evaluates to
42540
+ // nothing* ,we don't export it.
42541
+ // * non-falsy value are relevant and so are 0 and FALSE, which only leaves
42542
+ // the empty string.
42543
+ if (value !== "") {
42544
+ newContent = value.toString();
42545
+ newFormat = evaluatedCell.format;
42546
+ }
42512
42547
  }
42513
42548
  }
42514
- const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
42515
42549
  const exportedCellData = exportedSheetData.cells[xc] || {};
42516
42550
  const format = newFormat
42517
42551
  ? getItemId(newFormat, data.formats)
@@ -48813,7 +48847,7 @@ class ClipboardPlugin extends UIPlugin {
48813
48847
  case "ADD_COLUMNS_ROWS": {
48814
48848
  this.status = "invisible";
48815
48849
  // If we add a col/row inside or before the cut area, we invalidate the clipboard
48816
- if (this.state?.operation !== "CUT") {
48850
+ if (this.state?.operation !== "CUT" || cmd.sheetId !== this.state?.sheetId) {
48817
48851
  return;
48818
48852
  }
48819
48853
  const isClipboardDirty = this.state.isColRowDirtyingClipboard(cmd.position === "before" ? cmd.base : cmd.base + 1, cmd.dimension);
@@ -48825,7 +48859,7 @@ class ClipboardPlugin extends UIPlugin {
48825
48859
  case "REMOVE_COLUMNS_ROWS": {
48826
48860
  this.status = "invisible";
48827
48861
  // If we remove a col/row inside or before the cut area, we invalidate the clipboard
48828
- if (this.state?.operation !== "CUT") {
48862
+ if (this.state?.operation !== "CUT" || cmd.sheetId !== this.state?.sheetId) {
48829
48863
  return;
48830
48864
  }
48831
48865
  for (let el of cmd.elements) {
@@ -52008,9 +52042,11 @@ class BottomBarSheet extends owl.Component {
52008
52042
  if (ev.key === "Enter") {
52009
52043
  ev.preventDefault();
52010
52044
  this.stopEdition();
52045
+ this.env.focusableElement.focus();
52011
52046
  }
52012
52047
  if (ev.key === "Escape") {
52013
52048
  this.cancelEdition();
52049
+ this.env.focusableElement.focus();
52014
52050
  }
52015
52051
  }
52016
52052
  onClickSheetName(ev) {
@@ -53896,6 +53932,10 @@ class Spreadsheet extends owl.Component {
53896
53932
  }, () => [this.env.model.getters.getActiveSheetId()]);
53897
53933
  owl.useExternalListener(window, "resize", () => this.render(true));
53898
53934
  owl.useExternalListener(window, "beforeunload", this.unbindModelEvents.bind(this));
53935
+ // For some reason, the wheel event is not properly registered inside templates
53936
+ // in Chromium-based browsers based on chromium 125
53937
+ // This hack ensures the event declared in the template is properly registered/working
53938
+ owl.useExternalListener(document.body, "wheel", () => { });
53899
53939
  this.bindModelEvents();
53900
53940
  owl.onWillUpdateProps((nextProps) => {
53901
53941
  if (nextProps.model !== this.props.model) {
@@ -56701,7 +56741,11 @@ function addRows(construct, data, sheet) {
56701
56741
  let cellNode = escapeXml ``;
56702
56742
  // Either formula or static value inside the cell
56703
56743
  if (cell.isFormula) {
56704
- ({ attrs: additionalAttrs, node: cellNode } = addFormula(cell));
56744
+ const res = addFormula(cell);
56745
+ if (!res) {
56746
+ continue;
56747
+ }
56748
+ ({ attrs: additionalAttrs, node: cellNode } = res);
56705
56749
  }
56706
56750
  else if (cell.content && isMarkdownLink(cell.content)) {
56707
56751
  const { label } = parseMarkdownLink(cell.content);
@@ -57731,6 +57775,6 @@ exports.setTranslationMethod = setTranslationMethod;
57731
57775
  exports.tokenize = tokenize;
57732
57776
 
57733
57777
 
57734
- __info__.version = "17.1.15";
57735
- __info__.date = "2024-05-15T09:22:23.258Z";
57736
- __info__.hash = "fc959fe";
57778
+ __info__.version = "17.1.17";
57779
+ __info__.date = "2024-06-03T14:54:06.711Z";
57780
+ __info__.hash = "7dedb2f";
@@ -5200,6 +5200,7 @@ type Getters = {
5200
5200
  type ArgType = "ANY" | "BOOLEAN" | "NUMBER" | "STRING" | "DATE" | "RANGE" | "RANGE<BOOLEAN>" | "RANGE<NUMBER>" | "RANGE<DATE>" | "RANGE<STRING>" | "RANGE<ANY>" | "META";
5201
5201
  interface ArgDefinition {
5202
5202
  acceptMatrix?: boolean;
5203
+ acceptMatrixOnly?: boolean;
5203
5204
  repeating?: boolean;
5204
5205
  optional?: boolean;
5205
5206
  description: string;