@odoo/o-spreadsheet 16.4.34 → 16.4.36

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.
@@ -3236,8 +3236,11 @@ function copyRangeWithNewSheetId(sheetIdFrom, sheetIdTo, range) {
3236
3236
  /**
3237
3237
  * Create a range from a xc. If the xc is empty, this function returns undefined.
3238
3238
  */
3239
- function createRange(getters, sheetId, range) {
3240
- return range ? getters.getRangeFromSheetXC(sheetId, range) : undefined;
3239
+ function createValidRange(getters, sheetId, xc) {
3240
+ if (!xc)
3241
+ return;
3242
+ const range = getters.getRangeFromSheetXC(sheetId, xc);
3243
+ return !(range.invalidSheetName || range.invalidXc) ? range : undefined;
3241
3244
  }
3242
3245
  /**
3243
3246
  * Spread multiple colrows zone to one row/col zone and add a many new input range as needed.
@@ -5704,6 +5707,7 @@ const FilterMenuPopoverBuilder = {
5704
5707
  };
5705
5708
 
5706
5709
  const macRegex = /Mac/i;
5710
+ const MODIFIER_KEYS = ["Shift", "Control", "Alt", "Meta"];
5707
5711
  /**
5708
5712
  * Return true if the event was triggered from
5709
5713
  * a child element.
@@ -5742,6 +5746,31 @@ function* iterateChildren(el) {
5742
5746
  function getOpenedMenus() {
5743
5747
  return Array.from(document.querySelectorAll(".o-spreadsheet .o-menu"));
5744
5748
  }
5749
+ const letterRegex = /^[a-zA-Z]$/;
5750
+ /**
5751
+ * Transform a keyboard event into a shortcut string that represent this event. The letters keys will be uppercased.
5752
+ *
5753
+ * @argument ev - The keyboard event to transform
5754
+ * @argument mode - Use either ev.key of ev.code to get the string shortcut
5755
+ *
5756
+ * @example
5757
+ * event : { ctrlKey: true, key: "a" } => "Ctrl+A"
5758
+ * event : { shift: true, alt: true, key: "Home" } => "Alt+Shift+Home"
5759
+ */
5760
+ function keyboardEventToShortcutString(ev, mode = "key") {
5761
+ let keyDownString = "";
5762
+ if (!MODIFIER_KEYS.includes(ev.key)) {
5763
+ if (isCtrlKey(ev))
5764
+ keyDownString += "Ctrl+";
5765
+ if (ev.altKey)
5766
+ keyDownString += "Alt+";
5767
+ if (ev.shiftKey)
5768
+ keyDownString += "Shift+";
5769
+ }
5770
+ const key = mode === "key" ? ev.key : ev.code;
5771
+ keyDownString += letterRegex.test(key) ? key.toUpperCase() : key;
5772
+ return keyDownString;
5773
+ }
5745
5774
  function isMacOS() {
5746
5775
  return Boolean(macRegex.test(navigator.userAgent));
5747
5776
  }
@@ -5760,8 +5789,7 @@ function isCtrlKey(ev) {
5760
5789
  */
5761
5790
  function useSpreadsheetRect() {
5762
5791
  const position = owl.useState({ x: 0, y: 0, width: 0, height: 0 });
5763
- let spreadsheetElement = document.querySelector(".o-spreadsheet");
5764
- updatePosition();
5792
+ let spreadsheetElement = null;
5765
5793
  function updatePosition() {
5766
5794
  if (!spreadsheetElement) {
5767
5795
  spreadsheetElement = document.querySelector(".o-spreadsheet");
@@ -16542,7 +16570,7 @@ class BarChart extends AbstractChart {
16542
16570
  constructor(definition, sheetId, getters) {
16543
16571
  super(definition, sheetId, getters);
16544
16572
  this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
16545
- this.labelRange = createRange(getters, sheetId, definition.labelRange);
16573
+ this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
16546
16574
  this.background = definition.background;
16547
16575
  this.verticalAxisPosition = definition.verticalAxisPosition;
16548
16576
  this.legendPosition = definition.legendPosition;
@@ -16787,7 +16815,7 @@ class GaugeChart extends AbstractChart {
16787
16815
  type = "gauge";
16788
16816
  constructor(definition, sheetId, getters) {
16789
16817
  super(definition, sheetId, getters);
16790
- this.dataRange = createRange(this.getters, this.sheetId, definition.dataRange);
16818
+ this.dataRange = createValidRange(this.getters, this.sheetId, definition.dataRange);
16791
16819
  this.sectionRule = definition.sectionRule;
16792
16820
  this.background = definition.background;
16793
16821
  }
@@ -17126,7 +17154,7 @@ class LineChart extends AbstractChart {
17126
17154
  constructor(definition, sheetId, getters) {
17127
17155
  super(definition, sheetId, getters);
17128
17156
  this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
17129
- this.labelRange = createRange(this.getters, sheetId, definition.labelRange);
17157
+ this.labelRange = createValidRange(this.getters, sheetId, definition.labelRange);
17130
17158
  this.background = definition.background;
17131
17159
  this.verticalAxisPosition = definition.verticalAxisPosition;
17132
17160
  this.legendPosition = definition.legendPosition;
@@ -17424,7 +17452,7 @@ class PieChart extends AbstractChart {
17424
17452
  constructor(definition, sheetId, getters) {
17425
17453
  super(definition, sheetId, getters);
17426
17454
  this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
17427
- this.labelRange = createRange(getters, sheetId, definition.labelRange);
17455
+ this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
17428
17456
  this.background = definition.background;
17429
17457
  this.legendPosition = definition.legendPosition;
17430
17458
  this.aggregated = definition.aggregated;
@@ -17592,8 +17620,8 @@ class ScorecardChart extends AbstractChart {
17592
17620
  type = "scorecard";
17593
17621
  constructor(definition, sheetId, getters) {
17594
17622
  super(definition, sheetId, getters);
17595
- this.keyValue = createRange(getters, sheetId, definition.keyValue);
17596
- this.baseline = createRange(getters, sheetId, definition.baseline);
17623
+ this.keyValue = createValidRange(getters, sheetId, definition.keyValue);
17624
+ this.baseline = createValidRange(getters, sheetId, definition.baseline);
17597
17625
  this.baselineMode = definition.baselineMode;
17598
17626
  this.baselineDescr = definition.baselineDescr;
17599
17627
  this.background = definition.background;
@@ -20952,7 +20980,7 @@ class LineBarPieConfigPanel extends owl.Component {
20952
20980
  }
20953
20981
  const getters = this.env.model.getters;
20954
20982
  const sheetId = getters.getActiveSheetId();
20955
- const labelRange = createRange(getters, sheetId, this.labelRange);
20983
+ const labelRange = createValidRange(getters, sheetId, this.labelRange);
20956
20984
  const dataSets = createDataSets(getters, this.dataSeriesRanges, sheetId, this.props.definition.dataSetsHaveTitle);
20957
20985
  if (dataSets.length) {
20958
20986
  return dataSets[0].dataRange.zone.top + 1;
@@ -23417,14 +23445,14 @@ class FigureComponent extends owl.Component {
23417
23445
  }
23418
23446
  onKeyDown(ev) {
23419
23447
  const figure = this.props.figure;
23420
- switch (ev.key) {
23448
+ const keyDownShortcut = keyboardEventToShortcutString(ev);
23449
+ switch (keyDownShortcut) {
23421
23450
  case "Delete":
23422
23451
  this.env.model.dispatch("DELETE_FIGURE", {
23423
23452
  sheetId: this.env.model.getters.getActiveSheetId(),
23424
23453
  id: figure.id,
23425
23454
  });
23426
23455
  this.props.onFigureDeleted();
23427
- ev.stopPropagation();
23428
23456
  ev.preventDefault();
23429
23457
  ev.stopPropagation();
23430
23458
  break;
@@ -23445,7 +23473,22 @@ class FigureComponent extends owl.Component {
23445
23473
  x: figure.x + delta[0],
23446
23474
  y: figure.y + delta[1],
23447
23475
  });
23476
+ ev.preventDefault();
23448
23477
  ev.stopPropagation();
23478
+ break;
23479
+ case "Ctrl+A":
23480
+ // Maybe in the future we will implement a way to select all figures
23481
+ ev.preventDefault();
23482
+ ev.stopPropagation();
23483
+ break;
23484
+ case "Ctrl+Y":
23485
+ case "Ctrl+Z":
23486
+ if (keyDownShortcut === "Ctrl+Y") {
23487
+ this.env.model.dispatch("REQUEST_REDO");
23488
+ }
23489
+ else if (keyDownShortcut === "Ctrl+Z") {
23490
+ this.env.model.dispatch("REQUEST_UNDO");
23491
+ }
23449
23492
  ev.preventDefault();
23450
23493
  ev.stopPropagation();
23451
23494
  break;
@@ -24316,8 +24359,15 @@ class Composer extends owl.Component {
24316
24359
  }
24317
24360
  onPaste(ev) {
24318
24361
  if (this.env.model.getters.getEditionMode() !== "inactive") {
24362
+ // let the browser clipboard work
24319
24363
  ev.stopPropagation();
24320
24364
  }
24365
+ else {
24366
+ // the user meant to paste in the sheet, not open the composer with the pasted content
24367
+ // While we're not editing, we still have the focus and should therefore prevent
24368
+ // the native "paste" to occur.
24369
+ ev.preventDefault();
24370
+ }
24321
24371
  }
24322
24372
  /*
24323
24373
  * Triggered automatically by the content-editable between the keydown and key up
@@ -24326,10 +24376,6 @@ class Composer extends owl.Component {
24326
24376
  if (!this.shouldProcessInputEvents) {
24327
24377
  return;
24328
24378
  }
24329
- if (ev.inputType === "insertFromPaste" &&
24330
- this.env.model.getters.getEditionMode() === "inactive") {
24331
- return;
24332
- }
24333
24379
  ev.stopPropagation();
24334
24380
  let content;
24335
24381
  if (this.env.model.getters.getEditionMode() === "inactive") {
@@ -24760,10 +24806,7 @@ class GridComposer extends owl.Component {
24760
24806
  }
24761
24807
  get containerStyle() {
24762
24808
  if (this.env.model.getters.getEditionMode() === "inactive" || !this.rect) {
24763
- return `
24764
- position: absolute;
24765
- z-index: -1000;
24766
- `;
24809
+ return `z-index: -1000;`;
24767
24810
  }
24768
24811
  const isFormula = this.env.model.getters.getCurrentContent().startsWith("=");
24769
24812
  const cell = this.env.model.getters.getActiveCell();
@@ -34593,6 +34636,9 @@ class RangeAdapter {
34593
34636
  if (range.invalidXc) {
34594
34637
  return range.invalidXc;
34595
34638
  }
34639
+ if (!this.getters.tryGetSheet(range.sheetId)) {
34640
+ return INCORRECT_RANGE_STRING;
34641
+ }
34596
34642
  if (range.zone.bottom - range.zone.top < 0 || range.zone.right - range.zone.left < 0) {
34597
34643
  return INCORRECT_RANGE_STRING;
34598
34644
  }
@@ -37644,16 +37690,22 @@ class EvaluationPlugin extends UIPlugin {
37644
37690
  let newContent = undefined;
37645
37691
  let newFormat = undefined;
37646
37692
  let isExported = true;
37693
+ const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
37647
37694
  const formulaCell = this.getCorrespondingFormulaCell(position);
37648
37695
  if (formulaCell) {
37649
37696
  isExported = isExportableToExcel(formulaCell.compiledFormula.tokens);
37650
37697
  isFormula = isExported;
37651
37698
  if (!isExported) {
37652
- newContent = value.toString();
37653
- newFormat = evaluatedCell.format;
37699
+ // If the cell contains a non-exported formula and that is evaluates to
37700
+ // nothing* ,we don't export it.
37701
+ // * non-falsy value are relevant and so are 0 and FALSE, which only leaves
37702
+ // the empty string.
37703
+ if (value !== "") {
37704
+ newContent = value.toString();
37705
+ newFormat = evaluatedCell.format;
37706
+ }
37654
37707
  }
37655
37708
  }
37656
- const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
37657
37709
  const exportedCellData = exportedSheetData.cells[xc] || {};
37658
37710
  const format = newFormat
37659
37711
  ? getItemId(newFormat, data.formats)
@@ -46524,9 +46576,11 @@ class BottomBarSheet extends owl.Component {
46524
46576
  if (ev.key === "Enter") {
46525
46577
  ev.preventDefault();
46526
46578
  this.stopEdition();
46579
+ this.env.focusableElement.focus();
46527
46580
  }
46528
46581
  if (ev.key === "Escape") {
46529
46582
  this.cancelEdition();
46583
+ this.env.focusableElement.focus();
46530
46584
  }
46531
46585
  }
46532
46586
  onClickSheetName(ev) {
@@ -51142,7 +51196,11 @@ function addRows(construct, data, sheet) {
51142
51196
  let cellNode = escapeXml ``;
51143
51197
  // Either formula or static value inside the cell
51144
51198
  if (cell.isFormula) {
51145
- ({ attrs: additionalAttrs, node: cellNode } = addFormula(cell));
51199
+ const res = addFormula(cell);
51200
+ if (!res) {
51201
+ continue;
51202
+ }
51203
+ ({ attrs: additionalAttrs, node: cellNode } = res);
51146
51204
  }
51147
51205
  else if (cell.content && isMarkdownLink(cell.content)) {
51148
51206
  const { label } = parseMarkdownLink(cell.content);
@@ -52137,6 +52195,6 @@ exports.setTranslationMethod = setTranslationMethod;
52137
52195
  exports.tokenize = tokenize;
52138
52196
 
52139
52197
 
52140
- __info__.version = '16.4.34';
52141
- __info__.date = '2024-05-24T11:27:29.421Z';
52142
- __info__.hash = '5e74805';
52198
+ __info__.version = '16.4.36';
52199
+ __info__.date = '2024-06-10T09:33:43.623Z';
52200
+ __info__.hash = '3b15ed5';
@@ -3232,8 +3232,11 @@ function copyRangeWithNewSheetId(sheetIdFrom, sheetIdTo, range) {
3232
3232
  /**
3233
3233
  * Create a range from a xc. If the xc is empty, this function returns undefined.
3234
3234
  */
3235
- function createRange(getters, sheetId, range) {
3236
- return range ? getters.getRangeFromSheetXC(sheetId, range) : undefined;
3235
+ function createValidRange(getters, sheetId, xc) {
3236
+ if (!xc)
3237
+ return;
3238
+ const range = getters.getRangeFromSheetXC(sheetId, xc);
3239
+ return !(range.invalidSheetName || range.invalidXc) ? range : undefined;
3237
3240
  }
3238
3241
  /**
3239
3242
  * Spread multiple colrows zone to one row/col zone and add a many new input range as needed.
@@ -5700,6 +5703,7 @@ const FilterMenuPopoverBuilder = {
5700
5703
  };
5701
5704
 
5702
5705
  const macRegex = /Mac/i;
5706
+ const MODIFIER_KEYS = ["Shift", "Control", "Alt", "Meta"];
5703
5707
  /**
5704
5708
  * Return true if the event was triggered from
5705
5709
  * a child element.
@@ -5738,6 +5742,31 @@ function* iterateChildren(el) {
5738
5742
  function getOpenedMenus() {
5739
5743
  return Array.from(document.querySelectorAll(".o-spreadsheet .o-menu"));
5740
5744
  }
5745
+ const letterRegex = /^[a-zA-Z]$/;
5746
+ /**
5747
+ * Transform a keyboard event into a shortcut string that represent this event. The letters keys will be uppercased.
5748
+ *
5749
+ * @argument ev - The keyboard event to transform
5750
+ * @argument mode - Use either ev.key of ev.code to get the string shortcut
5751
+ *
5752
+ * @example
5753
+ * event : { ctrlKey: true, key: "a" } => "Ctrl+A"
5754
+ * event : { shift: true, alt: true, key: "Home" } => "Alt+Shift+Home"
5755
+ */
5756
+ function keyboardEventToShortcutString(ev, mode = "key") {
5757
+ let keyDownString = "";
5758
+ if (!MODIFIER_KEYS.includes(ev.key)) {
5759
+ if (isCtrlKey(ev))
5760
+ keyDownString += "Ctrl+";
5761
+ if (ev.altKey)
5762
+ keyDownString += "Alt+";
5763
+ if (ev.shiftKey)
5764
+ keyDownString += "Shift+";
5765
+ }
5766
+ const key = mode === "key" ? ev.key : ev.code;
5767
+ keyDownString += letterRegex.test(key) ? key.toUpperCase() : key;
5768
+ return keyDownString;
5769
+ }
5741
5770
  function isMacOS() {
5742
5771
  return Boolean(macRegex.test(navigator.userAgent));
5743
5772
  }
@@ -5756,8 +5785,7 @@ function isCtrlKey(ev) {
5756
5785
  */
5757
5786
  function useSpreadsheetRect() {
5758
5787
  const position = useState({ x: 0, y: 0, width: 0, height: 0 });
5759
- let spreadsheetElement = document.querySelector(".o-spreadsheet");
5760
- updatePosition();
5788
+ let spreadsheetElement = null;
5761
5789
  function updatePosition() {
5762
5790
  if (!spreadsheetElement) {
5763
5791
  spreadsheetElement = document.querySelector(".o-spreadsheet");
@@ -16538,7 +16566,7 @@ class BarChart extends AbstractChart {
16538
16566
  constructor(definition, sheetId, getters) {
16539
16567
  super(definition, sheetId, getters);
16540
16568
  this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
16541
- this.labelRange = createRange(getters, sheetId, definition.labelRange);
16569
+ this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
16542
16570
  this.background = definition.background;
16543
16571
  this.verticalAxisPosition = definition.verticalAxisPosition;
16544
16572
  this.legendPosition = definition.legendPosition;
@@ -16783,7 +16811,7 @@ class GaugeChart extends AbstractChart {
16783
16811
  type = "gauge";
16784
16812
  constructor(definition, sheetId, getters) {
16785
16813
  super(definition, sheetId, getters);
16786
- this.dataRange = createRange(this.getters, this.sheetId, definition.dataRange);
16814
+ this.dataRange = createValidRange(this.getters, this.sheetId, definition.dataRange);
16787
16815
  this.sectionRule = definition.sectionRule;
16788
16816
  this.background = definition.background;
16789
16817
  }
@@ -17122,7 +17150,7 @@ class LineChart extends AbstractChart {
17122
17150
  constructor(definition, sheetId, getters) {
17123
17151
  super(definition, sheetId, getters);
17124
17152
  this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
17125
- this.labelRange = createRange(this.getters, sheetId, definition.labelRange);
17153
+ this.labelRange = createValidRange(this.getters, sheetId, definition.labelRange);
17126
17154
  this.background = definition.background;
17127
17155
  this.verticalAxisPosition = definition.verticalAxisPosition;
17128
17156
  this.legendPosition = definition.legendPosition;
@@ -17420,7 +17448,7 @@ class PieChart extends AbstractChart {
17420
17448
  constructor(definition, sheetId, getters) {
17421
17449
  super(definition, sheetId, getters);
17422
17450
  this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
17423
- this.labelRange = createRange(getters, sheetId, definition.labelRange);
17451
+ this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
17424
17452
  this.background = definition.background;
17425
17453
  this.legendPosition = definition.legendPosition;
17426
17454
  this.aggregated = definition.aggregated;
@@ -17588,8 +17616,8 @@ class ScorecardChart extends AbstractChart {
17588
17616
  type = "scorecard";
17589
17617
  constructor(definition, sheetId, getters) {
17590
17618
  super(definition, sheetId, getters);
17591
- this.keyValue = createRange(getters, sheetId, definition.keyValue);
17592
- this.baseline = createRange(getters, sheetId, definition.baseline);
17619
+ this.keyValue = createValidRange(getters, sheetId, definition.keyValue);
17620
+ this.baseline = createValidRange(getters, sheetId, definition.baseline);
17593
17621
  this.baselineMode = definition.baselineMode;
17594
17622
  this.baselineDescr = definition.baselineDescr;
17595
17623
  this.background = definition.background;
@@ -20948,7 +20976,7 @@ class LineBarPieConfigPanel extends Component {
20948
20976
  }
20949
20977
  const getters = this.env.model.getters;
20950
20978
  const sheetId = getters.getActiveSheetId();
20951
- const labelRange = createRange(getters, sheetId, this.labelRange);
20979
+ const labelRange = createValidRange(getters, sheetId, this.labelRange);
20952
20980
  const dataSets = createDataSets(getters, this.dataSeriesRanges, sheetId, this.props.definition.dataSetsHaveTitle);
20953
20981
  if (dataSets.length) {
20954
20982
  return dataSets[0].dataRange.zone.top + 1;
@@ -23413,14 +23441,14 @@ class FigureComponent extends Component {
23413
23441
  }
23414
23442
  onKeyDown(ev) {
23415
23443
  const figure = this.props.figure;
23416
- switch (ev.key) {
23444
+ const keyDownShortcut = keyboardEventToShortcutString(ev);
23445
+ switch (keyDownShortcut) {
23417
23446
  case "Delete":
23418
23447
  this.env.model.dispatch("DELETE_FIGURE", {
23419
23448
  sheetId: this.env.model.getters.getActiveSheetId(),
23420
23449
  id: figure.id,
23421
23450
  });
23422
23451
  this.props.onFigureDeleted();
23423
- ev.stopPropagation();
23424
23452
  ev.preventDefault();
23425
23453
  ev.stopPropagation();
23426
23454
  break;
@@ -23441,7 +23469,22 @@ class FigureComponent extends Component {
23441
23469
  x: figure.x + delta[0],
23442
23470
  y: figure.y + delta[1],
23443
23471
  });
23472
+ ev.preventDefault();
23444
23473
  ev.stopPropagation();
23474
+ break;
23475
+ case "Ctrl+A":
23476
+ // Maybe in the future we will implement a way to select all figures
23477
+ ev.preventDefault();
23478
+ ev.stopPropagation();
23479
+ break;
23480
+ case "Ctrl+Y":
23481
+ case "Ctrl+Z":
23482
+ if (keyDownShortcut === "Ctrl+Y") {
23483
+ this.env.model.dispatch("REQUEST_REDO");
23484
+ }
23485
+ else if (keyDownShortcut === "Ctrl+Z") {
23486
+ this.env.model.dispatch("REQUEST_UNDO");
23487
+ }
23445
23488
  ev.preventDefault();
23446
23489
  ev.stopPropagation();
23447
23490
  break;
@@ -24312,8 +24355,15 @@ class Composer extends Component {
24312
24355
  }
24313
24356
  onPaste(ev) {
24314
24357
  if (this.env.model.getters.getEditionMode() !== "inactive") {
24358
+ // let the browser clipboard work
24315
24359
  ev.stopPropagation();
24316
24360
  }
24361
+ else {
24362
+ // the user meant to paste in the sheet, not open the composer with the pasted content
24363
+ // While we're not editing, we still have the focus and should therefore prevent
24364
+ // the native "paste" to occur.
24365
+ ev.preventDefault();
24366
+ }
24317
24367
  }
24318
24368
  /*
24319
24369
  * Triggered automatically by the content-editable between the keydown and key up
@@ -24322,10 +24372,6 @@ class Composer extends Component {
24322
24372
  if (!this.shouldProcessInputEvents) {
24323
24373
  return;
24324
24374
  }
24325
- if (ev.inputType === "insertFromPaste" &&
24326
- this.env.model.getters.getEditionMode() === "inactive") {
24327
- return;
24328
- }
24329
24375
  ev.stopPropagation();
24330
24376
  let content;
24331
24377
  if (this.env.model.getters.getEditionMode() === "inactive") {
@@ -24756,10 +24802,7 @@ class GridComposer extends Component {
24756
24802
  }
24757
24803
  get containerStyle() {
24758
24804
  if (this.env.model.getters.getEditionMode() === "inactive" || !this.rect) {
24759
- return `
24760
- position: absolute;
24761
- z-index: -1000;
24762
- `;
24805
+ return `z-index: -1000;`;
24763
24806
  }
24764
24807
  const isFormula = this.env.model.getters.getCurrentContent().startsWith("=");
24765
24808
  const cell = this.env.model.getters.getActiveCell();
@@ -34589,6 +34632,9 @@ class RangeAdapter {
34589
34632
  if (range.invalidXc) {
34590
34633
  return range.invalidXc;
34591
34634
  }
34635
+ if (!this.getters.tryGetSheet(range.sheetId)) {
34636
+ return INCORRECT_RANGE_STRING;
34637
+ }
34592
34638
  if (range.zone.bottom - range.zone.top < 0 || range.zone.right - range.zone.left < 0) {
34593
34639
  return INCORRECT_RANGE_STRING;
34594
34640
  }
@@ -37640,16 +37686,22 @@ class EvaluationPlugin extends UIPlugin {
37640
37686
  let newContent = undefined;
37641
37687
  let newFormat = undefined;
37642
37688
  let isExported = true;
37689
+ const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
37643
37690
  const formulaCell = this.getCorrespondingFormulaCell(position);
37644
37691
  if (formulaCell) {
37645
37692
  isExported = isExportableToExcel(formulaCell.compiledFormula.tokens);
37646
37693
  isFormula = isExported;
37647
37694
  if (!isExported) {
37648
- newContent = value.toString();
37649
- newFormat = evaluatedCell.format;
37695
+ // If the cell contains a non-exported formula and that is evaluates to
37696
+ // nothing* ,we don't export it.
37697
+ // * non-falsy value are relevant and so are 0 and FALSE, which only leaves
37698
+ // the empty string.
37699
+ if (value !== "") {
37700
+ newContent = value.toString();
37701
+ newFormat = evaluatedCell.format;
37702
+ }
37650
37703
  }
37651
37704
  }
37652
- const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
37653
37705
  const exportedCellData = exportedSheetData.cells[xc] || {};
37654
37706
  const format = newFormat
37655
37707
  ? getItemId(newFormat, data.formats)
@@ -46520,9 +46572,11 @@ class BottomBarSheet extends Component {
46520
46572
  if (ev.key === "Enter") {
46521
46573
  ev.preventDefault();
46522
46574
  this.stopEdition();
46575
+ this.env.focusableElement.focus();
46523
46576
  }
46524
46577
  if (ev.key === "Escape") {
46525
46578
  this.cancelEdition();
46579
+ this.env.focusableElement.focus();
46526
46580
  }
46527
46581
  }
46528
46582
  onClickSheetName(ev) {
@@ -51138,7 +51192,11 @@ function addRows(construct, data, sheet) {
51138
51192
  let cellNode = escapeXml ``;
51139
51193
  // Either formula or static value inside the cell
51140
51194
  if (cell.isFormula) {
51141
- ({ attrs: additionalAttrs, node: cellNode } = addFormula(cell));
51195
+ const res = addFormula(cell);
51196
+ if (!res) {
51197
+ continue;
51198
+ }
51199
+ ({ attrs: additionalAttrs, node: cellNode } = res);
51142
51200
  }
51143
51201
  else if (cell.content && isMarkdownLink(cell.content)) {
51144
51202
  const { label } = parseMarkdownLink(cell.content);
@@ -52101,6 +52159,6 @@ const constants = {
52101
52159
  export { AbstractChart, CommandResult, CorePlugin, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, compile, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, invalidateCFEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, tokenize };
52102
52160
 
52103
52161
 
52104
- __info__.version = '16.4.34';
52105
- __info__.date = '2024-05-24T11:27:29.421Z';
52106
- __info__.hash = '5e74805';
52162
+ __info__.version = '16.4.36';
52163
+ __info__.date = '2024-06-10T09:33:43.623Z';
52164
+ __info__.hash = '3b15ed5';