@odoo/o-spreadsheet 18.4.52 → 18.4.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.4.52
6
- * @date 2026-08-21T15:29:28.329Z
7
- * @hash 5715a49
5
+ * @version 18.4.54
6
+ * @date 2026-09-04T07:09:42.871Z
7
+ * @hash 303fa73
8
8
  */
9
9
  /* Originates from src/components/top_bar/top_bar.scss */
10
10
  @media (max-width: 1200px) {
@@ -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.4.52
6
- * @date 2026-08-21T15:29:26.810Z
7
- * @hash 5715a49
5
+ * @version 18.4.54
6
+ * @date 2026-09-04T07:09:41.203Z
7
+ * @hash 303fa73
8
8
  */
9
9
 
10
10
  import { App, Component, blockDom, markRaw, onMounted, onPatched, onWillPatch, onWillStart, onWillUnmount, onWillUpdateProps, status, toRaw, useChildSubEnv, useComponent, useEffect, useEnv, useExternalListener, useRef, useState, useSubEnv, xml } from "@odoo/owl";
@@ -18030,10 +18030,10 @@ const chartShowValuesPlugin = {
18030
18030
  case "bar":
18031
18031
  case "line":
18032
18032
  case "radar":
18033
- options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
18033
+ options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
18034
18034
  break;
18035
18035
  case "funnel":
18036
- drawHorizontalBarChartValues(chart, options, ctx);
18036
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
18037
18037
  break;
18038
18038
  }
18039
18039
  ctx.restore();
@@ -18074,7 +18074,7 @@ function drawLineOrBarOrRadarChartValues(chart, options, ctx) {
18074
18074
  }
18075
18075
  }
18076
18076
  }
18077
- function drawHorizontalBarChartValues(chart, options, ctx) {
18077
+ function drawHorizontalBarChartValues(chart, options, ctx, args) {
18078
18078
  const textsPositions = {};
18079
18079
  for (const dataset of chart._metasets) {
18080
18080
  if (isTrendLineAxis(dataset.xAxisID)) return;
@@ -18089,7 +18089,7 @@ function drawHorizontalBarChartValues(chart, options, ctx) {
18089
18089
  const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
18090
18090
  const PADDING = 3;
18091
18091
  let xPosition;
18092
- if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
18092
+ if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
18093
18093
  else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
18094
18094
  if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
18095
18095
  for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
@@ -18325,6 +18325,7 @@ function getRadarChartDatasets(definition, args) {
18325
18325
  hidden,
18326
18326
  borderColor,
18327
18327
  backgroundColor: borderColor,
18328
+ pointBackgroundColor: borderColor,
18328
18329
  pointRadius: definition.hideDataMarkers ? 0 : 3
18329
18330
  };
18330
18331
  if (fill) {
@@ -28507,9 +28508,10 @@ var Composer = class extends Component {
28507
28508
  compositionActive = false;
28508
28509
  spreadsheetRect = useSpreadsheetRect();
28509
28510
  lastHoveredTokenIndex = void 0;
28510
- debouncedHover = debounce((tokenIndex, hoveredRect) => {
28511
+ debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
28511
28512
  const selection = this.contentHelper.getCurrentSelection();
28512
- if (selection.start !== selection.end) return;
28513
+ const currentContent = this.props.composerStore.currentContent;
28514
+ if (selection.start !== selection.end || currentContent !== composerContent) return;
28513
28515
  const currentHoveredContext = this.props.composerStore.hoveredTokens;
28514
28516
  this.props.composerStore.hoverToken(tokenIndex);
28515
28517
  if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
@@ -28825,7 +28827,8 @@ var Composer = class extends Component {
28825
28827
  onTokenHover(tokenIndex, hoveredRect) {
28826
28828
  if (this.lastHoveredTokenIndex !== tokenIndex) {
28827
28829
  this.lastHoveredTokenIndex = tokenIndex;
28828
- this.debouncedHover(tokenIndex, hoveredRect);
28830
+ const composerContent = this.props.composerStore.currentContent;
28831
+ this.debouncedHover(tokenIndex, composerContent, hoveredRect);
28829
28832
  }
28830
28833
  }
28831
28834
  /**
@@ -29601,6 +29604,42 @@ var ColorPicker = class extends Component {
29601
29604
  }
29602
29605
  };
29603
29606
 
29607
+ //#endregion
29608
+ //#region src/components/icons/raw_svgs.ts
29609
+ /**
29610
+ * SVG markup used in `css` tagged templates as `data:image/svg+xml` URIs.
29611
+ *
29612
+ * Keep these values in a separate module so Rolldown references them instead
29613
+ * of inlining them into template literals. Inlining produces nested template
29614
+ * literals, which the downstream `rjsmin` minifier cannot parse correctly
29615
+ * because it relies on regular expressions.
29616
+ *
29617
+ * Do not inline these constants.
29618
+ */
29619
+ const CHECK_SVG = `
29620
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
29621
+ <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
29622
+ </svg>
29623
+ `;
29624
+ const CIRCLE_SVG = `
29625
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
29626
+ <circle r="2" fill="#FFF"/>
29627
+ </svg>
29628
+ `;
29629
+ const TRANSPARENT_BACKGROUND_SVG = `
29630
+ <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
29631
+ <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
29632
+ </svg>
29633
+ `;
29634
+ const CURSOR_SVG = `
29635
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="16"><path d="M6.5.4c1.3-.8 2.9-.1 3.8 1.4l2.9 5.1c.2.4.9 1.6-.4 2.3l-1.6.9 1.8 3.1c.2.4.1 1-.2 1.2l-1.6 1c-.3.1-.9 0-1.1-.4l-1.8-3.1-1.6 1c-.6.4-1.7 0-2.2-.8L0 4.3"/><path fill="#fff" d="M9.1 2a1.4 1.1 60 0 0-1.7-.6L5.5 2.5l.9 1.6-1 .6-.9-1.6-.6.4 1.8 3.1-1.3.7-1.8-3.1-1 .6 3.8 6.6 6.8-3.98M3.9 8.8 10.82 5l.795 1.4-6.81 3.96"/></svg>
29636
+ `;
29637
+ const CARET_DOWN_SVG = `
29638
+ <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
29639
+ <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
29640
+ </svg>
29641
+ `;
29642
+
29604
29643
  //#endregion
29605
29644
  //#region src/components/side_panel/components/section/section.ts
29606
29645
  var Section = class extends Component {
@@ -29627,11 +29666,7 @@ css`
29627
29666
  cursor: pointer;
29628
29667
  border: 1px solid ${GRAY_300};
29629
29668
  background-position: 1px 1px;
29630
- background-image: url("data:image/svg+xml,${encodeURIComponent(`
29631
- <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
29632
- <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
29633
- </svg>
29634
- `)}");
29669
+ background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
29635
29670
  }
29636
29671
  `;
29637
29672
  var RoundColorPicker = class extends Component {
@@ -30889,11 +30924,6 @@ var FilterMenuCriterion = class extends Component {
30889
30924
 
30890
30925
  //#endregion
30891
30926
  //#region src/components/side_panel/components/checkbox/checkbox.ts
30892
- const CHECK_SVG = `
30893
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
30894
- <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
30895
- </svg>
30896
- `;
30897
30927
  const CHECKBOX_WIDTH = 14;
30898
30928
  css`
30899
30929
  label.o-checkbox {
@@ -41016,9 +41046,7 @@ var HoveredIconStore = class extends SpreadsheetStore {
41016
41046
  //#region src/components/grid_overlay/grid_overlay.ts
41017
41047
  css`
41018
41048
  .o-paint-format-cursor {
41019
- cursor: url("data:image/svg+xml,${encodeURIComponent(`
41020
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="16"><path d="M6.5.4c1.3-.8 2.9-.1 3.8 1.4l2.9 5.1c.2.4.9 1.6-.4 2.3l-1.6.9 1.8 3.1c.2.4.1 1-.2 1.2l-1.6 1c-.3.1-.9 0-1.1-.4l-1.8-3.1-1.6 1c-.6.4-1.7 0-2.2-.8L0 4.3"/><path fill="#fff" d="M9.1 2a1.4 1.1 60 0 0-1.7-.6L5.5 2.5l.9 1.6-1 .6-.9-1.6-.6.4 1.8 3.1-1.3.7-1.8-3.1-1 .6 3.8 6.6 6.8-3.98M3.9 8.8 10.82 5l.795 1.4-6.81 3.96"/></svg>
41021
- `)}"), auto;
41049
+ cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
41022
41050
  }
41023
41051
  `;
41024
41052
  function useCellHovered(env, gridRef) {
@@ -44317,14 +44345,16 @@ css`
44317
44345
  border-radius: 8px;
44318
44346
 
44319
44347
  &:checked {
44320
- background: url("data:image/svg+xml,${encodeURIComponent(`
44321
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
44322
- <circle r="2" fill="#FFF"/>
44323
- </svg>
44324
- `)}");
44348
+ background: url("data:image/svg+xml,${encodeURIComponent(CIRCLE_SVG)}");
44325
44349
  background-color: ${ACTION_COLOR};
44326
44350
  border-color: ${ACTION_COLOR};
44327
44351
  }
44352
+
44353
+ &:focus {
44354
+ outline: none;
44355
+ box-shadow: 0 0 0 0.25rem rgba(113, 75, 103, 0.25);
44356
+ border-color: ${ACTION_COLOR};
44357
+ }
44328
44358
  }
44329
44359
  }
44330
44360
  `;
@@ -50173,7 +50203,13 @@ var PivotSpreadsheetSidePanel = class extends Component {
50173
50203
  }
50174
50204
  onSelectionChanged(ranges) {
50175
50205
  this.state.rangeHasChanged = true;
50176
- this.state.range = ranges[0];
50206
+ if (ranges.length === 0) {
50207
+ this.state.range = void 0;
50208
+ return;
50209
+ }
50210
+ const sheetId = this.env.model.getters.getActiveSheetId();
50211
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
50212
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
50177
50213
  }
50178
50214
  onSelectionConfirmed() {
50179
50215
  if (this.state.range) {
@@ -57785,6 +57821,16 @@ var FormulaDependencyGraph = class {
57785
57821
  getCellsDependingOn(ranges, ignore) {
57786
57822
  const visited = this.createEmptyPositionSet();
57787
57823
  const queue = Array.from(ranges).reverse();
57824
+ const initialPositionsToRemove = this.createEmptyPositionSet();
57825
+ for (const range of ranges) {
57826
+ const zone = range.zone;
57827
+ const sheetId = range.sheetId;
57828
+ for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) initialPositionsToRemove.add({
57829
+ sheetId,
57830
+ col,
57831
+ row
57832
+ });
57833
+ }
57788
57834
  while (queue.length > 0) {
57789
57835
  const range = queue.pop();
57790
57836
  const zone = range.zone;
@@ -57796,9 +57842,13 @@ var FormulaDependencyGraph = class {
57796
57842
  });
57797
57843
  const impactedPositions = this.rTree.search(range).map((dep) => dep.data);
57798
57844
  const nextInQueue = {};
57799
- for (const position of impactedPositions) if (!visited.has(position) && !ignore.has(position)) {
57800
- if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
57801
- nextInQueue[position.sheetId].push(positionToZone(position));
57845
+ for (const position of impactedPositions) {
57846
+ if (ignore.has(position)) continue;
57847
+ initialPositionsToRemove.delete(position);
57848
+ if (!visited.has(position)) {
57849
+ if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
57850
+ nextInQueue[position.sheetId].push(positionToZone(position));
57851
+ }
57802
57852
  }
57803
57853
  for (const sheetId in nextInQueue) {
57804
57854
  const zones = recomputeZones(nextInQueue[sheetId], []);
@@ -57808,15 +57858,7 @@ var FormulaDependencyGraph = class {
57808
57858
  })));
57809
57859
  }
57810
57860
  }
57811
- for (const range of ranges) {
57812
- const zone = range.zone;
57813
- const sheetId = range.sheetId;
57814
- for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) visited.delete({
57815
- sheetId,
57816
- col,
57817
- row
57818
- });
57819
- }
57861
+ for (const position of initialPositionsToRemove) visited.delete(position);
57820
57862
  return visited;
57821
57863
  }
57822
57864
  };
@@ -69031,6 +69073,9 @@ css`
69031
69073
  position: absolute;
69032
69074
  cursor: pointer;
69033
69075
  }
69076
+ .o-grid.o-dashboard-grid {
69077
+ background: #ffffff;
69078
+ }
69034
69079
  `;
69035
69080
  var SpreadsheetDashboard = class extends Component {
69036
69081
  static template = "o-spreadsheet-SpreadsheetDashboard";
@@ -70980,11 +71025,7 @@ css`
70980
71025
  appearance: none;
70981
71026
  -webkit-appearance: none;
70982
71027
  -moz-appearance: none;
70983
- background: transparent url("data:image/svg+xml,${encodeURIComponent(`
70984
- <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
70985
- <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
70986
- </svg>
70987
- `)}")
71028
+ background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
70988
71029
  no-repeat right center;
70989
71030
  text-overflow: ellipsis;
70990
71031
 
@@ -75436,6 +75477,6 @@ const chartHelpers = {
75436
75477
  //#endregion
75437
75478
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, ClientDisconnectedError, CommandResult, CorePlugin, CoreViewPlugin, DispatchResult, EvaluationError, LocalTransportService, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, chartHelpers, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
75438
75479
 
75439
- __info__.version = "18.4.52";
75440
- __info__.date = "2026-08-21T15:29:26.810Z";
75441
- __info__.hash = "5715a49";
75480
+ __info__.version = "18.4.54";
75481
+ __info__.date = "2026-09-04T07:09:41.203Z";
75482
+ __info__.hash = "303fa73";
@@ -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.4.52
6
- * @date 2026-08-21T15:29:26.810Z
7
- * @hash 5715a49
5
+ * @version 18.4.54
6
+ * @date 2026-09-04T07:09:41.203Z
7
+ * @hash 303fa73
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -18032,10 +18032,10 @@ stores.inject(MyMetaStore, storeInstance);
18032
18032
  case "bar":
18033
18033
  case "line":
18034
18034
  case "radar":
18035
- options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
18035
+ options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
18036
18036
  break;
18037
18037
  case "funnel":
18038
- drawHorizontalBarChartValues(chart, options, ctx);
18038
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
18039
18039
  break;
18040
18040
  }
18041
18041
  ctx.restore();
@@ -18076,7 +18076,7 @@ stores.inject(MyMetaStore, storeInstance);
18076
18076
  }
18077
18077
  }
18078
18078
  }
18079
- function drawHorizontalBarChartValues(chart, options, ctx) {
18079
+ function drawHorizontalBarChartValues(chart, options, ctx, args) {
18080
18080
  const textsPositions = {};
18081
18081
  for (const dataset of chart._metasets) {
18082
18082
  if (isTrendLineAxis(dataset.xAxisID)) return;
@@ -18091,7 +18091,7 @@ stores.inject(MyMetaStore, storeInstance);
18091
18091
  const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
18092
18092
  const PADDING = 3;
18093
18093
  let xPosition;
18094
- if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
18094
+ if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
18095
18095
  else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
18096
18096
  if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
18097
18097
  for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
@@ -18327,6 +18327,7 @@ stores.inject(MyMetaStore, storeInstance);
18327
18327
  hidden,
18328
18328
  borderColor,
18329
18329
  backgroundColor: borderColor,
18330
+ pointBackgroundColor: borderColor,
18330
18331
  pointRadius: definition.hideDataMarkers ? 0 : 3
18331
18332
  };
18332
18333
  if (fill) {
@@ -28509,9 +28510,10 @@ stores.inject(MyMetaStore, storeInstance);
28509
28510
  compositionActive = false;
28510
28511
  spreadsheetRect = useSpreadsheetRect();
28511
28512
  lastHoveredTokenIndex = void 0;
28512
- debouncedHover = debounce((tokenIndex, hoveredRect) => {
28513
+ debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
28513
28514
  const selection = this.contentHelper.getCurrentSelection();
28514
- if (selection.start !== selection.end) return;
28515
+ const currentContent = this.props.composerStore.currentContent;
28516
+ if (selection.start !== selection.end || currentContent !== composerContent) return;
28515
28517
  const currentHoveredContext = this.props.composerStore.hoveredTokens;
28516
28518
  this.props.composerStore.hoverToken(tokenIndex);
28517
28519
  if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
@@ -28827,7 +28829,8 @@ stores.inject(MyMetaStore, storeInstance);
28827
28829
  onTokenHover(tokenIndex, hoveredRect) {
28828
28830
  if (this.lastHoveredTokenIndex !== tokenIndex) {
28829
28831
  this.lastHoveredTokenIndex = tokenIndex;
28830
- this.debouncedHover(tokenIndex, hoveredRect);
28832
+ const composerContent = this.props.composerStore.currentContent;
28833
+ this.debouncedHover(tokenIndex, composerContent, hoveredRect);
28831
28834
  }
28832
28835
  }
28833
28836
  /**
@@ -29603,6 +29606,42 @@ stores.inject(MyMetaStore, storeInstance);
29603
29606
  }
29604
29607
  };
29605
29608
 
29609
+ //#endregion
29610
+ //#region src/components/icons/raw_svgs.ts
29611
+ /**
29612
+ * SVG markup used in `css` tagged templates as `data:image/svg+xml` URIs.
29613
+ *
29614
+ * Keep these values in a separate module so Rolldown references them instead
29615
+ * of inlining them into template literals. Inlining produces nested template
29616
+ * literals, which the downstream `rjsmin` minifier cannot parse correctly
29617
+ * because it relies on regular expressions.
29618
+ *
29619
+ * Do not inline these constants.
29620
+ */
29621
+ const CHECK_SVG = `
29622
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
29623
+ <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
29624
+ </svg>
29625
+ `;
29626
+ const CIRCLE_SVG = `
29627
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
29628
+ <circle r="2" fill="#FFF"/>
29629
+ </svg>
29630
+ `;
29631
+ const TRANSPARENT_BACKGROUND_SVG = `
29632
+ <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
29633
+ <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
29634
+ </svg>
29635
+ `;
29636
+ const CURSOR_SVG = `
29637
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="16"><path d="M6.5.4c1.3-.8 2.9-.1 3.8 1.4l2.9 5.1c.2.4.9 1.6-.4 2.3l-1.6.9 1.8 3.1c.2.4.1 1-.2 1.2l-1.6 1c-.3.1-.9 0-1.1-.4l-1.8-3.1-1.6 1c-.6.4-1.7 0-2.2-.8L0 4.3"/><path fill="#fff" d="M9.1 2a1.4 1.1 60 0 0-1.7-.6L5.5 2.5l.9 1.6-1 .6-.9-1.6-.6.4 1.8 3.1-1.3.7-1.8-3.1-1 .6 3.8 6.6 6.8-3.98M3.9 8.8 10.82 5l.795 1.4-6.81 3.96"/></svg>
29638
+ `;
29639
+ const CARET_DOWN_SVG = `
29640
+ <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
29641
+ <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
29642
+ </svg>
29643
+ `;
29644
+
29606
29645
  //#endregion
29607
29646
  //#region src/components/side_panel/components/section/section.ts
29608
29647
  var Section = class extends _odoo_owl.Component {
@@ -29629,11 +29668,7 @@ stores.inject(MyMetaStore, storeInstance);
29629
29668
  cursor: pointer;
29630
29669
  border: 1px solid ${GRAY_300};
29631
29670
  background-position: 1px 1px;
29632
- background-image: url("data:image/svg+xml,${encodeURIComponent(`
29633
- <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
29634
- <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
29635
- </svg>
29636
- `)}");
29671
+ background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
29637
29672
  }
29638
29673
  `;
29639
29674
  var RoundColorPicker = class extends _odoo_owl.Component {
@@ -30891,11 +30926,6 @@ stores.inject(MyMetaStore, storeInstance);
30891
30926
 
30892
30927
  //#endregion
30893
30928
  //#region src/components/side_panel/components/checkbox/checkbox.ts
30894
- const CHECK_SVG = `
30895
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
30896
- <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
30897
- </svg>
30898
- `;
30899
30929
  const CHECKBOX_WIDTH = 14;
30900
30930
  css`
30901
30931
  label.o-checkbox {
@@ -41018,9 +41048,7 @@ stores.inject(MyMetaStore, storeInstance);
41018
41048
  //#region src/components/grid_overlay/grid_overlay.ts
41019
41049
  css`
41020
41050
  .o-paint-format-cursor {
41021
- cursor: url("data:image/svg+xml,${encodeURIComponent(`
41022
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="16"><path d="M6.5.4c1.3-.8 2.9-.1 3.8 1.4l2.9 5.1c.2.4.9 1.6-.4 2.3l-1.6.9 1.8 3.1c.2.4.1 1-.2 1.2l-1.6 1c-.3.1-.9 0-1.1-.4l-1.8-3.1-1.6 1c-.6.4-1.7 0-2.2-.8L0 4.3"/><path fill="#fff" d="M9.1 2a1.4 1.1 60 0 0-1.7-.6L5.5 2.5l.9 1.6-1 .6-.9-1.6-.6.4 1.8 3.1-1.3.7-1.8-3.1-1 .6 3.8 6.6 6.8-3.98M3.9 8.8 10.82 5l.795 1.4-6.81 3.96"/></svg>
41023
- `)}"), auto;
41051
+ cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
41024
41052
  }
41025
41053
  `;
41026
41054
  function useCellHovered(env, gridRef) {
@@ -44319,14 +44347,16 @@ stores.inject(MyMetaStore, storeInstance);
44319
44347
  border-radius: 8px;
44320
44348
 
44321
44349
  &:checked {
44322
- background: url("data:image/svg+xml,${encodeURIComponent(`
44323
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
44324
- <circle r="2" fill="#FFF"/>
44325
- </svg>
44326
- `)}");
44350
+ background: url("data:image/svg+xml,${encodeURIComponent(CIRCLE_SVG)}");
44327
44351
  background-color: ${ACTION_COLOR};
44328
44352
  border-color: ${ACTION_COLOR};
44329
44353
  }
44354
+
44355
+ &:focus {
44356
+ outline: none;
44357
+ box-shadow: 0 0 0 0.25rem rgba(113, 75, 103, 0.25);
44358
+ border-color: ${ACTION_COLOR};
44359
+ }
44330
44360
  }
44331
44361
  }
44332
44362
  `;
@@ -50175,7 +50205,13 @@ stores.inject(MyMetaStore, storeInstance);
50175
50205
  }
50176
50206
  onSelectionChanged(ranges) {
50177
50207
  this.state.rangeHasChanged = true;
50178
- this.state.range = ranges[0];
50208
+ if (ranges.length === 0) {
50209
+ this.state.range = void 0;
50210
+ return;
50211
+ }
50212
+ const sheetId = this.env.model.getters.getActiveSheetId();
50213
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
50214
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
50179
50215
  }
50180
50216
  onSelectionConfirmed() {
50181
50217
  if (this.state.range) {
@@ -57787,6 +57823,16 @@ stores.inject(MyMetaStore, storeInstance);
57787
57823
  getCellsDependingOn(ranges, ignore) {
57788
57824
  const visited = this.createEmptyPositionSet();
57789
57825
  const queue = Array.from(ranges).reverse();
57826
+ const initialPositionsToRemove = this.createEmptyPositionSet();
57827
+ for (const range of ranges) {
57828
+ const zone = range.zone;
57829
+ const sheetId = range.sheetId;
57830
+ for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) initialPositionsToRemove.add({
57831
+ sheetId,
57832
+ col,
57833
+ row
57834
+ });
57835
+ }
57790
57836
  while (queue.length > 0) {
57791
57837
  const range = queue.pop();
57792
57838
  const zone = range.zone;
@@ -57798,9 +57844,13 @@ stores.inject(MyMetaStore, storeInstance);
57798
57844
  });
57799
57845
  const impactedPositions = this.rTree.search(range).map((dep) => dep.data);
57800
57846
  const nextInQueue = {};
57801
- for (const position of impactedPositions) if (!visited.has(position) && !ignore.has(position)) {
57802
- if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
57803
- nextInQueue[position.sheetId].push(positionToZone(position));
57847
+ for (const position of impactedPositions) {
57848
+ if (ignore.has(position)) continue;
57849
+ initialPositionsToRemove.delete(position);
57850
+ if (!visited.has(position)) {
57851
+ if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
57852
+ nextInQueue[position.sheetId].push(positionToZone(position));
57853
+ }
57804
57854
  }
57805
57855
  for (const sheetId in nextInQueue) {
57806
57856
  const zones = recomputeZones(nextInQueue[sheetId], []);
@@ -57810,15 +57860,7 @@ stores.inject(MyMetaStore, storeInstance);
57810
57860
  })));
57811
57861
  }
57812
57862
  }
57813
- for (const range of ranges) {
57814
- const zone = range.zone;
57815
- const sheetId = range.sheetId;
57816
- for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) visited.delete({
57817
- sheetId,
57818
- col,
57819
- row
57820
- });
57821
- }
57863
+ for (const position of initialPositionsToRemove) visited.delete(position);
57822
57864
  return visited;
57823
57865
  }
57824
57866
  };
@@ -69033,6 +69075,9 @@ stores.inject(MyMetaStore, storeInstance);
69033
69075
  position: absolute;
69034
69076
  cursor: pointer;
69035
69077
  }
69078
+ .o-grid.o-dashboard-grid {
69079
+ background: #ffffff;
69080
+ }
69036
69081
  `;
69037
69082
  var SpreadsheetDashboard = class extends _odoo_owl.Component {
69038
69083
  static template = "o-spreadsheet-SpreadsheetDashboard";
@@ -70982,11 +71027,7 @@ stores.inject(MyMetaStore, storeInstance);
70982
71027
  appearance: none;
70983
71028
  -webkit-appearance: none;
70984
71029
  -moz-appearance: none;
70985
- background: transparent url("data:image/svg+xml,${encodeURIComponent(`
70986
- <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
70987
- <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
70988
- </svg>
70989
- `)}")
71030
+ background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
70990
71031
  no-repeat right center;
70991
71032
  text-overflow: ellipsis;
70992
71033
 
@@ -75487,8 +75528,8 @@ exports.stores = stores;
75487
75528
  exports.tokenColors = tokenColors;
75488
75529
  exports.tokenize = tokenize;
75489
75530
 
75490
- __info__.version = "18.4.52";
75491
- __info__.date = "2026-08-21T15:29:26.810Z";
75492
- __info__.hash = "5715a49";
75531
+ __info__.version = "18.4.54";
75532
+ __info__.date = "2026-09-04T07:09:41.203Z";
75533
+ __info__.hash = "303fa73";
75493
75534
 
75494
75535
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);