@odoo/o-spreadsheet 18.3.51 → 18.3.54

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.51
6
- * @date 2026-06-17T08:49:41.496Z
7
- * @hash 233f3ea
5
+ * @version 18.3.54
6
+ * @date 2026-07-01T05:01:44.424Z
7
+ * @hash d00e4b6
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -189,7 +189,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
189
189
  const GRAY_200 = "#E7E9ED";
190
190
  const GRAY_100 = "#F9FAFB";
191
191
  const TEXT_BODY = "#374151";
192
- const TEXT_BODY_MUTED = TEXT_BODY + "C2";
192
+ const TEXT_BODY_MUTED = "#374151C2";
193
193
  const TEXT_HEADING = "#111827";
194
194
  const PRIMARY_BUTTON_BG = "#714B67";
195
195
  const PRIMARY_BUTTON_HOVER_BG = "#624159";
@@ -296,9 +296,6 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
296
296
  ];
297
297
  const DEFAULT_CELL_HEIGHT = 23;
298
298
  const FOOTER_HEIGHT = 2 * 23;
299
- const MENU_SEPARATOR_BORDER_WIDTH = 1;
300
- const MENU_SEPARATOR_PADDING = 5;
301
- const MENU_SEPARATOR_HEIGHT = 1 + 2 * 5;
302
299
  const DEFAULT_STYLE = {
303
300
  align: "left",
304
301
  verticalAlign: "bottom",
@@ -318,7 +315,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
318
315
  const DEFAULT_VERTICAL_ALIGN = DEFAULT_STYLE.verticalAlign;
319
316
  const DEFAULT_WRAPPING_MODE = DEFAULT_STYLE.wrapping;
320
317
  const DEFAULT_FONT_SIZE = DEFAULT_STYLE.fontSize;
321
- const DEFAULT_FONT = "'Roboto', arial";
318
+ const DEFAULT_FONT = "'Roboto', arial, 'Liberation Sans'";
322
319
  const DEFAULT_BORDER_DESC = {
323
320
  style: "thin",
324
321
  color: "#000000"
@@ -1638,7 +1635,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1638
1635
  function recomputeZones(zones, zonesToRemove = []) {
1639
1636
  if (zones.length <= 1 && zonesToRemove.length === 0) return zones;
1640
1637
  const profilesStartingPosition = [0];
1641
- const profiles = new Map([[0, []]]);
1638
+ const profiles = /* @__PURE__ */ new Map([[0, []]]);
1642
1639
  modifyProfiles(profilesStartingPosition, profiles, zones, false);
1643
1640
  modifyProfiles(profilesStartingPosition, profiles, zonesToRemove, true);
1644
1641
  return constructZonesFromProfiles(profilesStartingPosition, profiles);
@@ -2848,12 +2845,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2848
2845
  const pIntegerAndDecimals = `(?:\\d+(?:${escapeRegExp(locale.thousandsSeparator || "")}\\d{3,})*(?:${decimalSeparator}\\d*)?)`;
2849
2846
  const pOnlyDecimals = `(?:${decimalSeparator}\\d+)`;
2850
2847
  const pNumber = "(?:\\s*" + pIntegerAndDecimals + "|" + pOnlyDecimals + ")(?:e(?:\\+|-)?\\d+)?(?:\\s*%)?";
2851
- const pMinus = "(?:\\s*-)?";
2852
- const pCurrencyFormat = "(?:\\s*[\\$€])?";
2853
2848
  const pNumberExp = "^(?:(?:" + [
2854
- pMinus + pCurrencyFormat + pNumber,
2855
- pMinus + pNumber + pCurrencyFormat,
2856
- pCurrencyFormat + pMinus + pNumber
2849
+ "(?:\\s*-)?(?:\\s*[\\$€])?" + pNumber,
2850
+ "(?:\\s*-)?" + pNumber + "(?:\\s*[\\$€])?",
2851
+ "(?:\\s*[\\$€])?(?:\\s*-)?" + pNumber
2857
2852
  ].join(")|(?:") + "))$";
2858
2853
  return new RegExp(pNumberExp, "i");
2859
2854
  });
@@ -2968,7 +2963,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2968
2963
  function isZoneDependent(cmd) {
2969
2964
  return "sheetId" in cmd && "zone" in cmd;
2970
2965
  }
2971
- const invalidateEvaluationCommands = new Set([
2966
+ const invalidateEvaluationCommands = /* @__PURE__ */ new Set([
2972
2967
  "RENAME_SHEET",
2973
2968
  "DELETE_SHEET",
2974
2969
  "CREATE_SHEET",
@@ -2987,7 +2982,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2987
2982
  "REMOVE_PIVOT",
2988
2983
  "DUPLICATE_PIVOT"
2989
2984
  ]);
2990
- const invalidateChartEvaluationCommands = new Set([
2985
+ const invalidateChartEvaluationCommands = /* @__PURE__ */ new Set([
2991
2986
  "EVALUATE_CELLS",
2992
2987
  "EVALUATE_CHARTS",
2993
2988
  "UPDATE_CELL",
@@ -3006,20 +3001,20 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3006
3001
  "UNDO",
3007
3002
  "REDO"
3008
3003
  ]);
3009
- const invalidateDependenciesCommands = new Set(["MOVE_RANGES"]);
3010
- const invalidateCFEvaluationCommands = new Set([
3004
+ const invalidateDependenciesCommands = /* @__PURE__ */ new Set(["MOVE_RANGES"]);
3005
+ const invalidateCFEvaluationCommands = /* @__PURE__ */ new Set([
3011
3006
  "EVALUATE_CELLS",
3012
3007
  "ADD_CONDITIONAL_FORMAT",
3013
3008
  "REMOVE_CONDITIONAL_FORMAT",
3014
3009
  "CHANGE_CONDITIONAL_FORMAT_PRIORITY"
3015
3010
  ]);
3016
- const invalidateBordersCommands = new Set([
3011
+ const invalidateBordersCommands = /* @__PURE__ */ new Set([
3017
3012
  "AUTOFILL_CELL",
3018
3013
  "SET_BORDER",
3019
3014
  "SET_ZONE_BORDERS",
3020
3015
  "SET_BORDERS_ON_TARGET"
3021
3016
  ]);
3022
- const readonlyAllowedCommands = new Set([
3017
+ const readonlyAllowedCommands = /* @__PURE__ */ new Set([
3023
3018
  "START",
3024
3019
  "ACTIVATE_SHEET",
3025
3020
  "COPY",
@@ -3030,7 +3025,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3030
3025
  "SET_FORMULA_VISIBILITY",
3031
3026
  "UPDATE_FILTER"
3032
3027
  ]);
3033
- const coreTypes = new Set([
3028
+ const coreTypes = /* @__PURE__ */ new Set([
3034
3029
  "UPDATE_CELL",
3035
3030
  "UPDATE_CELL_POSITION",
3036
3031
  "CLEAR_CELL",
@@ -5132,7 +5127,6 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5132
5127
  //#region src/helpers/edge_scrolling.ts
5133
5128
  const MAX_DELAY = 140;
5134
5129
  const MIN_DELAY = 20;
5135
- const ACCELERATION = .035;
5136
5130
  /**
5137
5131
  * Decreasing exponential function used to determine the "speed" of edge-scrolling
5138
5132
  * as the timeout delay.
@@ -5140,7 +5134,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5140
5134
  * Returns a timeout delay in milliseconds.
5141
5135
  */
5142
5136
  function scrollDelay(value) {
5143
- return 20 + (140 - 20) * Math.exp(-ACCELERATION * (value - 1));
5137
+ return 20 + (140 - 20) * Math.exp(-.035 * (value - 1));
5144
5138
  }
5145
5139
 
5146
5140
  //#endregion
@@ -6013,7 +6007,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
6013
6007
  smallUuid() {
6014
6008
  if (window.crypto) return "10000000-1000".replace(/[01]/g, (c) => {
6015
6009
  const n = Number(c);
6016
- return (n ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> n / 4).toString(16);
6010
+ return (n ^ crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(1))[0] & 15 >> n / 4).toString(16);
6017
6011
  });
6018
6012
  else return "xxxxxxxx-xxxx".replace(/[xy]/g, function(c) {
6019
6013
  const r = Math.random() * 16 | 0;
@@ -6027,7 +6021,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
6027
6021
  uuidv4() {
6028
6022
  if (window.crypto) return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => {
6029
6023
  const n = Number(c);
6030
- return (n ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> n / 4).toString(16);
6024
+ return (n ^ crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(1))[0] & 15 >> n / 4).toString(16);
6031
6025
  });
6032
6026
  else return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
6033
6027
  const r = Math.random() * 16 | 0;
@@ -7619,10 +7613,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
7619
7613
  type: dimension.type
7620
7614
  }));
7621
7615
  if (groupValueString.toLowerCase() === "false") return false;
7622
- return pivotNormalizationValueRegistry.get(dimension.type)(groupValueString, dimension.granularity);
7616
+ return pivotNormalizationValueRegistry.get(dimension.type)(groupValueString, dimension);
7623
7617
  }
7624
- function normalizeDateTime(value, granularity) {
7625
- return pivotTimeAdapter(granularity ?? "month").normalizeFunctionValue(value);
7618
+ function normalizeDateTime(value, dimension) {
7619
+ return pivotTimeAdapter(dimension.granularity ?? "month").normalizeFunctionValue(value);
7626
7620
  }
7627
7621
  function toFunctionPivotValue(value, dimension) {
7628
7622
  if (value === null) return `"null"`;
@@ -32262,17 +32256,16 @@ stores.inject(MyMetaStore, storeInstance);
32262
32256
 
32263
32257
  //#endregion
32264
32258
  //#region src/components/link/link_editor/link_editor.ts
32265
- const PADDING = 12;
32266
32259
  css`
32267
32260
  .o-link-editor {
32268
32261
  font-size: 13px;
32269
32262
  background-color: white;
32270
32263
  box-shadow: 0 1px 4px 3px rgba(60, 64, 67, 0.15);
32271
- padding: ${PADDING}px;
32264
+ padding: ${12}px;
32272
32265
  display: flex;
32273
32266
  flex-direction: column;
32274
32267
  border-radius: 4px;
32275
- width: ${340 + 2 * PADDING}px;
32268
+ width: ${364}px;
32276
32269
 
32277
32270
  .o-section {
32278
32271
  .o-section-title {
@@ -36426,11 +36419,10 @@ stores.inject(MyMetaStore, storeInstance);
36426
36419
  const LINE_VERTICAL_PADDING = 1;
36427
36420
  const PICKER_PADDING = 8;
36428
36421
  const ITEM_BORDER_WIDTH = 1;
36429
- const ITEM_EDGE_LENGTH = 18;
36430
36422
  const ITEMS_PER_LINE = 10;
36431
36423
  const MAGNIFIER_EDGE = 16;
36432
36424
  const ITEM_GAP = 2;
36433
- const CONTENT_WIDTH = ITEMS_PER_LINE * (ITEM_EDGE_LENGTH + 2 * ITEM_BORDER_WIDTH) + (ITEMS_PER_LINE - 1) * ITEM_GAP;
36425
+ const CONTENT_WIDTH = 218;
36434
36426
  const INNER_GRADIENT_WIDTH = CONTENT_WIDTH - 2 * ITEM_BORDER_WIDTH;
36435
36427
  const INNER_GRADIENT_HEIGHT = CONTENT_WIDTH - 30 - 2 * ITEM_BORDER_WIDTH;
36436
36428
  css`
@@ -36442,7 +36434,7 @@ stores.inject(MyMetaStore, storeInstance);
36442
36434
  line-height: 1.2;
36443
36435
  overflow-y: auto;
36444
36436
  overflow-x: hidden;
36445
- width: ${CONTENT_WIDTH + 2 * PICKER_PADDING}px;
36437
+ width: ${234}px;
36446
36438
 
36447
36439
  .o-color-picker-section-name {
36448
36440
  margin: 0px ${ITEM_BORDER_WIDTH}px;
@@ -36468,8 +36460,8 @@ stores.inject(MyMetaStore, storeInstance);
36468
36460
  }
36469
36461
  }
36470
36462
  .o-color-picker-line-item {
36471
- width: ${ITEM_EDGE_LENGTH + 2 * ITEM_BORDER_WIDTH}px;
36472
- height: ${ITEM_EDGE_LENGTH + 2 * ITEM_BORDER_WIDTH}px;
36463
+ width: ${20}px;
36464
+ height: ${20}px;
36473
36465
  margin: 0px;
36474
36466
  border-radius: 50px;
36475
36467
  border: ${ITEM_BORDER_WIDTH}px solid #666666;
@@ -36513,13 +36505,13 @@ stores.inject(MyMetaStore, storeInstance);
36513
36505
  }
36514
36506
 
36515
36507
  .o-custom-selector {
36516
- padding: ${PICKER_PADDING + 2}px ${PICKER_PADDING}px;
36508
+ padding: ${10}px ${PICKER_PADDING}px;
36517
36509
  position: relative;
36518
36510
  .o-gradient {
36519
36511
  margin-bottom: ${MAGNIFIER_EDGE / 2}px;
36520
36512
  border: ${ITEM_BORDER_WIDTH}px solid #c0c0c0;
36521
- width: ${INNER_GRADIENT_WIDTH + 2 * ITEM_BORDER_WIDTH}px;
36522
- height: ${INNER_GRADIENT_HEIGHT + 2 * ITEM_BORDER_WIDTH}px;
36513
+ width: ${218}px;
36514
+ height: ${188}px;
36523
36515
  position: relative;
36524
36516
  }
36525
36517
 
@@ -36657,8 +36649,8 @@ stores.inject(MyMetaStore, storeInstance);
36657
36649
  const left = Math.round(INNER_GRADIENT_WIDTH * clip(s / 100, 0, 1));
36658
36650
  const top = Math.round(INNER_GRADIENT_HEIGHT * clip(1 - 2 * l / (200 - s), 0, 1));
36659
36651
  return cssPropertiesToCss({
36660
- left: `${-MAGNIFIER_EDGE / 2 + left}px`,
36661
- top: `${-MAGNIFIER_EDGE / 2 + top}px`,
36652
+ left: `${-16 / 2 + left}px`,
36653
+ top: `${-16 / 2 + top}px`,
36662
36654
  background: hslaToHex(this.state.currentHslaColor)
36663
36655
  });
36664
36656
  }
@@ -43555,8 +43547,8 @@ stores.inject(MyMetaStore, storeInstance);
43555
43547
  sortedColumn;
43556
43548
  constructor(definition, fields) {
43557
43549
  this.measures = definition.measures.map((measure) => createMeasure(fields, measure));
43558
- this.columns = definition.columns.map((dimension) => createPivotDimension(fields, dimension));
43559
- this.rows = definition.rows.map((dimension) => createPivotDimension(fields, dimension));
43550
+ this.columns = definition.columns.map((dimension) => this.createPivotDimension(fields, dimension));
43551
+ this.rows = definition.rows.map((dimension) => this.createPivotDimension(fields, dimension));
43560
43552
  this.sortedColumn = definition.sortedColumn;
43561
43553
  }
43562
43554
  getDimension(nameWithGranularity) {
@@ -43569,6 +43561,40 @@ stores.inject(MyMetaStore, storeInstance);
43569
43561
  if (!measure) throw new EvaluationError(_t("Field %s is not a measure", id));
43570
43562
  return measure;
43571
43563
  }
43564
+ createPivotDimension(fields, dimension) {
43565
+ const field = fields[dimension.fieldName];
43566
+ const type = field?.type ?? "integer";
43567
+ const granularity = field && isDateOrDatetimeField(field) ? dimension.granularity : void 0;
43568
+ return {
43569
+ /**
43570
+ * Get the display name of the dimension
43571
+ * e.g. "stage_id" -> "Stage", "create_date:month" -> "Create Date"
43572
+ */
43573
+ displayName: field?.string ?? dimension.fieldName,
43574
+ /**
43575
+ * Get the name of the dimension, as it is stored in the pivot formula
43576
+ * e.g. "stage_id", "create_date:month"
43577
+ */
43578
+ nameWithGranularity: dimension.fieldName + (granularity ? `:${granularity}` : ""),
43579
+ /**
43580
+ * Get the name of the field of the dimension
43581
+ * e.g. "stage_id" -> "stage_id", "create_date:month" -> "create_date"
43582
+ */
43583
+ fieldName: dimension.fieldName,
43584
+ /**
43585
+ * Get the aggregate operator of the dimension
43586
+ * e.g. "stage_id" -> undefined, "create_date:month" -> "month"
43587
+ */
43588
+ granularity,
43589
+ /**
43590
+ * Get the type of the field of the dimension
43591
+ * e.g. "stage_id" -> "many2one", "create_date:month" -> "date"
43592
+ */
43593
+ type,
43594
+ order: dimension.order,
43595
+ isValid: !!field
43596
+ };
43597
+ }
43572
43598
  };
43573
43599
  function createMeasure(fields, measure) {
43574
43600
  const fieldName = measure.fieldName;
@@ -43612,40 +43638,6 @@ stores.inject(MyMetaStore, storeInstance);
43612
43638
  display: measure.display
43613
43639
  };
43614
43640
  }
43615
- function createPivotDimension(fields, dimension) {
43616
- const field = fields[dimension.fieldName];
43617
- const type = field?.type ?? "integer";
43618
- const granularity = field && isDateOrDatetimeField(field) ? dimension.granularity : void 0;
43619
- return {
43620
- /**
43621
- * Get the display name of the dimension
43622
- * e.g. "stage_id" -> "Stage", "create_date:month" -> "Create Date"
43623
- */
43624
- displayName: field?.string ?? dimension.fieldName,
43625
- /**
43626
- * Get the name of the dimension, as it is stored in the pivot formula
43627
- * e.g. "stage_id", "create_date:month"
43628
- */
43629
- nameWithGranularity: dimension.fieldName + (granularity ? `:${granularity}` : ""),
43630
- /**
43631
- * Get the name of the field of the dimension
43632
- * e.g. "stage_id" -> "stage_id", "create_date:month" -> "create_date"
43633
- */
43634
- fieldName: dimension.fieldName,
43635
- /**
43636
- * Get the aggregate operator of the dimension
43637
- * e.g. "stage_id" -> undefined, "create_date:month" -> "month"
43638
- */
43639
- granularity,
43640
- /**
43641
- * Get the type of the field of the dimension
43642
- * e.g. "stage_id" -> "many2one", "create_date:month" -> "date"
43643
- */
43644
- type,
43645
- order: dimension.order,
43646
- isValid: !!field
43647
- };
43648
- }
43649
43641
 
43650
43642
  //#endregion
43651
43643
  //#region src/helpers/pivot/spreadsheet_pivot/runtime_definition_spreadsheet_pivot.ts
@@ -46340,11 +46332,11 @@ stores.inject(MyMetaStore, storeInstance);
46340
46332
  getResizerPosition(resizer) {
46341
46333
  const anchorCenteringOffset = (ANCHOR_SIZE - ACTIVE_BORDER_WIDTH) / 2;
46342
46334
  const style = {};
46343
- if (resizer.includes("top")) style.top = `${-anchorCenteringOffset}px`;
46344
- else if (resizer.includes("bottom")) style.bottom = `${-anchorCenteringOffset}px`;
46335
+ if (resizer.includes("top")) style.top = `-3px`;
46336
+ else if (resizer.includes("bottom")) style.bottom = `-3px`;
46345
46337
  else style.bottom = `calc(50% - ${anchorCenteringOffset}px)`;
46346
- if (resizer.includes("left")) style.left = `${-anchorCenteringOffset}px`;
46347
- else if (resizer.includes("right")) style.right = `${-anchorCenteringOffset}px`;
46338
+ if (resizer.includes("left")) style.left = `-3px`;
46339
+ else if (resizer.includes("right")) style.right = `-3px`;
46348
46340
  else style.right = `calc(50% - ${anchorCenteringOffset}px)`;
46349
46341
  return cssPropertiesToCss(style);
46350
46342
  }
@@ -57627,6 +57619,9 @@ stores.inject(MyMetaStore, storeInstance);
57627
57619
  case "CREATE_CHART":
57628
57620
  this.tryToAddColors(this.getChartColors(cmd.figureId));
57629
57621
  break;
57622
+ case "COLOR_SHEET":
57623
+ if (cmd.color) this.tryToAddColors([cmd.color]);
57624
+ break;
57630
57625
  case "UPDATE_CELL":
57631
57626
  case "ADD_CONDITIONAL_FORMAT":
57632
57627
  case "SET_BORDER":
@@ -57649,8 +57644,12 @@ stores.inject(MyMetaStore, storeInstance);
57649
57644
  }
57650
57645
  computeCustomColors() {
57651
57646
  let usedColors = [];
57652
- for (const sheetId of this.getters.getSheetIds()) usedColors = usedColors.concat(this.getColorsFromCells(sheetId), this.getFormattingColors(sheetId), this.getTableColors(sheetId));
57653
- return [...new Set([...usedColors])];
57647
+ for (const sheetId of this.getters.getSheetIds()) usedColors = usedColors.concat(this.getSheetColors(sheetId), this.getColorsFromCells(sheetId), this.getFormattingColors(sheetId), this.getTableColors(sheetId));
57648
+ return [.../* @__PURE__ */ new Set([...usedColors])];
57649
+ }
57650
+ getSheetColors(sheetId) {
57651
+ const sheet = this.getters.getSheet(sheetId);
57652
+ return sheet.color ? [sheet.color] : [];
57654
57653
  }
57655
57654
  getColorsFromCells(sheetId) {
57656
57655
  const cells = Object.values(this.getters.getCells(sheetId));
@@ -61996,7 +61995,7 @@ stores.inject(MyMetaStore, storeInstance);
61996
61995
  };
61997
61996
  }
61998
61997
  };
61999
- const invalidateTableStyleCommandsSet = new Set([
61998
+ const invalidateTableStyleCommandsSet = /* @__PURE__ */ new Set([
62000
61999
  "HIDE_COLUMNS_ROWS",
62001
62000
  "UNHIDE_COLUMNS_ROWS",
62002
62001
  "UNFOLD_HEADER_GROUP",
@@ -64157,14 +64156,14 @@ stores.inject(MyMetaStore, storeInstance);
64157
64156
  adjustPositionX(targetCol) {
64158
64157
  const sheetId = this.sheetId;
64159
64158
  const { start, end } = this.getters.getColDimensions(sheetId, targetCol);
64160
- if (this.offsetX + this.viewportWidth + this.offsetCorrectionX < end) this.offsetX = end - this.viewportWidth;
64159
+ if (this.offsetX + this.viewportWidth + this.offsetCorrectionX < end) this.offsetX = end - this.viewportWidth - this.offsetCorrectionX;
64161
64160
  else if (this.offsetX + this.offsetCorrectionX > start) this.offsetX = start - this.offsetCorrectionX;
64162
64161
  this.adjustViewportZoneX();
64163
64162
  }
64164
64163
  adjustPositionY(targetRow) {
64165
64164
  const sheetId = this.sheetId;
64166
64165
  const { start, end } = this.getters.getRowDimensions(sheetId, targetRow);
64167
- if (this.offsetY + this.viewportHeight + this.offsetCorrectionY < end) this.offsetY = end - this.viewportHeight;
64166
+ if (this.offsetY + this.viewportHeight + this.offsetCorrectionY < end) this.offsetY = end - this.viewportHeight - this.offsetCorrectionY;
64168
64167
  else if (this.offsetY + this.offsetCorrectionY > start) this.offsetY = start - this.offsetCorrectionY;
64169
64168
  this.adjustViewportZoneY();
64170
64169
  }
@@ -65557,11 +65556,14 @@ stores.inject(MyMetaStore, storeInstance);
65557
65556
  }
65558
65557
  });
65559
65558
  this.DOMFocusableElementStore = useStore(DOMFocusableElementStore);
65560
- (0, _odoo_owl.useExternalListener)(window, "click", () => this.state.pickerOpened = false);
65559
+ (0, _odoo_owl.useExternalListener)(window, "click", this.onExternalClick.bind(this), { capture: true });
65561
65560
  (0, _odoo_owl.useEffect)((sheetId) => {
65562
65561
  if (this.props.sheetId === sheetId) this.scrollToSheet();
65563
65562
  }, () => [this.env.model.getters.getActiveSheetId()]);
65564
65563
  }
65564
+ onExternalClick(ev) {
65565
+ if (!ev.target.closest(".o-color-picker")) this.state.pickerOpened = false;
65566
+ }
65565
65567
  focusInputAndSelectContent() {
65566
65568
  if (!this.state.isEditing || !this.sheetNameRef.el) return;
65567
65569
  this.sheetNameRef.el.focus();
@@ -65658,6 +65660,8 @@ stores.inject(MyMetaStore, storeInstance);
65658
65660
  },
65659
65661
  openSheetColorPickerCallback: () => {
65660
65662
  this.state.pickerOpened = true;
65663
+ const sheet = this.env.model.getters.getSheet(this.props.sheetId);
65664
+ this.state.currentPickerColor = sheet.color;
65661
65665
  }
65662
65666
  });
65663
65667
  }
@@ -69842,11 +69846,11 @@ stores.inject(MyMetaStore, storeInstance);
69842
69846
  <!-- each data marker in the series does not have a different color -->
69843
69847
  <c:varyColors val="0"/>
69844
69848
  ${joinXmlNodes(rightDataSetsNodes)}
69845
- <c:axId val="${catAxId + 1}" />
69846
- <c:axId val="${valAxId + 1}" />
69849
+ <c:axId val="${17781238}" />
69850
+ <c:axId val="${88853994}" />
69847
69851
  </c:barChart>
69848
- ${addAx("b", "c:catAx", catAxId + 1, valAxId + 1, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
69849
- ${addAx("r", "c:valAx", valAxId + 1, catAxId + 1, chart.axesDesign?.y1?.title, chart.fontColor)}
69852
+ ${addAx("b", "c:catAx", 17781238, 88853994, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
69853
+ ${addAx("r", "c:valAx", 88853994, 17781238, chart.axesDesign?.y1?.title, chart.fontColor)}
69850
69854
  ` : ""}`;
69851
69855
  }
69852
69856
  function addComboChart(chart) {
@@ -70001,11 +70005,11 @@ stores.inject(MyMetaStore, storeInstance);
70001
70005
  <!-- each data marker in the series does not have a different color -->
70002
70006
  <c:varyColors val="0"/>
70003
70007
  ${joinXmlNodes(rightDataSetsNodes)}
70004
- <c:axId val="${catAxId + 1}" />
70005
- <c:axId val="${valAxId + 1}" />
70008
+ <c:axId val="${17781238}" />
70009
+ <c:axId val="${88853994}" />
70006
70010
  </c:lineChart>
70007
- ${addAx("b", "c:catAx", catAxId + 1, valAxId + 1, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
70008
- ${addAx("r", "c:valAx", valAxId + 1, catAxId + 1, chart.axesDesign?.y1?.title, chart.fontColor)}
70011
+ ${addAx("b", "c:catAx", 17781238, 88853994, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
70012
+ ${addAx("r", "c:valAx", 88853994, 17781238, chart.axesDesign?.y1?.title, chart.fontColor)}
70009
70013
  ` : ""}
70010
70014
  `;
70011
70015
  }
@@ -70067,11 +70071,11 @@ stores.inject(MyMetaStore, storeInstance);
70067
70071
  <c:varyColors val="0"/>
70068
70072
  <c:scatterStyle val="lineMarker"/>
70069
70073
  ${joinXmlNodes(rightDataSetsNodes)}
70070
- <c:axId val="${catAxId + 1}" />
70071
- <c:axId val="${valAxId + 1}" />
70074
+ <c:axId val="${17781238}" />
70075
+ <c:axId val="${88853994}" />
70072
70076
  </c:scatterChart>
70073
- ${addAx("b", "c:valAx", catAxId + 1, valAxId + 1, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
70074
- ${addAx("r", "c:valAx", valAxId + 1, catAxId + 1, chart.axesDesign?.y1?.title, chart.fontColor)}
70077
+ ${addAx("b", "c:valAx", 17781238, 88853994, chart.axesDesign?.x?.title, chart.fontColor, leftDataSetsNodes.length ? 1 : 0)}
70078
+ ${addAx("r", "c:valAx", 88853994, 17781238, chart.axesDesign?.y1?.title, chart.fontColor)}
70075
70079
  ` : ""}`;
70076
70080
  }
70077
70081
  function addRadarChart(chart) {
@@ -72282,8 +72286,8 @@ exports.stores = stores;
72282
72286
  exports.tokenColors = tokenColors;
72283
72287
  exports.tokenize = tokenize;
72284
72288
 
72285
- __info__.version = "18.3.51";
72286
- __info__.date = "2026-06-17T08:49:41.496Z";
72287
- __info__.hash = "233f3ea";
72289
+ __info__.version = "18.3.54";
72290
+ __info__.date = "2026-07-01T05:01:44.424Z";
72291
+ __info__.hash = "d00e4b6";
72288
72292
 
72289
72293
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);