@odoo/o-spreadsheet 18.3.21 → 18.3.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.
@@ -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 18.3.21
6
- * @date 2025-09-19T07:25:12.089Z
7
- * @hash b64ee85
5
+ * @version 18.3.23
6
+ * @date 2025-10-07T10:00:57.144Z
7
+ * @hash b4764cb
8
8
  */
9
9
 
10
10
  'use strict';
@@ -879,9 +879,7 @@ function removeIndexesFromArray(array, indexes) {
879
879
  return newArray;
880
880
  }
881
881
  function insertItemsAtIndex(array, items, index) {
882
- const newArray = [...array];
883
- newArray.splice(index, 0, ...items);
884
- return newArray;
882
+ return array.slice(0, index).concat(items).concat(array.slice(index));
885
883
  }
886
884
  function replaceItemAtIndex(array, newItem, index) {
887
885
  const newArray = [...array];
@@ -5145,7 +5143,7 @@ function tokensToTextInternalFormat(tokens) {
5145
5143
  * Replace in place tokens "mm" and "m" that denote minutes in date format with "MM" to avoid confusion with months.
5146
5144
  *
5147
5145
  * As per OpenXML specification, in date formats if a date token "m" or "mm" is followed by a date token "s" or
5148
- * preceded by a data token "h", then it's not a month but an minute.
5146
+ * preceded by a data token "h", then it's not a month but a minute.
5149
5147
  */
5150
5148
  function convertTokensToMinutesInDateFormat(tokens) {
5151
5149
  const dateParts = tokens.filter((token) => token.type === "DATE_PART");
@@ -5188,6 +5186,9 @@ function internalFormatPartToFormat(internalFormat) {
5188
5186
  case "REPEATED_CHAR":
5189
5187
  format += "*" + token.value;
5190
5188
  break;
5189
+ case "DATE_PART":
5190
+ format += token.value === "MM" ? "mm" : token.value; // Convert "MM" back to "mm" for minutes
5191
+ break;
5191
5192
  default:
5192
5193
  format += token.value;
5193
5194
  }
@@ -48633,7 +48634,7 @@ class PivotMeasureEditor extends owl.Component {
48633
48634
  return undefined;
48634
48635
  }
48635
48636
  get isCalculatedMeasureInvalid() {
48636
- return this.env.model.getters.getMeasureCompiledFormula(this.props.measure).isBadExpression;
48637
+ return compile(this.props.measure.computedBy?.formula ?? "").isBadExpression;
48637
48638
  }
48638
48639
  }
48639
48640
 
@@ -59765,7 +59766,7 @@ class HeaderSizePlugin extends CorePlugin {
59765
59766
  let sizes = [...this.sizes[cmd.sheetId][cmd.dimension]];
59766
59767
  const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
59767
59768
  const baseSize = sizes[cmd.base];
59768
- sizes.splice(addIndex, 0, ...Array(cmd.quantity).fill(baseSize));
59769
+ sizes = insertItemsAtIndex(sizes, Array(cmd.quantity).fill(baseSize), addIndex);
59769
59770
  this.history.update("sizes", cmd.sheetId, cmd.dimension, sizes);
59770
59771
  break;
59771
59772
  }
@@ -59917,9 +59918,8 @@ class HeaderVisibilityPlugin extends CorePlugin {
59917
59918
  break;
59918
59919
  }
59919
59920
  case "ADD_COLUMNS_ROWS": {
59920
- const hiddenHeaders = [...this.hiddenHeaders[cmd.sheetId][cmd.dimension]];
59921
59921
  const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
59922
- hiddenHeaders.splice(addIndex, 0, ...Array(cmd.quantity).fill(false));
59922
+ const hiddenHeaders = insertItemsAtIndex([...this.hiddenHeaders[cmd.sheetId][cmd.dimension]], Array(cmd.quantity).fill(false), addIndex);
59923
59923
  this.history.update("hiddenHeaders", cmd.sheetId, cmd.dimension, hiddenHeaders);
59924
59924
  break;
59925
59925
  }
@@ -63983,12 +63983,12 @@ class SpreadsheetRTree {
63983
63983
  this.rTrees[sheetId].remove(item, this.rtreeItemComparer);
63984
63984
  }
63985
63985
  rtreeItemComparer(left, right) {
63986
- return (left.data == right.data &&
63987
- left.boundingBox.sheetId === right.boundingBox.sheetId &&
63986
+ return (left.boundingBox.sheetId === right.boundingBox.sheetId &&
63988
63987
  left.boundingBox?.zone.left === right.boundingBox.zone.left &&
63989
63988
  left.boundingBox?.zone.top === right.boundingBox.zone.top &&
63990
63989
  left.boundingBox?.zone.right === right.boundingBox.zone.right &&
63991
- left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom);
63990
+ left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom &&
63991
+ deepEquals(left.data, right.data));
63992
63992
  }
63993
63993
  }
63994
63994
  /**
@@ -69496,7 +69496,10 @@ class SortPlugin extends UIPlugin {
69496
69496
  return "Success" /* CommandResult.Success */;
69497
69497
  }
69498
69498
  checkArrayFormulaInSortZone({ sheetId, zone }) {
69499
- const arrayFormulaInZone = positions(zone).some(({ col, row }) => this.getters.getArrayFormulaSpreadingOn({ sheetId, col, row }));
69499
+ const arrayFormulaInZone = positions(zone).some(({ col, row }) => {
69500
+ const originPosition = this.getters.getArrayFormulaSpreadingOn({ sheetId, col, row });
69501
+ return originPosition && !deepEquals(originPosition, { sheetId, col, row });
69502
+ });
69500
69503
  return arrayFormulaInZone ? "SortZoneWithArrayFormulas" /* CommandResult.SortZoneWithArrayFormulas */ : "Success" /* CommandResult.Success */;
69501
69504
  }
69502
69505
  /**
@@ -81031,6 +81034,6 @@ exports.tokenColors = tokenColors;
81031
81034
  exports.tokenize = tokenize;
81032
81035
 
81033
81036
 
81034
- __info__.version = "18.3.21";
81035
- __info__.date = "2025-09-19T07:25:12.089Z";
81036
- __info__.hash = "b64ee85";
81037
+ __info__.version = "18.3.23";
81038
+ __info__.date = "2025-10-07T10:00:57.144Z";
81039
+ __info__.hash = "b4764cb";
@@ -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 18.3.21
6
- * @date 2025-09-19T07:25:12.089Z
7
- * @hash b64ee85
5
+ * @version 18.3.23
6
+ * @date 2025-10-07T10:00:57.144Z
7
+ * @hash b4764cb
8
8
  */
9
9
 
10
10
  import { useEnv, useSubEnv, onWillUnmount, useComponent, status, Component, useRef, onMounted, useEffect, App, blockDom, useState, onPatched, onWillPatch, onWillUpdateProps, useExternalListener, onWillStart, xml, useChildSubEnv, markRaw, toRaw } from '@odoo/owl';
@@ -877,9 +877,7 @@ function removeIndexesFromArray(array, indexes) {
877
877
  return newArray;
878
878
  }
879
879
  function insertItemsAtIndex(array, items, index) {
880
- const newArray = [...array];
881
- newArray.splice(index, 0, ...items);
882
- return newArray;
880
+ return array.slice(0, index).concat(items).concat(array.slice(index));
883
881
  }
884
882
  function replaceItemAtIndex(array, newItem, index) {
885
883
  const newArray = [...array];
@@ -5143,7 +5141,7 @@ function tokensToTextInternalFormat(tokens) {
5143
5141
  * Replace in place tokens "mm" and "m" that denote minutes in date format with "MM" to avoid confusion with months.
5144
5142
  *
5145
5143
  * As per OpenXML specification, in date formats if a date token "m" or "mm" is followed by a date token "s" or
5146
- * preceded by a data token "h", then it's not a month but an minute.
5144
+ * preceded by a data token "h", then it's not a month but a minute.
5147
5145
  */
5148
5146
  function convertTokensToMinutesInDateFormat(tokens) {
5149
5147
  const dateParts = tokens.filter((token) => token.type === "DATE_PART");
@@ -5186,6 +5184,9 @@ function internalFormatPartToFormat(internalFormat) {
5186
5184
  case "REPEATED_CHAR":
5187
5185
  format += "*" + token.value;
5188
5186
  break;
5187
+ case "DATE_PART":
5188
+ format += token.value === "MM" ? "mm" : token.value; // Convert "MM" back to "mm" for minutes
5189
+ break;
5189
5190
  default:
5190
5191
  format += token.value;
5191
5192
  }
@@ -48631,7 +48632,7 @@ class PivotMeasureEditor extends Component {
48631
48632
  return undefined;
48632
48633
  }
48633
48634
  get isCalculatedMeasureInvalid() {
48634
- return this.env.model.getters.getMeasureCompiledFormula(this.props.measure).isBadExpression;
48635
+ return compile(this.props.measure.computedBy?.formula ?? "").isBadExpression;
48635
48636
  }
48636
48637
  }
48637
48638
 
@@ -59763,7 +59764,7 @@ class HeaderSizePlugin extends CorePlugin {
59763
59764
  let sizes = [...this.sizes[cmd.sheetId][cmd.dimension]];
59764
59765
  const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
59765
59766
  const baseSize = sizes[cmd.base];
59766
- sizes.splice(addIndex, 0, ...Array(cmd.quantity).fill(baseSize));
59767
+ sizes = insertItemsAtIndex(sizes, Array(cmd.quantity).fill(baseSize), addIndex);
59767
59768
  this.history.update("sizes", cmd.sheetId, cmd.dimension, sizes);
59768
59769
  break;
59769
59770
  }
@@ -59915,9 +59916,8 @@ class HeaderVisibilityPlugin extends CorePlugin {
59915
59916
  break;
59916
59917
  }
59917
59918
  case "ADD_COLUMNS_ROWS": {
59918
- const hiddenHeaders = [...this.hiddenHeaders[cmd.sheetId][cmd.dimension]];
59919
59919
  const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
59920
- hiddenHeaders.splice(addIndex, 0, ...Array(cmd.quantity).fill(false));
59920
+ const hiddenHeaders = insertItemsAtIndex([...this.hiddenHeaders[cmd.sheetId][cmd.dimension]], Array(cmd.quantity).fill(false), addIndex);
59921
59921
  this.history.update("hiddenHeaders", cmd.sheetId, cmd.dimension, hiddenHeaders);
59922
59922
  break;
59923
59923
  }
@@ -63981,12 +63981,12 @@ class SpreadsheetRTree {
63981
63981
  this.rTrees[sheetId].remove(item, this.rtreeItemComparer);
63982
63982
  }
63983
63983
  rtreeItemComparer(left, right) {
63984
- return (left.data == right.data &&
63985
- left.boundingBox.sheetId === right.boundingBox.sheetId &&
63984
+ return (left.boundingBox.sheetId === right.boundingBox.sheetId &&
63986
63985
  left.boundingBox?.zone.left === right.boundingBox.zone.left &&
63987
63986
  left.boundingBox?.zone.top === right.boundingBox.zone.top &&
63988
63987
  left.boundingBox?.zone.right === right.boundingBox.zone.right &&
63989
- left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom);
63988
+ left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom &&
63989
+ deepEquals(left.data, right.data));
63990
63990
  }
63991
63991
  }
63992
63992
  /**
@@ -69494,7 +69494,10 @@ class SortPlugin extends UIPlugin {
69494
69494
  return "Success" /* CommandResult.Success */;
69495
69495
  }
69496
69496
  checkArrayFormulaInSortZone({ sheetId, zone }) {
69497
- const arrayFormulaInZone = positions(zone).some(({ col, row }) => this.getters.getArrayFormulaSpreadingOn({ sheetId, col, row }));
69497
+ const arrayFormulaInZone = positions(zone).some(({ col, row }) => {
69498
+ const originPosition = this.getters.getArrayFormulaSpreadingOn({ sheetId, col, row });
69499
+ return originPosition && !deepEquals(originPosition, { sheetId, col, row });
69500
+ });
69498
69501
  return arrayFormulaInZone ? "SortZoneWithArrayFormulas" /* CommandResult.SortZoneWithArrayFormulas */ : "Success" /* CommandResult.Success */;
69499
69502
  }
69500
69503
  /**
@@ -80983,6 +80986,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
80983
80986
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, CommandResult, CorePlugin, CoreViewPlugin, DispatchResult, EvaluationError, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, chartHelpers, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
80984
80987
 
80985
80988
 
80986
- __info__.version = "18.3.21";
80987
- __info__.date = "2025-09-19T07:25:12.089Z";
80988
- __info__.hash = "b64ee85";
80989
+ __info__.version = "18.3.23";
80990
+ __info__.date = "2025-10-07T10:00:57.144Z";
80991
+ __info__.hash = "b4764cb";
@@ -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 18.3.21
6
- * @date 2025-09-19T07:25:12.089Z
7
- * @hash b64ee85
5
+ * @version 18.3.23
6
+ * @date 2025-10-07T10:00:57.144Z
7
+ * @hash b4764cb
8
8
  */
9
9
 
10
10
  (function (exports, owl) {
@@ -878,9 +878,7 @@
878
878
  return newArray;
879
879
  }
880
880
  function insertItemsAtIndex(array, items, index) {
881
- const newArray = [...array];
882
- newArray.splice(index, 0, ...items);
883
- return newArray;
881
+ return array.slice(0, index).concat(items).concat(array.slice(index));
884
882
  }
885
883
  function replaceItemAtIndex(array, newItem, index) {
886
884
  const newArray = [...array];
@@ -5144,7 +5142,7 @@
5144
5142
  * Replace in place tokens "mm" and "m" that denote minutes in date format with "MM" to avoid confusion with months.
5145
5143
  *
5146
5144
  * As per OpenXML specification, in date formats if a date token "m" or "mm" is followed by a date token "s" or
5147
- * preceded by a data token "h", then it's not a month but an minute.
5145
+ * preceded by a data token "h", then it's not a month but a minute.
5148
5146
  */
5149
5147
  function convertTokensToMinutesInDateFormat(tokens) {
5150
5148
  const dateParts = tokens.filter((token) => token.type === "DATE_PART");
@@ -5187,6 +5185,9 @@
5187
5185
  case "REPEATED_CHAR":
5188
5186
  format += "*" + token.value;
5189
5187
  break;
5188
+ case "DATE_PART":
5189
+ format += token.value === "MM" ? "mm" : token.value; // Convert "MM" back to "mm" for minutes
5190
+ break;
5190
5191
  default:
5191
5192
  format += token.value;
5192
5193
  }
@@ -48632,7 +48633,7 @@ stores.inject(MyMetaStore, storeInstance);
48632
48633
  return undefined;
48633
48634
  }
48634
48635
  get isCalculatedMeasureInvalid() {
48635
- return this.env.model.getters.getMeasureCompiledFormula(this.props.measure).isBadExpression;
48636
+ return compile(this.props.measure.computedBy?.formula ?? "").isBadExpression;
48636
48637
  }
48637
48638
  }
48638
48639
 
@@ -59764,7 +59765,7 @@ stores.inject(MyMetaStore, storeInstance);
59764
59765
  let sizes = [...this.sizes[cmd.sheetId][cmd.dimension]];
59765
59766
  const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
59766
59767
  const baseSize = sizes[cmd.base];
59767
- sizes.splice(addIndex, 0, ...Array(cmd.quantity).fill(baseSize));
59768
+ sizes = insertItemsAtIndex(sizes, Array(cmd.quantity).fill(baseSize), addIndex);
59768
59769
  this.history.update("sizes", cmd.sheetId, cmd.dimension, sizes);
59769
59770
  break;
59770
59771
  }
@@ -59916,9 +59917,8 @@ stores.inject(MyMetaStore, storeInstance);
59916
59917
  break;
59917
59918
  }
59918
59919
  case "ADD_COLUMNS_ROWS": {
59919
- const hiddenHeaders = [...this.hiddenHeaders[cmd.sheetId][cmd.dimension]];
59920
59920
  const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
59921
- hiddenHeaders.splice(addIndex, 0, ...Array(cmd.quantity).fill(false));
59921
+ const hiddenHeaders = insertItemsAtIndex([...this.hiddenHeaders[cmd.sheetId][cmd.dimension]], Array(cmd.quantity).fill(false), addIndex);
59922
59922
  this.history.update("hiddenHeaders", cmd.sheetId, cmd.dimension, hiddenHeaders);
59923
59923
  break;
59924
59924
  }
@@ -63982,12 +63982,12 @@ stores.inject(MyMetaStore, storeInstance);
63982
63982
  this.rTrees[sheetId].remove(item, this.rtreeItemComparer);
63983
63983
  }
63984
63984
  rtreeItemComparer(left, right) {
63985
- return (left.data == right.data &&
63986
- left.boundingBox.sheetId === right.boundingBox.sheetId &&
63985
+ return (left.boundingBox.sheetId === right.boundingBox.sheetId &&
63987
63986
  left.boundingBox?.zone.left === right.boundingBox.zone.left &&
63988
63987
  left.boundingBox?.zone.top === right.boundingBox.zone.top &&
63989
63988
  left.boundingBox?.zone.right === right.boundingBox.zone.right &&
63990
- left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom);
63989
+ left.boundingBox?.zone.bottom === right.boundingBox.zone.bottom &&
63990
+ deepEquals(left.data, right.data));
63991
63991
  }
63992
63992
  }
63993
63993
  /**
@@ -69495,7 +69495,10 @@ stores.inject(MyMetaStore, storeInstance);
69495
69495
  return "Success" /* CommandResult.Success */;
69496
69496
  }
69497
69497
  checkArrayFormulaInSortZone({ sheetId, zone }) {
69498
- const arrayFormulaInZone = positions(zone).some(({ col, row }) => this.getters.getArrayFormulaSpreadingOn({ sheetId, col, row }));
69498
+ const arrayFormulaInZone = positions(zone).some(({ col, row }) => {
69499
+ const originPosition = this.getters.getArrayFormulaSpreadingOn({ sheetId, col, row });
69500
+ return originPosition && !deepEquals(originPosition, { sheetId, col, row });
69501
+ });
69499
69502
  return arrayFormulaInZone ? "SortZoneWithArrayFormulas" /* CommandResult.SortZoneWithArrayFormulas */ : "Success" /* CommandResult.Success */;
69500
69503
  }
69501
69504
  /**
@@ -81030,9 +81033,9 @@ stores.inject(MyMetaStore, storeInstance);
81030
81033
  exports.tokenize = tokenize;
81031
81034
 
81032
81035
 
81033
- __info__.version = "18.3.21";
81034
- __info__.date = "2025-09-19T07:25:12.089Z";
81035
- __info__.hash = "b64ee85";
81036
+ __info__.version = "18.3.23";
81037
+ __info__.date = "2025-10-07T10:00:57.144Z";
81038
+ __info__.hash = "b4764cb";
81036
81039
 
81037
81040
 
81038
81041
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);