@odoo/o-spreadsheet 19.3.6 → 19.3.10

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 19.3.6
6
- * @date 2026-06-06T06:24:22.727Z
7
- * @hash 0fe939b
5
+ * @version 19.3.10
6
+ * @date 2026-07-01T05:04:42.999Z
7
+ * @hash 040ae04
8
8
  */
9
9
 
10
10
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
@@ -235,7 +235,7 @@ const GRAY_400 = "#ced4da";
235
235
  const GRAY_300 = "#D8DADD";
236
236
  const GRAY_200 = "#E7E9ED";
237
237
  const TEXT_BODY = "#374151";
238
- const TEXT_BODY_MUTED = TEXT_BODY + "C2";
238
+ const TEXT_BODY_MUTED = "#374151C2";
239
239
  const ACTION_COLOR = HIGHLIGHT_COLOR;
240
240
  const CHART_TITLE_FONT_SIZE = 16;
241
241
  const DEFAULT_CHART_COLOR_SCALE = {
@@ -328,9 +328,6 @@ const COLOR_PICKER_DEFAULTS = [
328
328
  ];
329
329
  const DEFAULT_CELL_HEIGHT = 23;
330
330
  const FOOTER_HEIGHT = 2 * 23;
331
- const MENU_SEPARATOR_BORDER_WIDTH = 1;
332
- const MENU_SEPARATOR_PADDING = 5;
333
- const MENU_SEPARATOR_HEIGHT = 1 + 2 * 5;
334
331
  const ZOOM_VALUES = [
335
332
  50,
336
333
  75,
@@ -361,7 +358,7 @@ const DEFAULT_NUMBER_STYLE = {
361
358
  const DEFAULT_VERTICAL_ALIGN = DEFAULT_STYLE.verticalAlign;
362
359
  const DEFAULT_WRAPPING_MODE = DEFAULT_STYLE.wrapping;
363
360
  const DEFAULT_FONT_SIZE = DEFAULT_STYLE.fontSize;
364
- const DEFAULT_FONT = "'Roboto', arial";
361
+ const DEFAULT_FONT = "'Roboto', arial, 'Liberation Sans'";
365
362
  const DEFAULT_BORDER_DESC = {
366
363
  style: "thin",
367
364
  color: "#000000"
@@ -1233,7 +1230,7 @@ function toXC(col, row, rangePart = {
1233
1230
  function recomputeZones(zones, zonesToRemove = []) {
1234
1231
  if (zones.length <= 1 && zonesToRemove.length === 0) return zones;
1235
1232
  const profilesStartingPosition = [0];
1236
- const profiles = new Map([[0, []]]);
1233
+ const profiles = /* @__PURE__ */ new Map([[0, []]]);
1237
1234
  modifyProfiles(profilesStartingPosition, profiles, zones, false);
1238
1235
  modifyProfiles(profilesStartingPosition, profiles, zonesToRemove, true);
1239
1236
  return constructZonesFromProfiles(profilesStartingPosition, profiles);
@@ -3945,12 +3942,10 @@ const getNumberRegex = memoize(function getNumberRegex(locale) {
3945
3942
  const pIntegerAndDecimals = `(?:\\d+(?:${escapeRegExp(locale.thousandsSeparator || "")}\\d{3,})*(?:${decimalSeparator}\\d*)?)`;
3946
3943
  const pOnlyDecimals = `(?:${decimalSeparator}\\d+)`;
3947
3944
  const pNumber = "(?:\\s*" + pIntegerAndDecimals + "|" + pOnlyDecimals + ")(?:(e|E)(?:\\+|-)?(?:[0-9]|[0-9][0-9]|[12][0-9]{2}|30[0-7]))?(?:\\s*%)?";
3948
- const pMinus = "(?:\\s*-)?";
3949
- const pCurrencyFormat = "(?:\\s*[\\$€])?";
3950
3945
  const pNumberExp = "^(?:(?:" + [
3951
- pMinus + pCurrencyFormat + pNumber,
3952
- pMinus + pNumber + pCurrencyFormat,
3953
- pCurrencyFormat + pMinus + pNumber
3946
+ "(?:\\s*-)?(?:\\s*[\\$€])?" + pNumber,
3947
+ "(?:\\s*-)?" + pNumber + "(?:\\s*[\\$€])?",
3948
+ "(?:\\s*[\\$€])?(?:\\s*-)?" + pNumber
3954
3949
  ].join(")|(?:") + "))$";
3955
3950
  return new RegExp(pNumberExp, "i");
3956
3951
  });
@@ -7552,7 +7547,7 @@ function isPositionDependent(cmd) {
7552
7547
  function isZoneDependent(cmd) {
7553
7548
  return "sheetId" in cmd && "zone" in cmd;
7554
7549
  }
7555
- const invalidateEvaluationCommands = new Set([
7550
+ const invalidateEvaluationCommands = /* @__PURE__ */ new Set([
7556
7551
  "RENAME_SHEET",
7557
7552
  "DELETE_SHEET",
7558
7553
  "CREATE_SHEET",
@@ -7574,7 +7569,7 @@ const invalidateEvaluationCommands = new Set([
7574
7569
  "UPDATE_NAMED_RANGE",
7575
7570
  "DELETE_NAMED_RANGE"
7576
7571
  ]);
7577
- const invalidateChartEvaluationCommands = new Set([
7572
+ const invalidateChartEvaluationCommands = /* @__PURE__ */ new Set([
7578
7573
  "EVALUATE_CELLS",
7579
7574
  "EVALUATE_CHARTS",
7580
7575
  "UPDATE_CELL",
@@ -7593,20 +7588,20 @@ const invalidateChartEvaluationCommands = new Set([
7593
7588
  "UNDO",
7594
7589
  "REDO"
7595
7590
  ]);
7596
- const invalidateDependenciesCommands = new Set(["MOVE_RANGES"]);
7597
- const invalidateCFEvaluationCommands = new Set([
7591
+ const invalidateDependenciesCommands = /* @__PURE__ */ new Set(["MOVE_RANGES"]);
7592
+ const invalidateCFEvaluationCommands = /* @__PURE__ */ new Set([
7598
7593
  "EVALUATE_CELLS",
7599
7594
  "ADD_CONDITIONAL_FORMAT",
7600
7595
  "REMOVE_CONDITIONAL_FORMAT",
7601
7596
  "CHANGE_CONDITIONAL_FORMAT_PRIORITY"
7602
7597
  ]);
7603
- const invalidateBordersCommands = new Set([
7598
+ const invalidateBordersCommands = /* @__PURE__ */ new Set([
7604
7599
  "AUTOFILL_CELL",
7605
7600
  "SET_BORDER",
7606
7601
  "SET_ZONE_BORDERS",
7607
7602
  "SET_BORDERS_ON_TARGET"
7608
7603
  ]);
7609
- const invalidSubtotalFormulasCommands = new Set([
7604
+ const invalidSubtotalFormulasCommands = /* @__PURE__ */ new Set([
7610
7605
  "UNHIDE_COLUMNS_ROWS",
7611
7606
  "HIDE_COLUMNS_ROWS",
7612
7607
  "GROUP_HEADERS",
@@ -7620,7 +7615,7 @@ const invalidSubtotalFormulasCommands = new Set([
7620
7615
  "UPDATE_TABLE",
7621
7616
  "UPDATE_FILTER"
7622
7617
  ]);
7623
- const readonlyAllowedCommands = new Set([
7618
+ const readonlyAllowedCommands = /* @__PURE__ */ new Set([
7624
7619
  "START",
7625
7620
  "ACTIVATE_SHEET",
7626
7621
  "COPY",
@@ -7636,7 +7631,7 @@ const readonlyAllowedCommands = new Set([
7636
7631
  "UPDATE_CAROUSEL_ACTIVE_ITEM",
7637
7632
  "UPDATE_PIVOT"
7638
7633
  ]);
7639
- const lockedSheetAllowedCommands = new Set([
7634
+ const lockedSheetAllowedCommands = /* @__PURE__ */ new Set([
7640
7635
  "LOCK_SHEET",
7641
7636
  "UNLOCK_SHEET",
7642
7637
  "MOVE_SHEET",
@@ -7667,7 +7662,7 @@ const lockedSheetAllowedCommands = new Set([
7667
7662
  "SHIFT_VIEWPORT_DOWN",
7668
7663
  "SHIFT_VIEWPORT_UP"
7669
7664
  ]);
7670
- const coreTypes = new Set([
7665
+ const coreTypes = /* @__PURE__ */ new Set([
7671
7666
  "UPDATE_CELL",
7672
7667
  "UPDATE_CELL_POSITION",
7673
7668
  "CLEAR_CELL",
@@ -8301,7 +8296,6 @@ function getCanonicalRepresentation(item) {
8301
8296
  //#region src/helpers/edge_scrolling.ts
8302
8297
  const MAX_DELAY = 140;
8303
8298
  const MIN_DELAY = 20;
8304
- const ACCELERATION = .035;
8305
8299
  /**
8306
8300
  * Decreasing exponential function used to determine the "speed" of edge-scrolling
8307
8301
  * as the timeout delay.
@@ -8309,7 +8303,7 @@ const ACCELERATION = .035;
8309
8303
  * Returns a timeout delay in milliseconds.
8310
8304
  */
8311
8305
  function scrollDelay(value) {
8312
- return 20 + (140 - 20) * Math.exp(-ACCELERATION * (value - 1));
8306
+ return 20 + (140 - 20) * Math.exp(-.035 * (value - 1));
8313
8307
  }
8314
8308
 
8315
8309
  //#endregion
@@ -8712,7 +8706,7 @@ var UuidGenerator = class {
8712
8706
  const cryptoObj = this.getCrypto();
8713
8707
  if (cryptoObj) return "10000000-1000".replace(/[01]/g, (c) => {
8714
8708
  const n = Number(c);
8715
- return (n ^ cryptoObj.getRandomValues(new Uint8Array(1))[0] & 15 >> n / 4).toString(16);
8709
+ return (n ^ cryptoObj.getRandomValues(/* @__PURE__ */ new Uint8Array(1))[0] & 15 >> n / 4).toString(16);
8716
8710
  });
8717
8711
  else return "xxxxxxxx-xxxx".replace(/[xy]/g, function(c) {
8718
8712
  const r = Math.random() * 16 | 0;
@@ -8727,7 +8721,7 @@ var UuidGenerator = class {
8727
8721
  const cryptoObj = this.getCrypto();
8728
8722
  if (cryptoObj) return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => {
8729
8723
  const n = Number(c);
8730
- return (n ^ cryptoObj.getRandomValues(new Uint8Array(1))[0] & 15 >> n / 4).toString(16);
8724
+ return (n ^ cryptoObj.getRandomValues(/* @__PURE__ */ new Uint8Array(1))[0] & 15 >> n / 4).toString(16);
8731
8725
  });
8732
8726
  else return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
8733
8727
  const r = Math.random() * 16 | 0;
@@ -12749,7 +12743,7 @@ const availableConditionalFormatOperators = new Set(cfOperators);
12749
12743
 
12750
12744
  //#endregion
12751
12745
  //#region src/types/data_validation.ts
12752
- const availableDataValidationOperators = new Set([
12746
+ const availableDataValidationOperators = /* @__PURE__ */ new Set([
12753
12747
  "containsText",
12754
12748
  "notContainsText",
12755
12749
  "isEqualText",
@@ -13343,10 +13337,10 @@ function toNormalizedPivotValue(dimension, groupValue) {
13343
13337
  type: dimension.type
13344
13338
  }));
13345
13339
  if (groupValueString.toLowerCase() === "false") return false;
13346
- return pivotNormalizationValueRegistry.get(dimension.type)(groupValueString, dimension.granularity);
13340
+ return pivotNormalizationValueRegistry.get(dimension.type)(groupValueString, dimension);
13347
13341
  }
13348
- function normalizeDateTime(value, granularity) {
13349
- return pivotTimeAdapter(granularity ?? "month").normalizeFunctionValue(value);
13342
+ function normalizeDateTime(value, dimension) {
13343
+ return pivotTimeAdapter(dimension.granularity ?? "month").normalizeFunctionValue(value);
13350
13344
  }
13351
13345
  function toFunctionPivotValue(value, dimension) {
13352
13346
  if (value === null) return `"null"`;
@@ -15945,6 +15939,59 @@ function getCarouselItemTitle(getters, item) {
15945
15939
  return (chartSubtypeRegistry.getAll().find((c) => c.matcher?.(definition)) || chartSubtypeRegistry.get(definition.type)).displayName;
15946
15940
  }
15947
15941
 
15942
+ //#endregion
15943
+ //#region src/components/helpers/css.ts
15944
+ function getTextDecoration({ strikethrough, underline }) {
15945
+ if (!strikethrough && !underline) return "none";
15946
+ return `${strikethrough ? "line-through" : ""} ${underline ? "underline" : ""}`;
15947
+ }
15948
+ /**
15949
+ * Convert the cell style to CSS properties.
15950
+ */
15951
+ function cellStyleToCss(style) {
15952
+ const attributes = cellTextStyleToCss(style);
15953
+ if (!style) return attributes;
15954
+ if (style.fillColor) attributes["background"] = style.fillColor;
15955
+ return attributes;
15956
+ }
15957
+ /**
15958
+ * Convert the cell text style to CSS properties.
15959
+ */
15960
+ function cellTextStyleToCss(style) {
15961
+ const attributes = {};
15962
+ if (!style) return attributes;
15963
+ if (style.bold) attributes["font-weight"] = "bold";
15964
+ if (style.italic) attributes["font-style"] = "italic";
15965
+ if (style.fontSize) attributes["font-size"] = `${style.fontSize}px`;
15966
+ if (style.strikethrough || style.underline) {
15967
+ let decoration = style.strikethrough ? "line-through" : "";
15968
+ decoration = style.underline ? decoration + " underline" : decoration;
15969
+ attributes["text-decoration"] = decoration;
15970
+ }
15971
+ if (style.textColor) attributes["color"] = style.textColor;
15972
+ return attributes;
15973
+ }
15974
+ /**
15975
+ * Transform CSS properties into a CSS string.
15976
+ */
15977
+ function cssPropertiesToCss(attributes) {
15978
+ let styleStr = "";
15979
+ for (const attName in attributes) {
15980
+ if (!attributes[attName]) continue;
15981
+ styleStr += `${attName}:${attributes[attName]}; `;
15982
+ }
15983
+ return styleStr;
15984
+ }
15985
+ function getElementMargins(el) {
15986
+ const style = window.getComputedStyle(el);
15987
+ return {
15988
+ top: parseInt(style.marginTop, 10) || 0,
15989
+ bottom: parseInt(style.marginBottom, 10) || 0,
15990
+ left: parseInt(style.marginLeft, 10) || 0,
15991
+ right: parseInt(style.marginRight, 10) || 0
15992
+ };
15993
+ }
15994
+
15948
15995
  //#endregion
15949
15996
  //#region src/components/figures/chart/chartJs/zoomable_chart/zoomable_chart_store.ts
15950
15997
  const TREND_LINE_AXES_IDS = ["x1", MOVING_AVERAGE_TREND_LINE_XAXIS_ID];
@@ -16063,9 +16110,7 @@ var ZoomableChartJsComponent = class extends ChartJsComponent {
16063
16110
  this.removeEventListeners();
16064
16111
  }
16065
16112
  get containerStyle() {
16066
- return `
16067
- height:${this.sliceable ? `calc(100% - ${60}px)` : "100%"};
16068
- `;
16113
+ return cssPropertiesToCss({ height: this.sliceable ? `calc(100% - ${60}px)` : "100%" });
16069
16114
  }
16070
16115
  get masterChartContainerStyle() {
16071
16116
  const runtime = this.env.model.getters.getChartRuntime(this.props.chartId);
@@ -16929,59 +16974,6 @@ var FullScreenFigureStore = class extends SpreadsheetStore {
16929
16974
  }
16930
16975
  };
16931
16976
 
16932
- //#endregion
16933
- //#region src/components/helpers/css.ts
16934
- function getTextDecoration({ strikethrough, underline }) {
16935
- if (!strikethrough && !underline) return "none";
16936
- return `${strikethrough ? "line-through" : ""} ${underline ? "underline" : ""}`;
16937
- }
16938
- /**
16939
- * Convert the cell style to CSS properties.
16940
- */
16941
- function cellStyleToCss(style) {
16942
- const attributes = cellTextStyleToCss(style);
16943
- if (!style) return attributes;
16944
- if (style.fillColor) attributes["background"] = style.fillColor;
16945
- return attributes;
16946
- }
16947
- /**
16948
- * Convert the cell text style to CSS properties.
16949
- */
16950
- function cellTextStyleToCss(style) {
16951
- const attributes = {};
16952
- if (!style) return attributes;
16953
- if (style.bold) attributes["font-weight"] = "bold";
16954
- if (style.italic) attributes["font-style"] = "italic";
16955
- if (style.fontSize) attributes["font-size"] = `${style.fontSize}px`;
16956
- if (style.strikethrough || style.underline) {
16957
- let decoration = style.strikethrough ? "line-through" : "";
16958
- decoration = style.underline ? decoration + " underline" : decoration;
16959
- attributes["text-decoration"] = decoration;
16960
- }
16961
- if (style.textColor) attributes["color"] = style.textColor;
16962
- return attributes;
16963
- }
16964
- /**
16965
- * Transform CSS properties into a CSS string.
16966
- */
16967
- function cssPropertiesToCss(attributes) {
16968
- let styleStr = "";
16969
- for (const attName in attributes) {
16970
- if (!attributes[attName]) continue;
16971
- styleStr += `${attName}:${attributes[attName]}; `;
16972
- }
16973
- return styleStr;
16974
- }
16975
- function getElementMargins(el) {
16976
- const style = window.getComputedStyle(el);
16977
- return {
16978
- top: parseInt(style.marginTop, 10) || 0,
16979
- bottom: parseInt(style.marginBottom, 10) || 0,
16980
- left: parseInt(style.marginLeft, 10) || 0,
16981
- right: parseInt(style.marginRight, 10) || 0
16982
- };
16983
- }
16984
-
16985
16977
  //#endregion
16986
16978
  //#region src/stores/DOM_focus_store.ts
16987
16979
  var DOMFocusableElementStore = class {
@@ -18229,11 +18221,11 @@ var FigureComponent = class extends _odoo_owl.Component {
18229
18221
  getResizerPosition(resizer) {
18230
18222
  const anchorCenteringOffset = (ANCHOR_SIZE - ACTIVE_BORDER_WIDTH) / 2;
18231
18223
  const style = {};
18232
- if (resizer.includes("top")) style.top = `${-anchorCenteringOffset}px`;
18233
- else if (resizer.includes("bottom")) style.bottom = `${-anchorCenteringOffset}px`;
18224
+ if (resizer.includes("top")) style.top = `-3px`;
18225
+ else if (resizer.includes("bottom")) style.bottom = `-3px`;
18234
18226
  else style.bottom = `calc(50% - ${anchorCenteringOffset}px)`;
18235
- if (resizer.includes("left")) style.left = `${-anchorCenteringOffset}px`;
18236
- else if (resizer.includes("right")) style.right = `${-anchorCenteringOffset}px`;
18227
+ if (resizer.includes("left")) style.left = `-3px`;
18228
+ else if (resizer.includes("right")) style.right = `-3px`;
18237
18229
  else style.right = `calc(50% - ${anchorCenteringOffset}px)`;
18238
18230
  return cssPropertiesToCss(style);
18239
18231
  }
@@ -25831,6 +25823,7 @@ function mapParenthesisCode(tokens) {
25831
25823
  function mapParentFunction(tokens) {
25832
25824
  const stack = [];
25833
25825
  let functionStarted = "";
25826
+ let braceDepth = 0;
25834
25827
  function pushTokenToFunctionContext(token) {
25835
25828
  if (stack.length === 0) return;
25836
25829
  const functionContext = stack.at(-1);
@@ -25843,7 +25836,7 @@ function mapParentFunction(tokens) {
25843
25836
  });
25844
25837
  }
25845
25838
  }
25846
- return tokens.map((token, i) => {
25839
+ return tokens.map((token) => {
25847
25840
  if (!["SPACE", "LEFT_PAREN"].includes(token.type)) functionStarted = "";
25848
25841
  switch (token.type) {
25849
25842
  case "SYMBOL":
@@ -25864,8 +25857,16 @@ function mapParentFunction(tokens) {
25864
25857
  stack.pop()?.argsTokens?.flat().forEach(pushTokenToFunctionContext);
25865
25858
  pushTokenToFunctionContext(token);
25866
25859
  break;
25860
+ case "LEFT_BRACE":
25861
+ braceDepth++;
25862
+ pushTokenToFunctionContext(token);
25863
+ break;
25864
+ case "RIGHT_BRACE":
25865
+ braceDepth--;
25866
+ pushTokenToFunctionContext(token);
25867
+ break;
25867
25868
  case "ARG_SEPARATOR":
25868
- if (stack.length) stack[stack.length - 1].argPosition++;
25869
+ if (stack.length && braceDepth === 0) stack[stack.length - 1].argPosition++;
25869
25870
  pushTokenToFunctionContext(token);
25870
25871
  break;
25871
25872
  default:
@@ -27217,10 +27218,7 @@ function startDnd(onPointerMove, onPointerUp) {
27217
27218
  //#endregion
27218
27219
  //#region src/components/color_picker/color_picker.ts
27219
27220
  const ITEM_BORDER_WIDTH = 1;
27220
- const ITEM_EDGE_LENGTH = 18;
27221
- const ITEMS_PER_LINE = 10;
27222
- const MAGNIFIER_EDGE = 16;
27223
- const CONTENT_WIDTH = ITEMS_PER_LINE * (ITEM_EDGE_LENGTH + 2 * ITEM_BORDER_WIDTH) + (ITEMS_PER_LINE - 1) * 2;
27221
+ const CONTENT_WIDTH = 218;
27224
27222
  const INNER_GRADIENT_WIDTH = CONTENT_WIDTH - 2 * ITEM_BORDER_WIDTH;
27225
27223
  const INNER_GRADIENT_HEIGHT = CONTENT_WIDTH - 30 - 2 * ITEM_BORDER_WIDTH;
27226
27224
  var ColorPicker = class extends _odoo_owl.Component {
@@ -27284,8 +27282,8 @@ var ColorPicker = class extends _odoo_owl.Component {
27284
27282
  const left = Math.round(INNER_GRADIENT_WIDTH * clip(s / 100, 0, 1));
27285
27283
  const top = Math.round(INNER_GRADIENT_HEIGHT * clip(1 - 2 * l / (200 - s), 0, 1));
27286
27284
  return cssPropertiesToCss({
27287
- left: `${-MAGNIFIER_EDGE / 2 + left}px`,
27288
- top: `${-MAGNIFIER_EDGE / 2 + top}px`,
27285
+ left: `${-16 / 2 + left}px`,
27286
+ top: `${-16 / 2 + top}px`,
27289
27287
  background: hslaToHex(this.state.currentHslaColor)
27290
27288
  });
27291
27289
  }
@@ -32825,9 +32823,12 @@ var SpreadsheetChart = class SpreadsheetChart {
32825
32823
  labelValues: []
32826
32824
  })
32827
32825
  };
32828
- return this.chartTypeBuilder.getRuntime(getters, this.definition, dataExtractors, this.sheetId, { onClick: (event, items, chartJsChart) => {
32829
- return this.dataSourceBuilder.onDataSetClick?.(this.definition.type, chartId, event, items, chartJsChart, getters);
32830
- } });
32826
+ return this.chartTypeBuilder.getRuntime(getters, this.definition, dataExtractors, this.sheetId, {
32827
+ onClick: (event, items, chartJsChart) => {
32828
+ return this.dataSourceBuilder.onDataSetClick?.(this.definition.type, chartId, event, items, chartJsChart, getters);
32829
+ },
32830
+ onHover: (event, items, chartJsChart) => this.dataSourceBuilder.onDataSetHover?.(this.definition.type, chartId, event, items, chartJsChart)
32831
+ });
32831
32832
  }
32832
32833
  static deleteInvalidKeys(definition) {
32833
32834
  definition = { ...definition };
@@ -33034,7 +33035,7 @@ function getChartDatasetValues(getters, dataSets) {
33034
33035
  if (cell) label = cell.formattedValue;
33035
33036
  }
33036
33037
  let data = ds.dataRange ? getData(getters, ds) : [];
33037
- if (data.every((cell) => !cell.value || isTextResult(cell)) && data.filter(isTextResult).length > 1) data = data.map((cell) => cell.value && isErrorResult(cell) ? ONE : EMPTY);
33038
+ if (data.every((cell) => !cell.value || isTextResult(cell)) && data.filter(isTextResult).length > 1) data = data.map((cell) => cell.value && !isErrorResult(cell) ? ONE : EMPTY);
33038
33039
  else if (data.every((cell) => !isNumberResult(cell))) hidden = true;
33039
33040
  datasetValues.push({
33040
33041
  data,
@@ -36024,9 +36025,9 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
36024
36025
  allSheetsMatches = [];
36025
36026
  activeSheetMatches = [];
36026
36027
  specificRangeMatches = [];
36028
+ selectedMatchPosition = null;
36027
36029
  currentSearchRegex = null;
36028
36030
  initialShowFormulaState;
36029
- preserveSelectedMatchIndex = false;
36030
36031
  irreplaceableMatchCount = 0;
36031
36032
  isSearchDirty = false;
36032
36033
  shouldFinalizeUpdateSelection = false;
@@ -36148,7 +36149,10 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
36148
36149
  */
36149
36150
  _updateSearch(toSearch, searchOptions) {
36150
36151
  this.searchOptions = searchOptions;
36151
- if (toSearch !== this.toSearch) this.selectedMatchIndex = null;
36152
+ if (toSearch !== this.toSearch) {
36153
+ this.selectedMatchIndex = null;
36154
+ this.selectedMatchPosition = null;
36155
+ }
36152
36156
  this.toSearch = toSearch;
36153
36157
  this.currentSearchRegex = getSearchRegex(this.toSearch, this.searchOptions);
36154
36158
  this.refreshSearch({
@@ -36160,8 +36164,14 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
36160
36164
  * refresh the matches according to the current search options
36161
36165
  */
36162
36166
  refreshSearch(options) {
36163
- if (!this.preserveSelectedMatchIndex) this.selectedMatchIndex = null;
36164
36167
  this.findMatches();
36168
+ if (this.selectedMatchPosition) if (this.selectedMatchPosition.sheetId !== this.getters.getActiveSheetId()) {
36169
+ this.selectedMatchIndex = null;
36170
+ this.selectedMatchPosition = null;
36171
+ } else {
36172
+ const index = this.searchMatches.findIndex((match) => match.sheetId === this.selectedMatchPosition?.sheetId && match.col === this.selectedMatchPosition?.col && match.row === this.selectedMatchPosition?.row);
36173
+ if (index !== -1) this.selectedMatchIndex = index;
36174
+ }
36165
36175
  this.selectNextCell(0, options);
36166
36176
  }
36167
36177
  getSheetsInSearchOrder() {
@@ -36229,6 +36239,7 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
36229
36239
  const matches = this.searchMatches;
36230
36240
  if (!matches.length) {
36231
36241
  this.selectedMatchIndex = null;
36242
+ this.selectedMatchPosition = null;
36232
36243
  return;
36233
36244
  }
36234
36245
  let nextIndex;
@@ -36242,14 +36253,13 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
36242
36253
  } else nextIndex = this.selectedMatchIndex + indexChange;
36243
36254
  nextIndex = (nextIndex + matches.length) % matches.length;
36244
36255
  this.selectedMatchIndex = nextIndex;
36256
+ this.selectedMatchPosition = matches[this.selectedMatchIndex];
36245
36257
  const selectedMatch = matches[nextIndex];
36246
36258
  if (options.jumpToMatchSheet && this.getters.getActiveSheetId() !== selectedMatch.sheetId) {
36247
- this.preserveSelectedMatchIndex = true;
36248
36259
  this.model.dispatch("ACTIVATE_SHEET", {
36249
36260
  sheetIdFrom: this.getters.getActiveSheetId(),
36250
36261
  sheetIdTo: selectedMatch.sheetId
36251
36262
  });
36252
- this.preserveSelectedMatchIndex = false;
36253
36263
  this.isSearchDirty = false;
36254
36264
  }
36255
36265
  this.model.selection.getBackToDefault();
@@ -36260,7 +36270,6 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
36260
36270
  */
36261
36271
  replace() {
36262
36272
  if (this.selectedMatchIndex === null) return;
36263
- this.preserveSelectedMatchIndex = true;
36264
36273
  this.shouldFinalizeUpdateSelection = true;
36265
36274
  this.model.dispatch("REPLACE_SEARCH", {
36266
36275
  searchString: this.toSearch,
@@ -36268,7 +36277,6 @@ var FindAndReplaceStore = class extends SpreadsheetStore {
36268
36277
  matches: [this.searchMatches[this.selectedMatchIndex]],
36269
36278
  searchOptions: this.searchOptions
36270
36279
  });
36271
- this.preserveSelectedMatchIndex = false;
36272
36280
  }
36273
36281
  /**
36274
36282
  * Apply the replace function to all the matches one time.
@@ -41204,7 +41212,7 @@ var TableStylePreview = class extends _odoo_owl.Component {
41204
41212
  mode: "pivot",
41205
41213
  numberOfCols: 5,
41206
41214
  numberOfRows: 8,
41207
- mainSubHeaderRows: new Set([props.tableConfig.numberOfHeaders, props.tableConfig.numberOfHeaders + 3])
41215
+ mainSubHeaderRows: /* @__PURE__ */ new Set([props.tableConfig.numberOfHeaders, props.tableConfig.numberOfHeaders + 3])
41208
41216
  };
41209
41217
  drawPreviewTable(ctx, getComputedTableStyle(props.tableConfig, props.tableStyle, tableMetaData), {
41210
41218
  ...tableMetaData,
@@ -44530,9 +44538,12 @@ var CellComposerStore = class extends AbstractComposerStore {
44530
44538
  }
44531
44539
  stopEdition(direction) {
44532
44540
  if (this.canStopEdition()) {
44541
+ const { col, row } = this.currentEditedCell;
44533
44542
  this._stopEdition();
44534
- if (direction) if (this.getters.isSingleCellOrMerge(this.sheetId, this.getters.getSelectedZone())) this.model.selection.moveAnchorCell(direction, 1);
44535
- else moveAnchorWithinSelection(this.getters, this.model.selection, direction);
44543
+ if (direction) if (this.getters.isSingleCellOrMerge(this.sheetId, this.getters.getSelectedZone())) {
44544
+ this.model.selection.selectCell(col, row);
44545
+ this.model.selection.moveAnchorCell(direction, 1);
44546
+ } else moveAnchorWithinSelection(this.getters, this.model.selection, direction);
44536
44547
  return;
44537
44548
  }
44538
44549
  const editedCell = this.currentEditedCell;
@@ -48542,7 +48553,7 @@ var Grid = class extends _odoo_owl.Component {
48542
48553
  ev.preventDefault();
48543
48554
  const clipboardData = ev.clipboardData;
48544
48555
  if (!clipboardData) return;
48545
- const image = [...clipboardData.files]?.find((file) => AllowedImageMimeTypes.includes(file.type));
48556
+ const image = [...clipboardData.files].find((file) => AllowedImageMimeTypes.includes(file.type));
48546
48557
  const osClipboard = { content: {
48547
48558
  ["text/plain"]: clipboardData?.getData("text/plain"),
48548
48559
  ["text/html"]: clipboardData?.getData("text/html")
@@ -54608,7 +54619,7 @@ function compareIntervals(a, b) {
54608
54619
  //#region src/plugins/ui_core_views/cell_evaluation/zone_set.ts
54609
54620
  var ZoneSet = class ZoneSet {
54610
54621
  profilesStartingPosition = [0];
54611
- profiles = new Map([[0, []]]);
54622
+ profiles = /* @__PURE__ */ new Map([[0, []]]);
54612
54623
  constructor(zones = []) {
54613
54624
  for (const zone of zones) this.add(zone);
54614
54625
  }
@@ -56220,7 +56231,7 @@ iconsOnCellRegistry.add("pivot_collapse", (getters, position) => {
56220
56231
  if (!(definition.style?.tabularForm ?? DEFAULT_PIVOT_STYLE.tabularForm) && pivotCell.type === "HEADER" && pivotId && pivotCell.domain.length) {
56221
56232
  const isDashboard = getters.isDashboard();
56222
56233
  const fields = pivotCell.dimension === "COL" ? definition.columns : definition.rows;
56223
- const hasIcon = !isDashboard && pivotCell.domain.length !== fields.length;
56234
+ const hasIcon = !isDashboard && !getters.shouldShowFormulas() && pivotCell.domain.length !== fields.length;
56224
56235
  const isCollapsed = (definition.collapsedDomains?.[pivotCell.dimension] ?? []).some((domain) => deepEquals(domain, pivotCell.domain));
56225
56236
  const indent = pivotCell.dimension === "ROW" ? (pivotCell.domain.length - 1) * 15 : 0;
56226
56237
  return {
@@ -56409,12 +56420,22 @@ var CustomColorsPlugin = class extends CoreViewPlugin {
56409
56420
  handle(cmd) {
56410
56421
  switch (cmd.type) {
56411
56422
  case "START":
56412
- for (const sheetId of this.getters.getSheetIds()) for (const chartId of this.getters.getChartIds(sheetId)) this.tryToAddColors(this.getChartColors(chartId));
56423
+ for (const sheetId of this.getters.getSheetIds()) {
56424
+ for (const chartId of this.getters.getChartIds(sheetId)) this.tryToAddColors(this.getChartColors(chartId));
56425
+ for (const figureId of this.getters.getFigures(sheetId)) this.tryToAddColors(this.getCarouselColors(sheetId, figureId.id));
56426
+ }
56413
56427
  break;
56414
56428
  case "UPDATE_CHART":
56415
56429
  case "CREATE_CHART":
56416
56430
  this.tryToAddColors(this.getChartColors(cmd.chartId));
56417
56431
  break;
56432
+ case "CREATE_CAROUSEL":
56433
+ case "UPDATE_CAROUSEL":
56434
+ this.tryToAddColors(this.getCarouselColors(cmd.sheetId, cmd.figureId));
56435
+ break;
56436
+ case "COLOR_SHEET":
56437
+ if (cmd.color) this.tryToAddColors([cmd.color]);
56438
+ break;
56418
56439
  case "UPDATE_CELL":
56419
56440
  case "ADD_CONDITIONAL_FORMAT":
56420
56441
  case "SET_BORDER":
@@ -56437,8 +56458,12 @@ var CustomColorsPlugin = class extends CoreViewPlugin {
56437
56458
  }
56438
56459
  computeCustomColors() {
56439
56460
  let usedColors = [];
56440
- for (const sheetId of this.getters.getSheetIds()) usedColors = usedColors.concat(this.getColorsFromCells(sheetId), this.getFormattingColors(sheetId), this.getTableColors(sheetId));
56441
- return [...new Set([...usedColors])];
56461
+ for (const sheetId of this.getters.getSheetIds()) usedColors = usedColors.concat(this.getSheetColors(sheetId), this.getColorsFromCells(sheetId), this.getFormattingColors(sheetId), this.getTableColors(sheetId));
56462
+ return [.../* @__PURE__ */ new Set([...usedColors])];
56463
+ }
56464
+ getSheetColors(sheetId) {
56465
+ const sheet = this.getters.getSheet(sheetId);
56466
+ return sheet.color ? [sheet.color] : [];
56442
56467
  }
56443
56468
  getColorsFromCells(sheetId) {
56444
56469
  const cells = Object.values(this.getters.getCells(sheetId));
@@ -56471,6 +56496,11 @@ var CustomColorsPlugin = class extends CoreViewPlugin {
56471
56496
  if (chart === void 0) return [];
56472
56497
  return [...JSON.stringify(chart.getRangeDefinition()).matchAll(chartColorRegex)].map((color) => color[1]);
56473
56498
  }
56499
+ getCarouselColors(sheetId, figureId) {
56500
+ if (this.getters.getFigure(sheetId, figureId)?.tag !== "carousel") return [];
56501
+ const titleColor = this.getters.getCarousel(figureId).title?.color;
56502
+ return titleColor ? [titleColor] : [];
56503
+ }
56474
56504
  getTableColors(sheetId) {
56475
56505
  return this.getters.getTables(sheetId).flatMap((table) => {
56476
56506
  const config = table.config;
@@ -59974,7 +60004,7 @@ var TableComputedStylePlugin = class extends UIPlugin {
59974
60004
  };
59975
60005
  }
59976
60006
  };
59977
- const invalidateTableStyleCommandsSet = new Set([
60007
+ const invalidateTableStyleCommandsSet = /* @__PURE__ */ new Set([
59978
60008
  "HIDE_COLUMNS_ROWS",
59979
60009
  "UNHIDE_COLUMNS_ROWS",
59980
60010
  "UNFOLD_HEADER_GROUP",
@@ -64544,14 +64574,14 @@ var InternalViewport = class {
64544
64574
  adjustPositionX(targetCol) {
64545
64575
  const sheetId = this.sheetId;
64546
64576
  const { start, end } = this.getters.getColDimensions(sheetId, targetCol);
64547
- if (this.offsetX + this.viewportWidth + this.offsetCorrectionX < end) this.offsetX = end - this.viewportWidth;
64577
+ if (this.offsetX + this.viewportWidth + this.offsetCorrectionX < end) this.offsetX = end - this.viewportWidth - this.offsetCorrectionX;
64548
64578
  else if (this.offsetX + this.offsetCorrectionX > start) this.offsetX = start - this.offsetCorrectionX;
64549
64579
  this.adjustViewportZoneX();
64550
64580
  }
64551
64581
  adjustPositionY(targetRow) {
64552
64582
  const sheetId = this.sheetId;
64553
64583
  const { start, end } = this.getters.getRowDimensions(sheetId, targetRow);
64554
- if (this.offsetY + this.viewportHeight + this.offsetCorrectionY < end) this.offsetY = end - this.viewportHeight;
64584
+ if (this.offsetY + this.viewportHeight + this.offsetCorrectionY < end) this.offsetY = end - this.viewportHeight - this.offsetCorrectionY;
64555
64585
  else if (this.offsetY + this.offsetCorrectionY > start) this.offsetY = start - this.offsetCorrectionY;
64556
64586
  this.adjustViewportZoneY();
64557
64587
  }
@@ -67501,7 +67531,7 @@ var BottomBarSheet = class extends _odoo_owl.Component {
67501
67531
  }
67502
67532
  });
67503
67533
  this.DOMFocusableElementStore = useStore(DOMFocusableElementStore);
67504
- (0, _odoo_owl.useExternalListener)(window, "click", () => this.state.pickerOpened = false);
67534
+ (0, _odoo_owl.useExternalListener)(window, "click", this.onExternalClick.bind(this), { capture: true });
67505
67535
  (0, _odoo_owl.useEffect)((sheetId) => {
67506
67536
  if (this.props.sheetId === sheetId) this.scrollToSheet();
67507
67537
  }, () => [this.env.model.getters.getActiveSheetId()]);
@@ -67520,6 +67550,9 @@ var BottomBarSheet = class extends _odoo_owl.Component {
67520
67550
  this.env.model.off("command-rejected", this);
67521
67551
  });
67522
67552
  }
67553
+ onExternalClick(ev) {
67554
+ if (!ev.target.closest(".o-color-picker")) this.state.pickerOpened = false;
67555
+ }
67523
67556
  focusInputAndSelectContent() {
67524
67557
  if (!this.state.isEditing || !this.sheetNameRef.el) return;
67525
67558
  this.sheetNameRef.el.focus();
@@ -67623,6 +67656,8 @@ var BottomBarSheet = class extends _odoo_owl.Component {
67623
67656
  },
67624
67657
  openSheetColorPickerCallback: () => {
67625
67658
  this.state.pickerOpened = true;
67659
+ const sheet = this.env.model.getters.getSheet(this.props.sheetId);
67660
+ this.state.currentPickerColor = sheet.color;
67626
67661
  }
67627
67662
  });
67628
67663
  }
@@ -69658,7 +69693,7 @@ var TableDropdownButton = class extends _odoo_owl.Component {
69658
69693
  this.closePopover();
69659
69694
  return;
69660
69695
  }
69661
- const pivotId = this.pivotIdInSelection;
69696
+ const pivotId = this.dynamicPivotIdInSelection;
69662
69697
  if (pivotId) {
69663
69698
  this.env.openSidePanel("PivotSidePanel", {
69664
69699
  pivotId,
@@ -69688,7 +69723,7 @@ var TableDropdownButton = class extends _odoo_owl.Component {
69688
69723
  this.state.popoverProps = void 0;
69689
69724
  }
69690
69725
  get action() {
69691
- if (this.pivotIdInSelection) return {
69726
+ if (this.dynamicPivotIdInSelection) return {
69692
69727
  name: _t("Edit pivot style"),
69693
69728
  icon: "o-spreadsheet-Icon.EDIT_TABLE"
69694
69729
  };
@@ -69707,15 +69742,19 @@ var TableDropdownButton = class extends _odoo_owl.Component {
69707
69742
  get tableStyles() {
69708
69743
  return this.env.model.getters.getTableStyles();
69709
69744
  }
69710
- get pivotIdInSelection() {
69745
+ get dynamicPivotIdInSelection() {
69711
69746
  const selection = this.env.model.getters.getSelectedZones();
69712
- for (const zone of selection) for (const position of positions(zone)) {
69713
- const sheetId = this.env.model.getters.getActiveSheetId();
69714
- const pivotId = this.env.model.getters.getPivotIdFromPosition({
69715
- sheetId,
69716
- ...position
69717
- });
69718
- if (pivotId) return pivotId;
69747
+ const pivotCellIds = new Set(this.env.model.getters.getCellsWithTrackedFormula("PIVOT"));
69748
+ if (pivotCellIds.size === 0) return;
69749
+ const activeSheetId = this.env.model.getters.getActiveSheetId();
69750
+ for (const zone of selection) for (const position of cellPositions(activeSheetId, zone)) {
69751
+ const mainPosition = this.env.model.getters.getArrayFormulaSpreadingOn(position);
69752
+ if (!mainPosition) continue;
69753
+ const cellId = this.env.model.getters.getCell(mainPosition)?.id;
69754
+ if (cellId && pivotCellIds.has(cellId)) {
69755
+ const pivotId = this.env.model.getters.getPivotIdFromPosition(mainPosition);
69756
+ if (pivotId) return pivotId;
69757
+ }
69719
69758
  }
69720
69759
  }
69721
69760
  get class() {
@@ -72647,11 +72686,11 @@ function addBarChart(chart) {
72647
72686
  <!-- each data marker in the series does not have a different color -->
72648
72687
  <c:varyColors val="0"/>
72649
72688
  ${joinXmlNodes(rightDataSetsNodes)}
72650
- <c:axId val="${catAxId + 1}" />
72651
- <c:axId val="${valAxId + 1}" />
72689
+ <c:axId val="${17781238}" />
72690
+ <c:axId val="${88853994}" />
72652
72691
  </c:barChart>
72653
- ${addAx("b", "c:catAx", catAxId + 1, valAxId + 1, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
72654
- ${addAx("r", "c:valAx", valAxId + 1, catAxId + 1, chart.axesDesign?.y1?.title, chart.fontColor)}
72692
+ ${addAx("b", "c:catAx", 17781238, 88853994, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
72693
+ ${addAx("r", "c:valAx", 88853994, 17781238, chart.axesDesign?.y1?.title, chart.fontColor)}
72655
72694
  ` : ""}`;
72656
72695
  }
72657
72696
  function addComboChart(chart) {
@@ -72903,11 +72942,11 @@ function addLineChart(chart) {
72903
72942
  <c:varyColors val="0"/>
72904
72943
  ${joinXmlNodes(rightDataSetsNodes)}
72905
72944
  ${insertDataLabels({ showValues: chart.showValues })}
72906
- <c:axId val="${catAxId + 1}" />
72907
- <c:axId val="${valAxId + 1}" />
72945
+ <c:axId val="${17781238}" />
72946
+ <c:axId val="${88853994}" />
72908
72947
  </c:lineChart>
72909
- ${addAx("b", "c:catAx", catAxId + 1, valAxId + 1, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
72910
- ${addAx("r", "c:valAx", valAxId + 1, catAxId + 1, chart.axesDesign?.y1?.title, chart.fontColor)}
72948
+ ${addAx("b", "c:catAx", 17781238, 88853994, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
72949
+ ${addAx("r", "c:valAx", 88853994, 17781238, chart.axesDesign?.y1?.title, chart.fontColor)}
72911
72950
  ` : ""}
72912
72951
  `;
72913
72952
  }
@@ -72973,11 +73012,11 @@ function addScatterChart(chart) {
72973
73012
  <c:scatterStyle val="lineMarker"/>
72974
73013
  ${joinXmlNodes(rightDataSetsNodes)}
72975
73014
  ${insertDataLabels({ showValues: chart.showValues })}
72976
- <c:axId val="${catAxId + 1}" />
72977
- <c:axId val="${valAxId + 1}" />
73015
+ <c:axId val="${17781238}" />
73016
+ <c:axId val="${88853994}" />
72978
73017
  </c:scatterChart>
72979
- ${addAx("b", "c:valAx", catAxId + 1, valAxId + 1, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
72980
- ${addAx("r", "c:valAx", valAxId + 1, catAxId + 1, chart.axesDesign?.y1?.title, chart.fontColor)}
73018
+ ${addAx("b", "c:valAx", 17781238, 88853994, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
73019
+ ${addAx("r", "c:valAx", 88853994, 17781238, chart.axesDesign?.y1?.title, chart.fontColor)}
72981
73020
  ` : ""}`;
72982
73021
  }
72983
73022
  function addRadarChart(chart) {
@@ -84713,6 +84752,6 @@ exports.stores = stores;
84713
84752
  exports.tokenColors = tokenColors;
84714
84753
  exports.tokenize = tokenize;
84715
84754
 
84716
- __info__.version = "19.3.6";
84717
- __info__.date = "2026-06-06T06:24:22.727Z";
84718
- __info__.hash = "0fe939b";
84755
+ __info__.version = "19.3.10";
84756
+ __info__.date = "2026-07-01T05:04:42.999Z";
84757
+ __info__.hash = "040ae04";