@odoo/o-spreadsheet 19.3.7 → 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.7
6
- * @date 2026-06-17T08:57:42.174Z
7
- * @hash e061163
5
+ * @version 19.3.10
6
+ * @date 2026-07-01T05:04:42.999Z
7
+ * @hash 040ae04
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -236,7 +236,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
236
236
  const GRAY_300 = "#D8DADD";
237
237
  const GRAY_200 = "#E7E9ED";
238
238
  const TEXT_BODY = "#374151";
239
- const TEXT_BODY_MUTED = TEXT_BODY + "C2";
239
+ const TEXT_BODY_MUTED = "#374151C2";
240
240
  const ACTION_COLOR = HIGHLIGHT_COLOR;
241
241
  const CHART_TITLE_FONT_SIZE = 16;
242
242
  const DEFAULT_CHART_COLOR_SCALE = {
@@ -329,9 +329,6 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
329
329
  ];
330
330
  const DEFAULT_CELL_HEIGHT = 23;
331
331
  const FOOTER_HEIGHT = 2 * 23;
332
- const MENU_SEPARATOR_BORDER_WIDTH = 1;
333
- const MENU_SEPARATOR_PADDING = 5;
334
- const MENU_SEPARATOR_HEIGHT = 1 + 2 * 5;
335
332
  const ZOOM_VALUES = [
336
333
  50,
337
334
  75,
@@ -362,7 +359,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
362
359
  const DEFAULT_VERTICAL_ALIGN = DEFAULT_STYLE.verticalAlign;
363
360
  const DEFAULT_WRAPPING_MODE = DEFAULT_STYLE.wrapping;
364
361
  const DEFAULT_FONT_SIZE = DEFAULT_STYLE.fontSize;
365
- const DEFAULT_FONT = "'Roboto', arial";
362
+ const DEFAULT_FONT = "'Roboto', arial, 'Liberation Sans'";
366
363
  const DEFAULT_BORDER_DESC = {
367
364
  style: "thin",
368
365
  color: "#000000"
@@ -1234,7 +1231,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1234
1231
  function recomputeZones(zones, zonesToRemove = []) {
1235
1232
  if (zones.length <= 1 && zonesToRemove.length === 0) return zones;
1236
1233
  const profilesStartingPosition = [0];
1237
- const profiles = new Map([[0, []]]);
1234
+ const profiles = /* @__PURE__ */ new Map([[0, []]]);
1238
1235
  modifyProfiles(profilesStartingPosition, profiles, zones, false);
1239
1236
  modifyProfiles(profilesStartingPosition, profiles, zonesToRemove, true);
1240
1237
  return constructZonesFromProfiles(profilesStartingPosition, profiles);
@@ -3946,12 +3943,10 @@ stores.inject(MyMetaStore, storeInstance);
3946
3943
  const pIntegerAndDecimals = `(?:\\d+(?:${escapeRegExp(locale.thousandsSeparator || "")}\\d{3,})*(?:${decimalSeparator}\\d*)?)`;
3947
3944
  const pOnlyDecimals = `(?:${decimalSeparator}\\d+)`;
3948
3945
  const pNumber = "(?:\\s*" + pIntegerAndDecimals + "|" + pOnlyDecimals + ")(?:(e|E)(?:\\+|-)?(?:[0-9]|[0-9][0-9]|[12][0-9]{2}|30[0-7]))?(?:\\s*%)?";
3949
- const pMinus = "(?:\\s*-)?";
3950
- const pCurrencyFormat = "(?:\\s*[\\$€])?";
3951
3946
  const pNumberExp = "^(?:(?:" + [
3952
- pMinus + pCurrencyFormat + pNumber,
3953
- pMinus + pNumber + pCurrencyFormat,
3954
- pCurrencyFormat + pMinus + pNumber
3947
+ "(?:\\s*-)?(?:\\s*[\\$€])?" + pNumber,
3948
+ "(?:\\s*-)?" + pNumber + "(?:\\s*[\\$€])?",
3949
+ "(?:\\s*[\\$€])?(?:\\s*-)?" + pNumber
3955
3950
  ].join(")|(?:") + "))$";
3956
3951
  return new RegExp(pNumberExp, "i");
3957
3952
  });
@@ -7553,7 +7548,7 @@ stores.inject(MyMetaStore, storeInstance);
7553
7548
  function isZoneDependent(cmd) {
7554
7549
  return "sheetId" in cmd && "zone" in cmd;
7555
7550
  }
7556
- const invalidateEvaluationCommands = new Set([
7551
+ const invalidateEvaluationCommands = /* @__PURE__ */ new Set([
7557
7552
  "RENAME_SHEET",
7558
7553
  "DELETE_SHEET",
7559
7554
  "CREATE_SHEET",
@@ -7575,7 +7570,7 @@ stores.inject(MyMetaStore, storeInstance);
7575
7570
  "UPDATE_NAMED_RANGE",
7576
7571
  "DELETE_NAMED_RANGE"
7577
7572
  ]);
7578
- const invalidateChartEvaluationCommands = new Set([
7573
+ const invalidateChartEvaluationCommands = /* @__PURE__ */ new Set([
7579
7574
  "EVALUATE_CELLS",
7580
7575
  "EVALUATE_CHARTS",
7581
7576
  "UPDATE_CELL",
@@ -7594,20 +7589,20 @@ stores.inject(MyMetaStore, storeInstance);
7594
7589
  "UNDO",
7595
7590
  "REDO"
7596
7591
  ]);
7597
- const invalidateDependenciesCommands = new Set(["MOVE_RANGES"]);
7598
- const invalidateCFEvaluationCommands = new Set([
7592
+ const invalidateDependenciesCommands = /* @__PURE__ */ new Set(["MOVE_RANGES"]);
7593
+ const invalidateCFEvaluationCommands = /* @__PURE__ */ new Set([
7599
7594
  "EVALUATE_CELLS",
7600
7595
  "ADD_CONDITIONAL_FORMAT",
7601
7596
  "REMOVE_CONDITIONAL_FORMAT",
7602
7597
  "CHANGE_CONDITIONAL_FORMAT_PRIORITY"
7603
7598
  ]);
7604
- const invalidateBordersCommands = new Set([
7599
+ const invalidateBordersCommands = /* @__PURE__ */ new Set([
7605
7600
  "AUTOFILL_CELL",
7606
7601
  "SET_BORDER",
7607
7602
  "SET_ZONE_BORDERS",
7608
7603
  "SET_BORDERS_ON_TARGET"
7609
7604
  ]);
7610
- const invalidSubtotalFormulasCommands = new Set([
7605
+ const invalidSubtotalFormulasCommands = /* @__PURE__ */ new Set([
7611
7606
  "UNHIDE_COLUMNS_ROWS",
7612
7607
  "HIDE_COLUMNS_ROWS",
7613
7608
  "GROUP_HEADERS",
@@ -7621,7 +7616,7 @@ stores.inject(MyMetaStore, storeInstance);
7621
7616
  "UPDATE_TABLE",
7622
7617
  "UPDATE_FILTER"
7623
7618
  ]);
7624
- const readonlyAllowedCommands = new Set([
7619
+ const readonlyAllowedCommands = /* @__PURE__ */ new Set([
7625
7620
  "START",
7626
7621
  "ACTIVATE_SHEET",
7627
7622
  "COPY",
@@ -7637,7 +7632,7 @@ stores.inject(MyMetaStore, storeInstance);
7637
7632
  "UPDATE_CAROUSEL_ACTIVE_ITEM",
7638
7633
  "UPDATE_PIVOT"
7639
7634
  ]);
7640
- const lockedSheetAllowedCommands = new Set([
7635
+ const lockedSheetAllowedCommands = /* @__PURE__ */ new Set([
7641
7636
  "LOCK_SHEET",
7642
7637
  "UNLOCK_SHEET",
7643
7638
  "MOVE_SHEET",
@@ -7668,7 +7663,7 @@ stores.inject(MyMetaStore, storeInstance);
7668
7663
  "SHIFT_VIEWPORT_DOWN",
7669
7664
  "SHIFT_VIEWPORT_UP"
7670
7665
  ]);
7671
- const coreTypes = new Set([
7666
+ const coreTypes = /* @__PURE__ */ new Set([
7672
7667
  "UPDATE_CELL",
7673
7668
  "UPDATE_CELL_POSITION",
7674
7669
  "CLEAR_CELL",
@@ -8302,7 +8297,6 @@ stores.inject(MyMetaStore, storeInstance);
8302
8297
  //#region src/helpers/edge_scrolling.ts
8303
8298
  const MAX_DELAY = 140;
8304
8299
  const MIN_DELAY = 20;
8305
- const ACCELERATION = .035;
8306
8300
  /**
8307
8301
  * Decreasing exponential function used to determine the "speed" of edge-scrolling
8308
8302
  * as the timeout delay.
@@ -8310,7 +8304,7 @@ stores.inject(MyMetaStore, storeInstance);
8310
8304
  * Returns a timeout delay in milliseconds.
8311
8305
  */
8312
8306
  function scrollDelay(value) {
8313
- return 20 + (140 - 20) * Math.exp(-ACCELERATION * (value - 1));
8307
+ return 20 + (140 - 20) * Math.exp(-.035 * (value - 1));
8314
8308
  }
8315
8309
 
8316
8310
  //#endregion
@@ -8713,7 +8707,7 @@ stores.inject(MyMetaStore, storeInstance);
8713
8707
  const cryptoObj = this.getCrypto();
8714
8708
  if (cryptoObj) return "10000000-1000".replace(/[01]/g, (c) => {
8715
8709
  const n = Number(c);
8716
- return (n ^ cryptoObj.getRandomValues(new Uint8Array(1))[0] & 15 >> n / 4).toString(16);
8710
+ return (n ^ cryptoObj.getRandomValues(/* @__PURE__ */ new Uint8Array(1))[0] & 15 >> n / 4).toString(16);
8717
8711
  });
8718
8712
  else return "xxxxxxxx-xxxx".replace(/[xy]/g, function(c) {
8719
8713
  const r = Math.random() * 16 | 0;
@@ -8728,7 +8722,7 @@ stores.inject(MyMetaStore, storeInstance);
8728
8722
  const cryptoObj = this.getCrypto();
8729
8723
  if (cryptoObj) return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => {
8730
8724
  const n = Number(c);
8731
- return (n ^ cryptoObj.getRandomValues(new Uint8Array(1))[0] & 15 >> n / 4).toString(16);
8725
+ return (n ^ cryptoObj.getRandomValues(/* @__PURE__ */ new Uint8Array(1))[0] & 15 >> n / 4).toString(16);
8732
8726
  });
8733
8727
  else return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
8734
8728
  const r = Math.random() * 16 | 0;
@@ -12750,7 +12744,7 @@ stores.inject(MyMetaStore, storeInstance);
12750
12744
 
12751
12745
  //#endregion
12752
12746
  //#region src/types/data_validation.ts
12753
- const availableDataValidationOperators = new Set([
12747
+ const availableDataValidationOperators = /* @__PURE__ */ new Set([
12754
12748
  "containsText",
12755
12749
  "notContainsText",
12756
12750
  "isEqualText",
@@ -13344,10 +13338,10 @@ stores.inject(MyMetaStore, storeInstance);
13344
13338
  type: dimension.type
13345
13339
  }));
13346
13340
  if (groupValueString.toLowerCase() === "false") return false;
13347
- return pivotNormalizationValueRegistry.get(dimension.type)(groupValueString, dimension.granularity);
13341
+ return pivotNormalizationValueRegistry.get(dimension.type)(groupValueString, dimension);
13348
13342
  }
13349
- function normalizeDateTime(value, granularity) {
13350
- return pivotTimeAdapter(granularity ?? "month").normalizeFunctionValue(value);
13343
+ function normalizeDateTime(value, dimension) {
13344
+ return pivotTimeAdapter(dimension.granularity ?? "month").normalizeFunctionValue(value);
13351
13345
  }
13352
13346
  function toFunctionPivotValue(value, dimension) {
13353
13347
  if (value === null) return `"null"`;
@@ -15946,6 +15940,59 @@ stores.inject(MyMetaStore, storeInstance);
15946
15940
  return (chartSubtypeRegistry.getAll().find((c) => c.matcher?.(definition)) || chartSubtypeRegistry.get(definition.type)).displayName;
15947
15941
  }
15948
15942
 
15943
+ //#endregion
15944
+ //#region src/components/helpers/css.ts
15945
+ function getTextDecoration({ strikethrough, underline }) {
15946
+ if (!strikethrough && !underline) return "none";
15947
+ return `${strikethrough ? "line-through" : ""} ${underline ? "underline" : ""}`;
15948
+ }
15949
+ /**
15950
+ * Convert the cell style to CSS properties.
15951
+ */
15952
+ function cellStyleToCss(style) {
15953
+ const attributes = cellTextStyleToCss(style);
15954
+ if (!style) return attributes;
15955
+ if (style.fillColor) attributes["background"] = style.fillColor;
15956
+ return attributes;
15957
+ }
15958
+ /**
15959
+ * Convert the cell text style to CSS properties.
15960
+ */
15961
+ function cellTextStyleToCss(style) {
15962
+ const attributes = {};
15963
+ if (!style) return attributes;
15964
+ if (style.bold) attributes["font-weight"] = "bold";
15965
+ if (style.italic) attributes["font-style"] = "italic";
15966
+ if (style.fontSize) attributes["font-size"] = `${style.fontSize}px`;
15967
+ if (style.strikethrough || style.underline) {
15968
+ let decoration = style.strikethrough ? "line-through" : "";
15969
+ decoration = style.underline ? decoration + " underline" : decoration;
15970
+ attributes["text-decoration"] = decoration;
15971
+ }
15972
+ if (style.textColor) attributes["color"] = style.textColor;
15973
+ return attributes;
15974
+ }
15975
+ /**
15976
+ * Transform CSS properties into a CSS string.
15977
+ */
15978
+ function cssPropertiesToCss(attributes) {
15979
+ let styleStr = "";
15980
+ for (const attName in attributes) {
15981
+ if (!attributes[attName]) continue;
15982
+ styleStr += `${attName}:${attributes[attName]}; `;
15983
+ }
15984
+ return styleStr;
15985
+ }
15986
+ function getElementMargins(el) {
15987
+ const style = window.getComputedStyle(el);
15988
+ return {
15989
+ top: parseInt(style.marginTop, 10) || 0,
15990
+ bottom: parseInt(style.marginBottom, 10) || 0,
15991
+ left: parseInt(style.marginLeft, 10) || 0,
15992
+ right: parseInt(style.marginRight, 10) || 0
15993
+ };
15994
+ }
15995
+
15949
15996
  //#endregion
15950
15997
  //#region src/components/figures/chart/chartJs/zoomable_chart/zoomable_chart_store.ts
15951
15998
  const TREND_LINE_AXES_IDS = ["x1", MOVING_AVERAGE_TREND_LINE_XAXIS_ID];
@@ -16064,9 +16111,7 @@ stores.inject(MyMetaStore, storeInstance);
16064
16111
  this.removeEventListeners();
16065
16112
  }
16066
16113
  get containerStyle() {
16067
- return `
16068
- height:${this.sliceable ? `calc(100% - ${60}px)` : "100%"};
16069
- `;
16114
+ return cssPropertiesToCss({ height: this.sliceable ? `calc(100% - ${60}px)` : "100%" });
16070
16115
  }
16071
16116
  get masterChartContainerStyle() {
16072
16117
  const runtime = this.env.model.getters.getChartRuntime(this.props.chartId);
@@ -16930,59 +16975,6 @@ stores.inject(MyMetaStore, storeInstance);
16930
16975
  }
16931
16976
  };
16932
16977
 
16933
- //#endregion
16934
- //#region src/components/helpers/css.ts
16935
- function getTextDecoration({ strikethrough, underline }) {
16936
- if (!strikethrough && !underline) return "none";
16937
- return `${strikethrough ? "line-through" : ""} ${underline ? "underline" : ""}`;
16938
- }
16939
- /**
16940
- * Convert the cell style to CSS properties.
16941
- */
16942
- function cellStyleToCss(style) {
16943
- const attributes = cellTextStyleToCss(style);
16944
- if (!style) return attributes;
16945
- if (style.fillColor) attributes["background"] = style.fillColor;
16946
- return attributes;
16947
- }
16948
- /**
16949
- * Convert the cell text style to CSS properties.
16950
- */
16951
- function cellTextStyleToCss(style) {
16952
- const attributes = {};
16953
- if (!style) return attributes;
16954
- if (style.bold) attributes["font-weight"] = "bold";
16955
- if (style.italic) attributes["font-style"] = "italic";
16956
- if (style.fontSize) attributes["font-size"] = `${style.fontSize}px`;
16957
- if (style.strikethrough || style.underline) {
16958
- let decoration = style.strikethrough ? "line-through" : "";
16959
- decoration = style.underline ? decoration + " underline" : decoration;
16960
- attributes["text-decoration"] = decoration;
16961
- }
16962
- if (style.textColor) attributes["color"] = style.textColor;
16963
- return attributes;
16964
- }
16965
- /**
16966
- * Transform CSS properties into a CSS string.
16967
- */
16968
- function cssPropertiesToCss(attributes) {
16969
- let styleStr = "";
16970
- for (const attName in attributes) {
16971
- if (!attributes[attName]) continue;
16972
- styleStr += `${attName}:${attributes[attName]}; `;
16973
- }
16974
- return styleStr;
16975
- }
16976
- function getElementMargins(el) {
16977
- const style = window.getComputedStyle(el);
16978
- return {
16979
- top: parseInt(style.marginTop, 10) || 0,
16980
- bottom: parseInt(style.marginBottom, 10) || 0,
16981
- left: parseInt(style.marginLeft, 10) || 0,
16982
- right: parseInt(style.marginRight, 10) || 0
16983
- };
16984
- }
16985
-
16986
16978
  //#endregion
16987
16979
  //#region src/stores/DOM_focus_store.ts
16988
16980
  var DOMFocusableElementStore = class {
@@ -18230,11 +18222,11 @@ stores.inject(MyMetaStore, storeInstance);
18230
18222
  getResizerPosition(resizer) {
18231
18223
  const anchorCenteringOffset = (ANCHOR_SIZE - ACTIVE_BORDER_WIDTH) / 2;
18232
18224
  const style = {};
18233
- if (resizer.includes("top")) style.top = `${-anchorCenteringOffset}px`;
18234
- else if (resizer.includes("bottom")) style.bottom = `${-anchorCenteringOffset}px`;
18225
+ if (resizer.includes("top")) style.top = `-3px`;
18226
+ else if (resizer.includes("bottom")) style.bottom = `-3px`;
18235
18227
  else style.bottom = `calc(50% - ${anchorCenteringOffset}px)`;
18236
- if (resizer.includes("left")) style.left = `${-anchorCenteringOffset}px`;
18237
- else if (resizer.includes("right")) style.right = `${-anchorCenteringOffset}px`;
18228
+ if (resizer.includes("left")) style.left = `-3px`;
18229
+ else if (resizer.includes("right")) style.right = `-3px`;
18238
18230
  else style.right = `calc(50% - ${anchorCenteringOffset}px)`;
18239
18231
  return cssPropertiesToCss(style);
18240
18232
  }
@@ -25832,6 +25824,7 @@ stores.inject(MyMetaStore, storeInstance);
25832
25824
  function mapParentFunction(tokens) {
25833
25825
  const stack = [];
25834
25826
  let functionStarted = "";
25827
+ let braceDepth = 0;
25835
25828
  function pushTokenToFunctionContext(token) {
25836
25829
  if (stack.length === 0) return;
25837
25830
  const functionContext = stack.at(-1);
@@ -25844,7 +25837,7 @@ stores.inject(MyMetaStore, storeInstance);
25844
25837
  });
25845
25838
  }
25846
25839
  }
25847
- return tokens.map((token, i) => {
25840
+ return tokens.map((token) => {
25848
25841
  if (!["SPACE", "LEFT_PAREN"].includes(token.type)) functionStarted = "";
25849
25842
  switch (token.type) {
25850
25843
  case "SYMBOL":
@@ -25865,8 +25858,16 @@ stores.inject(MyMetaStore, storeInstance);
25865
25858
  stack.pop()?.argsTokens?.flat().forEach(pushTokenToFunctionContext);
25866
25859
  pushTokenToFunctionContext(token);
25867
25860
  break;
25861
+ case "LEFT_BRACE":
25862
+ braceDepth++;
25863
+ pushTokenToFunctionContext(token);
25864
+ break;
25865
+ case "RIGHT_BRACE":
25866
+ braceDepth--;
25867
+ pushTokenToFunctionContext(token);
25868
+ break;
25868
25869
  case "ARG_SEPARATOR":
25869
- if (stack.length) stack[stack.length - 1].argPosition++;
25870
+ if (stack.length && braceDepth === 0) stack[stack.length - 1].argPosition++;
25870
25871
  pushTokenToFunctionContext(token);
25871
25872
  break;
25872
25873
  default:
@@ -27218,10 +27219,7 @@ stores.inject(MyMetaStore, storeInstance);
27218
27219
  //#endregion
27219
27220
  //#region src/components/color_picker/color_picker.ts
27220
27221
  const ITEM_BORDER_WIDTH = 1;
27221
- const ITEM_EDGE_LENGTH = 18;
27222
- const ITEMS_PER_LINE = 10;
27223
- const MAGNIFIER_EDGE = 16;
27224
- const CONTENT_WIDTH = ITEMS_PER_LINE * (ITEM_EDGE_LENGTH + 2 * ITEM_BORDER_WIDTH) + (ITEMS_PER_LINE - 1) * 2;
27222
+ const CONTENT_WIDTH = 218;
27225
27223
  const INNER_GRADIENT_WIDTH = CONTENT_WIDTH - 2 * ITEM_BORDER_WIDTH;
27226
27224
  const INNER_GRADIENT_HEIGHT = CONTENT_WIDTH - 30 - 2 * ITEM_BORDER_WIDTH;
27227
27225
  var ColorPicker = class extends _odoo_owl.Component {
@@ -27285,8 +27283,8 @@ stores.inject(MyMetaStore, storeInstance);
27285
27283
  const left = Math.round(INNER_GRADIENT_WIDTH * clip(s / 100, 0, 1));
27286
27284
  const top = Math.round(INNER_GRADIENT_HEIGHT * clip(1 - 2 * l / (200 - s), 0, 1));
27287
27285
  return cssPropertiesToCss({
27288
- left: `${-MAGNIFIER_EDGE / 2 + left}px`,
27289
- top: `${-MAGNIFIER_EDGE / 2 + top}px`,
27286
+ left: `${-16 / 2 + left}px`,
27287
+ top: `${-16 / 2 + top}px`,
27290
27288
  background: hslaToHex(this.state.currentHslaColor)
27291
27289
  });
27292
27290
  }
@@ -32826,9 +32824,12 @@ stores.inject(MyMetaStore, storeInstance);
32826
32824
  labelValues: []
32827
32825
  })
32828
32826
  };
32829
- return this.chartTypeBuilder.getRuntime(getters, this.definition, dataExtractors, this.sheetId, { onClick: (event, items, chartJsChart) => {
32830
- return this.dataSourceBuilder.onDataSetClick?.(this.definition.type, chartId, event, items, chartJsChart, getters);
32831
- } });
32827
+ return this.chartTypeBuilder.getRuntime(getters, this.definition, dataExtractors, this.sheetId, {
32828
+ onClick: (event, items, chartJsChart) => {
32829
+ return this.dataSourceBuilder.onDataSetClick?.(this.definition.type, chartId, event, items, chartJsChart, getters);
32830
+ },
32831
+ onHover: (event, items, chartJsChart) => this.dataSourceBuilder.onDataSetHover?.(this.definition.type, chartId, event, items, chartJsChart)
32832
+ });
32832
32833
  }
32833
32834
  static deleteInvalidKeys(definition) {
32834
32835
  definition = { ...definition };
@@ -33035,7 +33036,7 @@ stores.inject(MyMetaStore, storeInstance);
33035
33036
  if (cell) label = cell.formattedValue;
33036
33037
  }
33037
33038
  let data = ds.dataRange ? getData(getters, ds) : [];
33038
- if (data.every((cell) => !cell.value || isTextResult(cell)) && data.filter(isTextResult).length > 1) data = data.map((cell) => cell.value && isErrorResult(cell) ? ONE : EMPTY);
33039
+ if (data.every((cell) => !cell.value || isTextResult(cell)) && data.filter(isTextResult).length > 1) data = data.map((cell) => cell.value && !isErrorResult(cell) ? ONE : EMPTY);
33039
33040
  else if (data.every((cell) => !isNumberResult(cell))) hidden = true;
33040
33041
  datasetValues.push({
33041
33042
  data,
@@ -36025,9 +36026,9 @@ stores.inject(MyMetaStore, storeInstance);
36025
36026
  allSheetsMatches = [];
36026
36027
  activeSheetMatches = [];
36027
36028
  specificRangeMatches = [];
36029
+ selectedMatchPosition = null;
36028
36030
  currentSearchRegex = null;
36029
36031
  initialShowFormulaState;
36030
- preserveSelectedMatchIndex = false;
36031
36032
  irreplaceableMatchCount = 0;
36032
36033
  isSearchDirty = false;
36033
36034
  shouldFinalizeUpdateSelection = false;
@@ -36149,7 +36150,10 @@ stores.inject(MyMetaStore, storeInstance);
36149
36150
  */
36150
36151
  _updateSearch(toSearch, searchOptions) {
36151
36152
  this.searchOptions = searchOptions;
36152
- if (toSearch !== this.toSearch) this.selectedMatchIndex = null;
36153
+ if (toSearch !== this.toSearch) {
36154
+ this.selectedMatchIndex = null;
36155
+ this.selectedMatchPosition = null;
36156
+ }
36153
36157
  this.toSearch = toSearch;
36154
36158
  this.currentSearchRegex = getSearchRegex(this.toSearch, this.searchOptions);
36155
36159
  this.refreshSearch({
@@ -36161,8 +36165,14 @@ stores.inject(MyMetaStore, storeInstance);
36161
36165
  * refresh the matches according to the current search options
36162
36166
  */
36163
36167
  refreshSearch(options) {
36164
- if (!this.preserveSelectedMatchIndex) this.selectedMatchIndex = null;
36165
36168
  this.findMatches();
36169
+ if (this.selectedMatchPosition) if (this.selectedMatchPosition.sheetId !== this.getters.getActiveSheetId()) {
36170
+ this.selectedMatchIndex = null;
36171
+ this.selectedMatchPosition = null;
36172
+ } else {
36173
+ const index = this.searchMatches.findIndex((match) => match.sheetId === this.selectedMatchPosition?.sheetId && match.col === this.selectedMatchPosition?.col && match.row === this.selectedMatchPosition?.row);
36174
+ if (index !== -1) this.selectedMatchIndex = index;
36175
+ }
36166
36176
  this.selectNextCell(0, options);
36167
36177
  }
36168
36178
  getSheetsInSearchOrder() {
@@ -36230,6 +36240,7 @@ stores.inject(MyMetaStore, storeInstance);
36230
36240
  const matches = this.searchMatches;
36231
36241
  if (!matches.length) {
36232
36242
  this.selectedMatchIndex = null;
36243
+ this.selectedMatchPosition = null;
36233
36244
  return;
36234
36245
  }
36235
36246
  let nextIndex;
@@ -36243,14 +36254,13 @@ stores.inject(MyMetaStore, storeInstance);
36243
36254
  } else nextIndex = this.selectedMatchIndex + indexChange;
36244
36255
  nextIndex = (nextIndex + matches.length) % matches.length;
36245
36256
  this.selectedMatchIndex = nextIndex;
36257
+ this.selectedMatchPosition = matches[this.selectedMatchIndex];
36246
36258
  const selectedMatch = matches[nextIndex];
36247
36259
  if (options.jumpToMatchSheet && this.getters.getActiveSheetId() !== selectedMatch.sheetId) {
36248
- this.preserveSelectedMatchIndex = true;
36249
36260
  this.model.dispatch("ACTIVATE_SHEET", {
36250
36261
  sheetIdFrom: this.getters.getActiveSheetId(),
36251
36262
  sheetIdTo: selectedMatch.sheetId
36252
36263
  });
36253
- this.preserveSelectedMatchIndex = false;
36254
36264
  this.isSearchDirty = false;
36255
36265
  }
36256
36266
  this.model.selection.getBackToDefault();
@@ -36261,7 +36271,6 @@ stores.inject(MyMetaStore, storeInstance);
36261
36271
  */
36262
36272
  replace() {
36263
36273
  if (this.selectedMatchIndex === null) return;
36264
- this.preserveSelectedMatchIndex = true;
36265
36274
  this.shouldFinalizeUpdateSelection = true;
36266
36275
  this.model.dispatch("REPLACE_SEARCH", {
36267
36276
  searchString: this.toSearch,
@@ -36269,7 +36278,6 @@ stores.inject(MyMetaStore, storeInstance);
36269
36278
  matches: [this.searchMatches[this.selectedMatchIndex]],
36270
36279
  searchOptions: this.searchOptions
36271
36280
  });
36272
- this.preserveSelectedMatchIndex = false;
36273
36281
  }
36274
36282
  /**
36275
36283
  * Apply the replace function to all the matches one time.
@@ -41205,7 +41213,7 @@ stores.inject(MyMetaStore, storeInstance);
41205
41213
  mode: "pivot",
41206
41214
  numberOfCols: 5,
41207
41215
  numberOfRows: 8,
41208
- mainSubHeaderRows: new Set([props.tableConfig.numberOfHeaders, props.tableConfig.numberOfHeaders + 3])
41216
+ mainSubHeaderRows: /* @__PURE__ */ new Set([props.tableConfig.numberOfHeaders, props.tableConfig.numberOfHeaders + 3])
41209
41217
  };
41210
41218
  drawPreviewTable(ctx, getComputedTableStyle(props.tableConfig, props.tableStyle, tableMetaData), {
41211
41219
  ...tableMetaData,
@@ -44531,9 +44539,12 @@ stores.inject(MyMetaStore, storeInstance);
44531
44539
  }
44532
44540
  stopEdition(direction) {
44533
44541
  if (this.canStopEdition()) {
44542
+ const { col, row } = this.currentEditedCell;
44534
44543
  this._stopEdition();
44535
- if (direction) if (this.getters.isSingleCellOrMerge(this.sheetId, this.getters.getSelectedZone())) this.model.selection.moveAnchorCell(direction, 1);
44536
- else moveAnchorWithinSelection(this.getters, this.model.selection, direction);
44544
+ if (direction) if (this.getters.isSingleCellOrMerge(this.sheetId, this.getters.getSelectedZone())) {
44545
+ this.model.selection.selectCell(col, row);
44546
+ this.model.selection.moveAnchorCell(direction, 1);
44547
+ } else moveAnchorWithinSelection(this.getters, this.model.selection, direction);
44537
44548
  return;
44538
44549
  }
44539
44550
  const editedCell = this.currentEditedCell;
@@ -48543,7 +48554,7 @@ stores.inject(MyMetaStore, storeInstance);
48543
48554
  ev.preventDefault();
48544
48555
  const clipboardData = ev.clipboardData;
48545
48556
  if (!clipboardData) return;
48546
- const image = [...clipboardData.files]?.find((file) => AllowedImageMimeTypes.includes(file.type));
48557
+ const image = [...clipboardData.files].find((file) => AllowedImageMimeTypes.includes(file.type));
48547
48558
  const osClipboard = { content: {
48548
48559
  ["text/plain"]: clipboardData?.getData("text/plain"),
48549
48560
  ["text/html"]: clipboardData?.getData("text/html")
@@ -54609,7 +54620,7 @@ stores.inject(MyMetaStore, storeInstance);
54609
54620
  //#region src/plugins/ui_core_views/cell_evaluation/zone_set.ts
54610
54621
  var ZoneSet = class ZoneSet {
54611
54622
  profilesStartingPosition = [0];
54612
- profiles = new Map([[0, []]]);
54623
+ profiles = /* @__PURE__ */ new Map([[0, []]]);
54613
54624
  constructor(zones = []) {
54614
54625
  for (const zone of zones) this.add(zone);
54615
54626
  }
@@ -56226,12 +56237,22 @@ stores.inject(MyMetaStore, storeInstance);
56226
56237
  handle(cmd) {
56227
56238
  switch (cmd.type) {
56228
56239
  case "START":
56229
- for (const sheetId of this.getters.getSheetIds()) for (const chartId of this.getters.getChartIds(sheetId)) this.tryToAddColors(this.getChartColors(chartId));
56240
+ for (const sheetId of this.getters.getSheetIds()) {
56241
+ for (const chartId of this.getters.getChartIds(sheetId)) this.tryToAddColors(this.getChartColors(chartId));
56242
+ for (const figureId of this.getters.getFigures(sheetId)) this.tryToAddColors(this.getCarouselColors(sheetId, figureId.id));
56243
+ }
56230
56244
  break;
56231
56245
  case "UPDATE_CHART":
56232
56246
  case "CREATE_CHART":
56233
56247
  this.tryToAddColors(this.getChartColors(cmd.chartId));
56234
56248
  break;
56249
+ case "CREATE_CAROUSEL":
56250
+ case "UPDATE_CAROUSEL":
56251
+ this.tryToAddColors(this.getCarouselColors(cmd.sheetId, cmd.figureId));
56252
+ break;
56253
+ case "COLOR_SHEET":
56254
+ if (cmd.color) this.tryToAddColors([cmd.color]);
56255
+ break;
56235
56256
  case "UPDATE_CELL":
56236
56257
  case "ADD_CONDITIONAL_FORMAT":
56237
56258
  case "SET_BORDER":
@@ -56254,8 +56275,12 @@ stores.inject(MyMetaStore, storeInstance);
56254
56275
  }
56255
56276
  computeCustomColors() {
56256
56277
  let usedColors = [];
56257
- for (const sheetId of this.getters.getSheetIds()) usedColors = usedColors.concat(this.getColorsFromCells(sheetId), this.getFormattingColors(sheetId), this.getTableColors(sheetId));
56258
- return [...new Set([...usedColors])];
56278
+ for (const sheetId of this.getters.getSheetIds()) usedColors = usedColors.concat(this.getSheetColors(sheetId), this.getColorsFromCells(sheetId), this.getFormattingColors(sheetId), this.getTableColors(sheetId));
56279
+ return [.../* @__PURE__ */ new Set([...usedColors])];
56280
+ }
56281
+ getSheetColors(sheetId) {
56282
+ const sheet = this.getters.getSheet(sheetId);
56283
+ return sheet.color ? [sheet.color] : [];
56259
56284
  }
56260
56285
  getColorsFromCells(sheetId) {
56261
56286
  const cells = Object.values(this.getters.getCells(sheetId));
@@ -56288,6 +56313,11 @@ stores.inject(MyMetaStore, storeInstance);
56288
56313
  if (chart === void 0) return [];
56289
56314
  return [...JSON.stringify(chart.getRangeDefinition()).matchAll(chartColorRegex)].map((color) => color[1]);
56290
56315
  }
56316
+ getCarouselColors(sheetId, figureId) {
56317
+ if (this.getters.getFigure(sheetId, figureId)?.tag !== "carousel") return [];
56318
+ const titleColor = this.getters.getCarousel(figureId).title?.color;
56319
+ return titleColor ? [titleColor] : [];
56320
+ }
56291
56321
  getTableColors(sheetId) {
56292
56322
  return this.getters.getTables(sheetId).flatMap((table) => {
56293
56323
  const config = table.config;
@@ -59791,7 +59821,7 @@ stores.inject(MyMetaStore, storeInstance);
59791
59821
  };
59792
59822
  }
59793
59823
  };
59794
- const invalidateTableStyleCommandsSet = new Set([
59824
+ const invalidateTableStyleCommandsSet = /* @__PURE__ */ new Set([
59795
59825
  "HIDE_COLUMNS_ROWS",
59796
59826
  "UNHIDE_COLUMNS_ROWS",
59797
59827
  "UNFOLD_HEADER_GROUP",
@@ -64361,14 +64391,14 @@ stores.inject(MyMetaStore, storeInstance);
64361
64391
  adjustPositionX(targetCol) {
64362
64392
  const sheetId = this.sheetId;
64363
64393
  const { start, end } = this.getters.getColDimensions(sheetId, targetCol);
64364
- if (this.offsetX + this.viewportWidth + this.offsetCorrectionX < end) this.offsetX = end - this.viewportWidth;
64394
+ if (this.offsetX + this.viewportWidth + this.offsetCorrectionX < end) this.offsetX = end - this.viewportWidth - this.offsetCorrectionX;
64365
64395
  else if (this.offsetX + this.offsetCorrectionX > start) this.offsetX = start - this.offsetCorrectionX;
64366
64396
  this.adjustViewportZoneX();
64367
64397
  }
64368
64398
  adjustPositionY(targetRow) {
64369
64399
  const sheetId = this.sheetId;
64370
64400
  const { start, end } = this.getters.getRowDimensions(sheetId, targetRow);
64371
- if (this.offsetY + this.viewportHeight + this.offsetCorrectionY < end) this.offsetY = end - this.viewportHeight;
64401
+ if (this.offsetY + this.viewportHeight + this.offsetCorrectionY < end) this.offsetY = end - this.viewportHeight - this.offsetCorrectionY;
64372
64402
  else if (this.offsetY + this.offsetCorrectionY > start) this.offsetY = start - this.offsetCorrectionY;
64373
64403
  this.adjustViewportZoneY();
64374
64404
  }
@@ -67318,7 +67348,7 @@ stores.inject(MyMetaStore, storeInstance);
67318
67348
  }
67319
67349
  });
67320
67350
  this.DOMFocusableElementStore = useStore(DOMFocusableElementStore);
67321
- (0, _odoo_owl.useExternalListener)(window, "click", () => this.state.pickerOpened = false);
67351
+ (0, _odoo_owl.useExternalListener)(window, "click", this.onExternalClick.bind(this), { capture: true });
67322
67352
  (0, _odoo_owl.useEffect)((sheetId) => {
67323
67353
  if (this.props.sheetId === sheetId) this.scrollToSheet();
67324
67354
  }, () => [this.env.model.getters.getActiveSheetId()]);
@@ -67337,6 +67367,9 @@ stores.inject(MyMetaStore, storeInstance);
67337
67367
  this.env.model.off("command-rejected", this);
67338
67368
  });
67339
67369
  }
67370
+ onExternalClick(ev) {
67371
+ if (!ev.target.closest(".o-color-picker")) this.state.pickerOpened = false;
67372
+ }
67340
67373
  focusInputAndSelectContent() {
67341
67374
  if (!this.state.isEditing || !this.sheetNameRef.el) return;
67342
67375
  this.sheetNameRef.el.focus();
@@ -67440,6 +67473,8 @@ stores.inject(MyMetaStore, storeInstance);
67440
67473
  },
67441
67474
  openSheetColorPickerCallback: () => {
67442
67475
  this.state.pickerOpened = true;
67476
+ const sheet = this.env.model.getters.getSheet(this.props.sheetId);
67477
+ this.state.currentPickerColor = sheet.color;
67443
67478
  }
67444
67479
  });
67445
67480
  }
@@ -69475,7 +69510,7 @@ stores.inject(MyMetaStore, storeInstance);
69475
69510
  this.closePopover();
69476
69511
  return;
69477
69512
  }
69478
- const pivotId = this.pivotIdInSelection;
69513
+ const pivotId = this.dynamicPivotIdInSelection;
69479
69514
  if (pivotId) {
69480
69515
  this.env.openSidePanel("PivotSidePanel", {
69481
69516
  pivotId,
@@ -69505,7 +69540,7 @@ stores.inject(MyMetaStore, storeInstance);
69505
69540
  this.state.popoverProps = void 0;
69506
69541
  }
69507
69542
  get action() {
69508
- if (this.pivotIdInSelection) return {
69543
+ if (this.dynamicPivotIdInSelection) return {
69509
69544
  name: _t("Edit pivot style"),
69510
69545
  icon: "o-spreadsheet-Icon.EDIT_TABLE"
69511
69546
  };
@@ -69524,15 +69559,19 @@ stores.inject(MyMetaStore, storeInstance);
69524
69559
  get tableStyles() {
69525
69560
  return this.env.model.getters.getTableStyles();
69526
69561
  }
69527
- get pivotIdInSelection() {
69562
+ get dynamicPivotIdInSelection() {
69528
69563
  const selection = this.env.model.getters.getSelectedZones();
69529
- for (const zone of selection) for (const position of positions(zone)) {
69530
- const sheetId = this.env.model.getters.getActiveSheetId();
69531
- const pivotId = this.env.model.getters.getPivotIdFromPosition({
69532
- sheetId,
69533
- ...position
69534
- });
69535
- if (pivotId) return pivotId;
69564
+ const pivotCellIds = new Set(this.env.model.getters.getCellsWithTrackedFormula("PIVOT"));
69565
+ if (pivotCellIds.size === 0) return;
69566
+ const activeSheetId = this.env.model.getters.getActiveSheetId();
69567
+ for (const zone of selection) for (const position of cellPositions(activeSheetId, zone)) {
69568
+ const mainPosition = this.env.model.getters.getArrayFormulaSpreadingOn(position);
69569
+ if (!mainPosition) continue;
69570
+ const cellId = this.env.model.getters.getCell(mainPosition)?.id;
69571
+ if (cellId && pivotCellIds.has(cellId)) {
69572
+ const pivotId = this.env.model.getters.getPivotIdFromPosition(mainPosition);
69573
+ if (pivotId) return pivotId;
69574
+ }
69536
69575
  }
69537
69576
  }
69538
69577
  get class() {
@@ -72464,11 +72503,11 @@ stores.inject(MyMetaStore, storeInstance);
72464
72503
  <!-- each data marker in the series does not have a different color -->
72465
72504
  <c:varyColors val="0"/>
72466
72505
  ${joinXmlNodes(rightDataSetsNodes)}
72467
- <c:axId val="${catAxId + 1}" />
72468
- <c:axId val="${valAxId + 1}" />
72506
+ <c:axId val="${17781238}" />
72507
+ <c:axId val="${88853994}" />
72469
72508
  </c:barChart>
72470
- ${addAx("b", "c:catAx", catAxId + 1, valAxId + 1, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
72471
- ${addAx("r", "c:valAx", valAxId + 1, catAxId + 1, chart.axesDesign?.y1?.title, chart.fontColor)}
72509
+ ${addAx("b", "c:catAx", 17781238, 88853994, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
72510
+ ${addAx("r", "c:valAx", 88853994, 17781238, chart.axesDesign?.y1?.title, chart.fontColor)}
72472
72511
  ` : ""}`;
72473
72512
  }
72474
72513
  function addComboChart(chart) {
@@ -72720,11 +72759,11 @@ stores.inject(MyMetaStore, storeInstance);
72720
72759
  <c:varyColors val="0"/>
72721
72760
  ${joinXmlNodes(rightDataSetsNodes)}
72722
72761
  ${insertDataLabels({ showValues: chart.showValues })}
72723
- <c:axId val="${catAxId + 1}" />
72724
- <c:axId val="${valAxId + 1}" />
72762
+ <c:axId val="${17781238}" />
72763
+ <c:axId val="${88853994}" />
72725
72764
  </c:lineChart>
72726
- ${addAx("b", "c:catAx", catAxId + 1, valAxId + 1, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
72727
- ${addAx("r", "c:valAx", valAxId + 1, catAxId + 1, chart.axesDesign?.y1?.title, chart.fontColor)}
72765
+ ${addAx("b", "c:catAx", 17781238, 88853994, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
72766
+ ${addAx("r", "c:valAx", 88853994, 17781238, chart.axesDesign?.y1?.title, chart.fontColor)}
72728
72767
  ` : ""}
72729
72768
  `;
72730
72769
  }
@@ -72790,11 +72829,11 @@ stores.inject(MyMetaStore, storeInstance);
72790
72829
  <c:scatterStyle val="lineMarker"/>
72791
72830
  ${joinXmlNodes(rightDataSetsNodes)}
72792
72831
  ${insertDataLabels({ showValues: chart.showValues })}
72793
- <c:axId val="${catAxId + 1}" />
72794
- <c:axId val="${valAxId + 1}" />
72832
+ <c:axId val="${17781238}" />
72833
+ <c:axId val="${88853994}" />
72795
72834
  </c:scatterChart>
72796
- ${addAx("b", "c:valAx", catAxId + 1, valAxId + 1, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
72797
- ${addAx("r", "c:valAx", valAxId + 1, catAxId + 1, chart.axesDesign?.y1?.title, chart.fontColor)}
72835
+ ${addAx("b", "c:valAx", 17781238, 88853994, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
72836
+ ${addAx("r", "c:valAx", 88853994, 17781238, chart.axesDesign?.y1?.title, chart.fontColor)}
72798
72837
  ` : ""}`;
72799
72838
  }
72800
72839
  function addRadarChart(chart) {
@@ -84530,8 +84569,8 @@ exports.stores = stores;
84530
84569
  exports.tokenColors = tokenColors;
84531
84570
  exports.tokenize = tokenize;
84532
84571
 
84533
- __info__.version = "19.3.7";
84534
- __info__.date = "2026-06-17T08:57:42.174Z";
84535
- __info__.hash = "e061163";
84572
+ __info__.version = "19.3.10";
84573
+ __info__.date = "2026-07-01T05:04:42.999Z";
84574
+ __info__.hash = "040ae04";
84536
84575
 
84537
84576
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);