@odoo/o-spreadsheet 17.0.64 → 17.0.66

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.0.64
6
- * @date 2025-06-06T09:40:57.565Z
7
- * @hash 45506a8
5
+ * @version 17.0.66
6
+ * @date 2025-06-19T18:23:36.231Z
7
+ * @hash fbd5c00
8
8
  */
9
9
 
10
10
  'use strict';
@@ -6668,19 +6668,26 @@ class FilterMenu extends owl.Component {
6668
6668
  .filter(({ row }) => !this.env.model.getters.isRowHidden(sheetId, row))
6669
6669
  .map(({ col, row }) => this.env.model.getters.getEvaluatedCell({ sheetId, col, row }).formattedValue);
6670
6670
  const filterValues = this.env.model.getters.getFilterValues({ sheetId, ...position });
6671
- const strValues = [...cellValues, ...filterValues];
6672
- const normalizedFilteredValues = filterValues.map(toLowerCase);
6673
- // Set with lowercase values to avoid duplicates
6674
- const normalizedValues = [...new Set(strValues.map(toLowerCase))];
6675
- const sortedValues = normalizedValues.sort((val1, val2) => val1.localeCompare(val2, undefined, { numeric: true, sensitivity: "base" }));
6676
- return sortedValues.map((normalizedValue) => {
6677
- const checked = normalizedFilteredValues.findIndex((filteredValue) => filteredValue === normalizedValue) ===
6678
- -1;
6679
- return {
6680
- checked,
6681
- string: strValues.find((val) => toLowerCase(val) === normalizedValue) || "",
6682
- };
6683
- });
6671
+ const normalizedFilteredValues = new Set(filterValues.map(toLowerCase));
6672
+ const set = new Set();
6673
+ const values = [];
6674
+ const addValue = (value) => {
6675
+ const normalizedValue = toLowerCase(value);
6676
+ if (!set.has(normalizedValue)) {
6677
+ values.push({
6678
+ string: value || "",
6679
+ checked: !normalizedFilteredValues.has(normalizedValue),
6680
+ normalizedValue,
6681
+ });
6682
+ set.add(normalizedValue);
6683
+ }
6684
+ };
6685
+ cellValues.forEach(addValue);
6686
+ filterValues.forEach(addValue);
6687
+ return values.sort((val1, val2) => val1.normalizedValue.localeCompare(val2.normalizedValue, undefined, {
6688
+ numeric: true,
6689
+ sensitivity: "base",
6690
+ }));
6684
6691
  }
6685
6692
  checkValue(value) {
6686
6693
  this.state.selectedValue = value.string;
@@ -10744,6 +10751,10 @@ const REMOVE_ROWS_ACTION = (env) => {
10744
10751
  });
10745
10752
  };
10746
10753
  const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
10754
+ if ((dimension === "COL" && env.model.getters.getActiveRows().size > 0) ||
10755
+ (dimension === "ROW" && env.model.getters.getActiveCols().size > 0)) {
10756
+ return false;
10757
+ }
10747
10758
  const sheetId = env.model.getters.getActiveSheetId();
10748
10759
  const selectedElements = env.model.getters.getElementsFromSelection(dimension);
10749
10760
  const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
@@ -21561,11 +21572,11 @@ class OTRegistry extends Registry {
21561
21572
  * transformation function given
21562
21573
  */
21563
21574
  addTransformation(executed, toTransforms, fn) {
21564
- for (let toTransform of toTransforms) {
21565
- if (!this.content[toTransform]) {
21566
- this.content[toTransform] = new Map();
21567
- }
21568
- this.content[toTransform].set(executed, fn);
21575
+ if (!this.content[executed]) {
21576
+ this.content[executed] = new Map();
21577
+ }
21578
+ for (const toTransform of toTransforms) {
21579
+ this.content[executed].set(toTransform, fn);
21569
21580
  }
21570
21581
  return this;
21571
21582
  }
@@ -21574,7 +21585,7 @@ class OTRegistry extends Registry {
21574
21585
  * that the executed command happened.
21575
21586
  */
21576
21587
  getTransformation(toTransform, executed) {
21577
- return this.content[toTransform] && this.content[toTransform].get(executed);
21588
+ return this.content[executed] && this.content[executed].get(toTransform);
21578
21589
  }
21579
21590
  }
21580
21591
  const otRegistry = new OTRegistry();
@@ -32827,7 +32838,7 @@ class XlsxBaseExtractor {
32827
32838
  */
32828
32839
  handleMissingValue(parentElement, missingElementName, optionalArgs) {
32829
32840
  if (optionalArgs?.required) {
32830
- if (optionalArgs?.default) {
32841
+ if (optionalArgs?.default !== undefined) {
32831
32842
  this.warningManager.addParsingWarning(`Missing required ${missingElementName} in element <${parentElement.tagName}> of ${this.currentFile}, replacing it by the default value ${optionalArgs.default}`);
32832
32843
  }
32833
32844
  else {
@@ -44621,10 +44632,20 @@ function transform(toTransform, executed) {
44621
44632
  */
44622
44633
  function transformAll(toTransform, executed) {
44623
44634
  let transformedCommands = [...toTransform];
44635
+ const possibleTransformations = new Set(otRegistry.getKeys());
44624
44636
  for (const executedCommand of executed) {
44625
- transformedCommands = transformedCommands
44626
- .map((cmd) => transform(cmd, executedCommand))
44627
- .filter(isDefined$1);
44637
+ // If the executed command is not in the registry, we skip it
44638
+ // because we know there won't be any transformation impacting the
44639
+ // commands to transform.
44640
+ if (possibleTransformations.has(executedCommand.type)) {
44641
+ transformedCommands = transformedCommands.reduce((acc, cmd) => {
44642
+ const transformed = transform(cmd, executedCommand);
44643
+ if (transformed) {
44644
+ acc.push(transformed);
44645
+ }
44646
+ return acc;
44647
+ }, []);
44648
+ }
44628
44649
  }
44629
44650
  return transformedCommands;
44630
44651
  }
@@ -45103,7 +45124,6 @@ class Session extends EventBus {
45103
45124
  if (this.waitingAck) {
45104
45125
  return;
45105
45126
  }
45106
- this.waitingAck = true;
45107
45127
  this.sendPendingMessage();
45108
45128
  }
45109
45129
  /**
@@ -45133,6 +45153,7 @@ class Session extends EventBus {
45133
45153
  throw new Error(`Trying to send a new revision while replaying initial revision. This can lead to endless dispatches every time the spreadsheet is open.
45134
45154
  ${JSON.stringify(message)}`);
45135
45155
  }
45156
+ this.waitingAck = true;
45136
45157
  this.transportService.sendMessage({
45137
45158
  ...message,
45138
45159
  serverRevisionId: this.serverRevisionId,
@@ -48179,7 +48200,7 @@ class SheetUIPlugin extends UIPlugin {
48179
48200
  }
48180
48201
  const position = this.getters.getCellPosition(cell.id);
48181
48202
  const colSize = this.getters.getColSize(sheetId, position.col);
48182
- if (cell.isFormula) {
48203
+ if (cell.isFormula || this.getters.getArrayFormulaSpreadingOn(position)) {
48183
48204
  const content = this.getters.getEvaluatedCell(position).formattedValue;
48184
48205
  const evaluatedSize = getCellContentHeight(this.ctx, content, cell?.style, colSize);
48185
48206
  if (evaluatedSize > evaluatedRowSize && evaluatedSize > DEFAULT_CELL_HEIGHT) {
@@ -50173,9 +50194,10 @@ class FilterEvaluationPlugin extends UIPlugin {
50173
50194
  const filteredValues = this.filterValues[sheetId]?.[filter.id]?.map(toLowerCase);
50174
50195
  if (!filteredValues || !filter.filteredZone)
50175
50196
  continue;
50197
+ const filteredValuesSet = new Set(filteredValues);
50176
50198
  for (let row = filter.filteredZone.top; row <= filter.filteredZone.bottom; row++) {
50177
50199
  const value = this.getCellValueAsString(sheetId, filter.col, row);
50178
- if (filteredValues.includes(value)) {
50200
+ if (filteredValuesSet.has(value)) {
50179
50201
  hiddenRows.add(row);
50180
50202
  }
50181
50203
  }
@@ -58328,6 +58350,6 @@ exports.setTranslationMethod = setTranslationMethod;
58328
58350
  exports.tokenize = tokenize;
58329
58351
 
58330
58352
 
58331
- __info__.version = "17.0.64";
58332
- __info__.date = "2025-06-06T09:40:57.565Z";
58333
- __info__.hash = "45506a8";
58353
+ __info__.version = "17.0.66";
58354
+ __info__.date = "2025-06-19T18:23:36.231Z";
58355
+ __info__.hash = "fbd5c00";
@@ -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.0.64
6
- * @date 2025-06-06T09:40:57.565Z
7
- * @hash 45506a8
5
+ * @version 17.0.66
6
+ * @date 2025-06-19T18:23:36.231Z
7
+ * @hash fbd5c00
8
8
  */
9
9
 
10
10
  import { Component, useRef, onMounted, useEffect, onWillPatch, useState, onWillUpdateProps, onPatched, useComponent, useExternalListener, onWillUnmount, onWillStart, xml, useChildSubEnv, useSubEnv, markRaw } from '@odoo/owl';
@@ -6666,19 +6666,26 @@ class FilterMenu extends Component {
6666
6666
  .filter(({ row }) => !this.env.model.getters.isRowHidden(sheetId, row))
6667
6667
  .map(({ col, row }) => this.env.model.getters.getEvaluatedCell({ sheetId, col, row }).formattedValue);
6668
6668
  const filterValues = this.env.model.getters.getFilterValues({ sheetId, ...position });
6669
- const strValues = [...cellValues, ...filterValues];
6670
- const normalizedFilteredValues = filterValues.map(toLowerCase);
6671
- // Set with lowercase values to avoid duplicates
6672
- const normalizedValues = [...new Set(strValues.map(toLowerCase))];
6673
- const sortedValues = normalizedValues.sort((val1, val2) => val1.localeCompare(val2, undefined, { numeric: true, sensitivity: "base" }));
6674
- return sortedValues.map((normalizedValue) => {
6675
- const checked = normalizedFilteredValues.findIndex((filteredValue) => filteredValue === normalizedValue) ===
6676
- -1;
6677
- return {
6678
- checked,
6679
- string: strValues.find((val) => toLowerCase(val) === normalizedValue) || "",
6680
- };
6681
- });
6669
+ const normalizedFilteredValues = new Set(filterValues.map(toLowerCase));
6670
+ const set = new Set();
6671
+ const values = [];
6672
+ const addValue = (value) => {
6673
+ const normalizedValue = toLowerCase(value);
6674
+ if (!set.has(normalizedValue)) {
6675
+ values.push({
6676
+ string: value || "",
6677
+ checked: !normalizedFilteredValues.has(normalizedValue),
6678
+ normalizedValue,
6679
+ });
6680
+ set.add(normalizedValue);
6681
+ }
6682
+ };
6683
+ cellValues.forEach(addValue);
6684
+ filterValues.forEach(addValue);
6685
+ return values.sort((val1, val2) => val1.normalizedValue.localeCompare(val2.normalizedValue, undefined, {
6686
+ numeric: true,
6687
+ sensitivity: "base",
6688
+ }));
6682
6689
  }
6683
6690
  checkValue(value) {
6684
6691
  this.state.selectedValue = value.string;
@@ -10742,6 +10749,10 @@ const REMOVE_ROWS_ACTION = (env) => {
10742
10749
  });
10743
10750
  };
10744
10751
  const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
10752
+ if ((dimension === "COL" && env.model.getters.getActiveRows().size > 0) ||
10753
+ (dimension === "ROW" && env.model.getters.getActiveCols().size > 0)) {
10754
+ return false;
10755
+ }
10745
10756
  const sheetId = env.model.getters.getActiveSheetId();
10746
10757
  const selectedElements = env.model.getters.getElementsFromSelection(dimension);
10747
10758
  const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
@@ -21559,11 +21570,11 @@ class OTRegistry extends Registry {
21559
21570
  * transformation function given
21560
21571
  */
21561
21572
  addTransformation(executed, toTransforms, fn) {
21562
- for (let toTransform of toTransforms) {
21563
- if (!this.content[toTransform]) {
21564
- this.content[toTransform] = new Map();
21565
- }
21566
- this.content[toTransform].set(executed, fn);
21573
+ if (!this.content[executed]) {
21574
+ this.content[executed] = new Map();
21575
+ }
21576
+ for (const toTransform of toTransforms) {
21577
+ this.content[executed].set(toTransform, fn);
21567
21578
  }
21568
21579
  return this;
21569
21580
  }
@@ -21572,7 +21583,7 @@ class OTRegistry extends Registry {
21572
21583
  * that the executed command happened.
21573
21584
  */
21574
21585
  getTransformation(toTransform, executed) {
21575
- return this.content[toTransform] && this.content[toTransform].get(executed);
21586
+ return this.content[executed] && this.content[executed].get(toTransform);
21576
21587
  }
21577
21588
  }
21578
21589
  const otRegistry = new OTRegistry();
@@ -32825,7 +32836,7 @@ class XlsxBaseExtractor {
32825
32836
  */
32826
32837
  handleMissingValue(parentElement, missingElementName, optionalArgs) {
32827
32838
  if (optionalArgs?.required) {
32828
- if (optionalArgs?.default) {
32839
+ if (optionalArgs?.default !== undefined) {
32829
32840
  this.warningManager.addParsingWarning(`Missing required ${missingElementName} in element <${parentElement.tagName}> of ${this.currentFile}, replacing it by the default value ${optionalArgs.default}`);
32830
32841
  }
32831
32842
  else {
@@ -44619,10 +44630,20 @@ function transform(toTransform, executed) {
44619
44630
  */
44620
44631
  function transformAll(toTransform, executed) {
44621
44632
  let transformedCommands = [...toTransform];
44633
+ const possibleTransformations = new Set(otRegistry.getKeys());
44622
44634
  for (const executedCommand of executed) {
44623
- transformedCommands = transformedCommands
44624
- .map((cmd) => transform(cmd, executedCommand))
44625
- .filter(isDefined$1);
44635
+ // If the executed command is not in the registry, we skip it
44636
+ // because we know there won't be any transformation impacting the
44637
+ // commands to transform.
44638
+ if (possibleTransformations.has(executedCommand.type)) {
44639
+ transformedCommands = transformedCommands.reduce((acc, cmd) => {
44640
+ const transformed = transform(cmd, executedCommand);
44641
+ if (transformed) {
44642
+ acc.push(transformed);
44643
+ }
44644
+ return acc;
44645
+ }, []);
44646
+ }
44626
44647
  }
44627
44648
  return transformedCommands;
44628
44649
  }
@@ -45101,7 +45122,6 @@ class Session extends EventBus {
45101
45122
  if (this.waitingAck) {
45102
45123
  return;
45103
45124
  }
45104
- this.waitingAck = true;
45105
45125
  this.sendPendingMessage();
45106
45126
  }
45107
45127
  /**
@@ -45131,6 +45151,7 @@ class Session extends EventBus {
45131
45151
  throw new Error(`Trying to send a new revision while replaying initial revision. This can lead to endless dispatches every time the spreadsheet is open.
45132
45152
  ${JSON.stringify(message)}`);
45133
45153
  }
45154
+ this.waitingAck = true;
45134
45155
  this.transportService.sendMessage({
45135
45156
  ...message,
45136
45157
  serverRevisionId: this.serverRevisionId,
@@ -48177,7 +48198,7 @@ class SheetUIPlugin extends UIPlugin {
48177
48198
  }
48178
48199
  const position = this.getters.getCellPosition(cell.id);
48179
48200
  const colSize = this.getters.getColSize(sheetId, position.col);
48180
- if (cell.isFormula) {
48201
+ if (cell.isFormula || this.getters.getArrayFormulaSpreadingOn(position)) {
48181
48202
  const content = this.getters.getEvaluatedCell(position).formattedValue;
48182
48203
  const evaluatedSize = getCellContentHeight(this.ctx, content, cell?.style, colSize);
48183
48204
  if (evaluatedSize > evaluatedRowSize && evaluatedSize > DEFAULT_CELL_HEIGHT) {
@@ -50171,9 +50192,10 @@ class FilterEvaluationPlugin extends UIPlugin {
50171
50192
  const filteredValues = this.filterValues[sheetId]?.[filter.id]?.map(toLowerCase);
50172
50193
  if (!filteredValues || !filter.filteredZone)
50173
50194
  continue;
50195
+ const filteredValuesSet = new Set(filteredValues);
50174
50196
  for (let row = filter.filteredZone.top; row <= filter.filteredZone.bottom; row++) {
50175
50197
  const value = this.getCellValueAsString(sheetId, filter.col, row);
50176
- if (filteredValues.includes(value)) {
50198
+ if (filteredValuesSet.has(value)) {
50177
50199
  hiddenRows.add(row);
50178
50200
  }
50179
50201
  }
@@ -58291,6 +58313,6 @@ const constants = {
58291
58313
  export { AbstractChart, CommandResult, CorePlugin, DispatchResult, EvaluationError, Model, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, UIPlugin, __info__, addFunction, astToFormula, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, hooks, invalidateCFEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, tokenize };
58292
58314
 
58293
58315
 
58294
- __info__.version = "17.0.64";
58295
- __info__.date = "2025-06-06T09:40:57.565Z";
58296
- __info__.hash = "45506a8";
58316
+ __info__.version = "17.0.66";
58317
+ __info__.date = "2025-06-19T18:23:36.231Z";
58318
+ __info__.hash = "fbd5c00";
@@ -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.0.64
6
- * @date 2025-06-06T09:40:57.565Z
7
- * @hash 45506a8
5
+ * @version 17.0.66
6
+ * @date 2025-06-19T18:23:36.231Z
7
+ * @hash fbd5c00
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -6667,19 +6667,26 @@
6667
6667
  .filter(({ row }) => !this.env.model.getters.isRowHidden(sheetId, row))
6668
6668
  .map(({ col, row }) => this.env.model.getters.getEvaluatedCell({ sheetId, col, row }).formattedValue);
6669
6669
  const filterValues = this.env.model.getters.getFilterValues({ sheetId, ...position });
6670
- const strValues = [...cellValues, ...filterValues];
6671
- const normalizedFilteredValues = filterValues.map(toLowerCase);
6672
- // Set with lowercase values to avoid duplicates
6673
- const normalizedValues = [...new Set(strValues.map(toLowerCase))];
6674
- const sortedValues = normalizedValues.sort((val1, val2) => val1.localeCompare(val2, undefined, { numeric: true, sensitivity: "base" }));
6675
- return sortedValues.map((normalizedValue) => {
6676
- const checked = normalizedFilteredValues.findIndex((filteredValue) => filteredValue === normalizedValue) ===
6677
- -1;
6678
- return {
6679
- checked,
6680
- string: strValues.find((val) => toLowerCase(val) === normalizedValue) || "",
6681
- };
6682
- });
6670
+ const normalizedFilteredValues = new Set(filterValues.map(toLowerCase));
6671
+ const set = new Set();
6672
+ const values = [];
6673
+ const addValue = (value) => {
6674
+ const normalizedValue = toLowerCase(value);
6675
+ if (!set.has(normalizedValue)) {
6676
+ values.push({
6677
+ string: value || "",
6678
+ checked: !normalizedFilteredValues.has(normalizedValue),
6679
+ normalizedValue,
6680
+ });
6681
+ set.add(normalizedValue);
6682
+ }
6683
+ };
6684
+ cellValues.forEach(addValue);
6685
+ filterValues.forEach(addValue);
6686
+ return values.sort((val1, val2) => val1.normalizedValue.localeCompare(val2.normalizedValue, undefined, {
6687
+ numeric: true,
6688
+ sensitivity: "base",
6689
+ }));
6683
6690
  }
6684
6691
  checkValue(value) {
6685
6692
  this.state.selectedValue = value.string;
@@ -10743,6 +10750,10 @@
10743
10750
  });
10744
10751
  };
10745
10752
  const CAN_REMOVE_COLUMNS_ROWS = (dimension, env) => {
10753
+ if ((dimension === "COL" && env.model.getters.getActiveRows().size > 0) ||
10754
+ (dimension === "ROW" && env.model.getters.getActiveCols().size > 0)) {
10755
+ return false;
10756
+ }
10746
10757
  const sheetId = env.model.getters.getActiveSheetId();
10747
10758
  const selectedElements = env.model.getters.getElementsFromSelection(dimension);
10748
10759
  const includesAllVisibleHeaders = env.model.getters.checkElementsIncludeAllVisibleHeaders(sheetId, dimension, selectedElements);
@@ -21560,11 +21571,11 @@
21560
21571
  * transformation function given
21561
21572
  */
21562
21573
  addTransformation(executed, toTransforms, fn) {
21563
- for (let toTransform of toTransforms) {
21564
- if (!this.content[toTransform]) {
21565
- this.content[toTransform] = new Map();
21566
- }
21567
- this.content[toTransform].set(executed, fn);
21574
+ if (!this.content[executed]) {
21575
+ this.content[executed] = new Map();
21576
+ }
21577
+ for (const toTransform of toTransforms) {
21578
+ this.content[executed].set(toTransform, fn);
21568
21579
  }
21569
21580
  return this;
21570
21581
  }
@@ -21573,7 +21584,7 @@
21573
21584
  * that the executed command happened.
21574
21585
  */
21575
21586
  getTransformation(toTransform, executed) {
21576
- return this.content[toTransform] && this.content[toTransform].get(executed);
21587
+ return this.content[executed] && this.content[executed].get(toTransform);
21577
21588
  }
21578
21589
  }
21579
21590
  const otRegistry = new OTRegistry();
@@ -32826,7 +32837,7 @@
32826
32837
  */
32827
32838
  handleMissingValue(parentElement, missingElementName, optionalArgs) {
32828
32839
  if (optionalArgs?.required) {
32829
- if (optionalArgs?.default) {
32840
+ if (optionalArgs?.default !== undefined) {
32830
32841
  this.warningManager.addParsingWarning(`Missing required ${missingElementName} in element <${parentElement.tagName}> of ${this.currentFile}, replacing it by the default value ${optionalArgs.default}`);
32831
32842
  }
32832
32843
  else {
@@ -44620,10 +44631,20 @@
44620
44631
  */
44621
44632
  function transformAll(toTransform, executed) {
44622
44633
  let transformedCommands = [...toTransform];
44634
+ const possibleTransformations = new Set(otRegistry.getKeys());
44623
44635
  for (const executedCommand of executed) {
44624
- transformedCommands = transformedCommands
44625
- .map((cmd) => transform(cmd, executedCommand))
44626
- .filter(isDefined$1);
44636
+ // If the executed command is not in the registry, we skip it
44637
+ // because we know there won't be any transformation impacting the
44638
+ // commands to transform.
44639
+ if (possibleTransformations.has(executedCommand.type)) {
44640
+ transformedCommands = transformedCommands.reduce((acc, cmd) => {
44641
+ const transformed = transform(cmd, executedCommand);
44642
+ if (transformed) {
44643
+ acc.push(transformed);
44644
+ }
44645
+ return acc;
44646
+ }, []);
44647
+ }
44627
44648
  }
44628
44649
  return transformedCommands;
44629
44650
  }
@@ -45102,7 +45123,6 @@
45102
45123
  if (this.waitingAck) {
45103
45124
  return;
45104
45125
  }
45105
- this.waitingAck = true;
45106
45126
  this.sendPendingMessage();
45107
45127
  }
45108
45128
  /**
@@ -45132,6 +45152,7 @@
45132
45152
  throw new Error(`Trying to send a new revision while replaying initial revision. This can lead to endless dispatches every time the spreadsheet is open.
45133
45153
  ${JSON.stringify(message)}`);
45134
45154
  }
45155
+ this.waitingAck = true;
45135
45156
  this.transportService.sendMessage({
45136
45157
  ...message,
45137
45158
  serverRevisionId: this.serverRevisionId,
@@ -48178,7 +48199,7 @@
48178
48199
  }
48179
48200
  const position = this.getters.getCellPosition(cell.id);
48180
48201
  const colSize = this.getters.getColSize(sheetId, position.col);
48181
- if (cell.isFormula) {
48202
+ if (cell.isFormula || this.getters.getArrayFormulaSpreadingOn(position)) {
48182
48203
  const content = this.getters.getEvaluatedCell(position).formattedValue;
48183
48204
  const evaluatedSize = getCellContentHeight(this.ctx, content, cell?.style, colSize);
48184
48205
  if (evaluatedSize > evaluatedRowSize && evaluatedSize > DEFAULT_CELL_HEIGHT) {
@@ -50172,9 +50193,10 @@
50172
50193
  const filteredValues = this.filterValues[sheetId]?.[filter.id]?.map(toLowerCase);
50173
50194
  if (!filteredValues || !filter.filteredZone)
50174
50195
  continue;
50196
+ const filteredValuesSet = new Set(filteredValues);
50175
50197
  for (let row = filter.filteredZone.top; row <= filter.filteredZone.bottom; row++) {
50176
50198
  const value = this.getCellValueAsString(sheetId, filter.col, row);
50177
- if (filteredValues.includes(value)) {
50199
+ if (filteredValuesSet.has(value)) {
50178
50200
  hiddenRows.add(row);
50179
50201
  }
50180
50202
  }
@@ -58327,9 +58349,9 @@
58327
58349
  exports.tokenize = tokenize;
58328
58350
 
58329
58351
 
58330
- __info__.version = "17.0.64";
58331
- __info__.date = "2025-06-06T09:40:57.565Z";
58332
- __info__.hash = "45506a8";
58352
+ __info__.version = "17.0.66";
58353
+ __info__.date = "2025-06-19T18:23:36.231Z";
58354
+ __info__.hash = "fbd5c00";
58333
58355
 
58334
58356
 
58335
58357
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);