@odoo/o-spreadsheet 19.0.47 → 19.0.49

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.0.47
6
- * @date 2026-08-21T15:29:01.277Z
7
- * @hash 59a9b1b
5
+ * @version 19.0.49
6
+ * @date 2026-09-04T07:28:56.108Z
7
+ * @hash 3926688
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 19.0.47
6
- * @date 2026-08-21T15:28:59.913Z
7
- * @hash 59a9b1b
5
+ * @version 19.0.49
6
+ * @date 2026-09-04T07:28:54.520Z
7
+ * @hash 3926688
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";
@@ -19422,10 +19422,10 @@ const chartShowValuesPlugin = {
19422
19422
  case "bar":
19423
19423
  case "line":
19424
19424
  case "radar":
19425
- options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
19425
+ options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
19426
19426
  break;
19427
19427
  case "funnel":
19428
- drawHorizontalBarChartValues(chart, options, ctx);
19428
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
19429
19429
  break;
19430
19430
  }
19431
19431
  ctx.restore();
@@ -19466,7 +19466,7 @@ function drawLineOrBarOrRadarChartValues(chart, options, ctx) {
19466
19466
  }
19467
19467
  }
19468
19468
  }
19469
- function drawHorizontalBarChartValues(chart, options, ctx) {
19469
+ function drawHorizontalBarChartValues(chart, options, ctx, args) {
19470
19470
  const textsPositions = {};
19471
19471
  for (const dataset of chart._metasets) {
19472
19472
  if (isTrendLineAxis(dataset.xAxisID)) return;
@@ -19481,7 +19481,7 @@ function drawHorizontalBarChartValues(chart, options, ctx) {
19481
19481
  const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
19482
19482
  const PADDING = 3;
19483
19483
  let xPosition;
19484
- if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
19484
+ if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
19485
19485
  else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
19486
19486
  if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
19487
19487
  for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
@@ -19717,6 +19717,7 @@ function getRadarChartDatasets(definition, args) {
19717
19717
  hidden,
19718
19718
  borderColor,
19719
19719
  backgroundColor: borderColor,
19720
+ pointBackgroundColor: borderColor,
19720
19721
  pointRadius: definition.hideDataMarkers ? 0 : 3
19721
19722
  };
19722
19723
  if (fill) {
@@ -29571,9 +29572,10 @@ var Composer = class extends Component {
29571
29572
  compositionActive = false;
29572
29573
  spreadsheetRect = useSpreadsheetRect();
29573
29574
  lastHoveredTokenIndex = void 0;
29574
- debouncedHover = debounce((tokenIndex, hoveredRect) => {
29575
+ debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
29575
29576
  const selection = this.contentHelper.getCurrentSelection();
29576
- if (selection.start !== selection.end) return;
29577
+ const currentContent = this.props.composerStore.currentContent;
29578
+ if (selection.start !== selection.end || currentContent !== composerContent) return;
29577
29579
  const currentHoveredContext = this.props.composerStore.hoveredTokens;
29578
29580
  this.props.composerStore.hoverToken(tokenIndex);
29579
29581
  if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
@@ -29890,7 +29892,8 @@ var Composer = class extends Component {
29890
29892
  onTokenHover(tokenIndex, hoveredRect) {
29891
29893
  if (this.lastHoveredTokenIndex !== tokenIndex) {
29892
29894
  this.lastHoveredTokenIndex = tokenIndex;
29893
- this.debouncedHover(tokenIndex, hoveredRect);
29895
+ const composerContent = this.props.composerStore.currentContent;
29896
+ this.debouncedHover(tokenIndex, composerContent, hoveredRect);
29894
29897
  }
29895
29898
  }
29896
29899
  /**
@@ -31495,6 +31498,42 @@ var ColorPicker = class extends Component {
31495
31498
  }
31496
31499
  };
31497
31500
 
31501
+ //#endregion
31502
+ //#region src/components/icons/raw_svgs.ts
31503
+ /**
31504
+ * SVG markup used in `css` tagged templates as `data:image/svg+xml` URIs.
31505
+ *
31506
+ * Keep these values in a separate module so Rolldown references them instead
31507
+ * of inlining them into template literals. Inlining produces nested template
31508
+ * literals, which the downstream `rjsmin` minifier cannot parse correctly
31509
+ * because it relies on regular expressions.
31510
+ *
31511
+ * Do not inline these constants.
31512
+ */
31513
+ const CHECK_SVG = `
31514
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
31515
+ <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
31516
+ </svg>
31517
+ `;
31518
+ const CIRCLE_SVG = `
31519
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
31520
+ <circle r="2" fill="#FFF"/>
31521
+ </svg>
31522
+ `;
31523
+ const TRANSPARENT_BACKGROUND_SVG = `
31524
+ <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
31525
+ <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
31526
+ </svg>
31527
+ `;
31528
+ const CURSOR_SVG = `
31529
+ <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>
31530
+ `;
31531
+ const CARET_DOWN_SVG = `
31532
+ <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
31533
+ <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
31534
+ </svg>
31535
+ `;
31536
+
31498
31537
  //#endregion
31499
31538
  //#region src/components/side_panel/components/section/section.ts
31500
31539
  var Section = class extends Component {
@@ -31521,11 +31560,7 @@ css`
31521
31560
  cursor: pointer;
31522
31561
  border: 1px solid ${GRAY_300};
31523
31562
  background-position: 1px 1px;
31524
- background-image: url("data:image/svg+xml,${encodeURIComponent(`
31525
- <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
31526
- <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
31527
- </svg>
31528
- `)}");
31563
+ background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
31529
31564
  }
31530
31565
  `;
31531
31566
  var RoundColorPicker = class extends Component {
@@ -32786,11 +32821,6 @@ var FilterMenuCriterion = class extends Component {
32786
32821
 
32787
32822
  //#endregion
32788
32823
  //#region src/components/side_panel/components/checkbox/checkbox.ts
32789
- const CHECK_SVG = `
32790
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
32791
- <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
32792
- </svg>
32793
- `;
32794
32824
  const CHECKBOX_WIDTH = 14;
32795
32825
  css`
32796
32826
  label.o-checkbox {
@@ -45022,9 +45052,7 @@ var HoveredIconStore = class extends SpreadsheetStore {
45022
45052
  //#region src/components/grid_overlay/grid_overlay.ts
45023
45053
  css`
45024
45054
  .o-paint-format-cursor {
45025
- cursor: url("data:image/svg+xml,${encodeURIComponent(`
45026
- <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>
45027
- `)}"), auto;
45055
+ cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
45028
45056
  }
45029
45057
  `;
45030
45058
  function useCellHovered(env, gridRef) {
@@ -48655,14 +48683,16 @@ css`
48655
48683
  border-radius: 8px;
48656
48684
 
48657
48685
  &:checked {
48658
- background: url("data:image/svg+xml,${encodeURIComponent(`
48659
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
48660
- <circle r="2" fill="#FFF"/>
48661
- </svg>
48662
- `)}");
48686
+ background: url("data:image/svg+xml,${encodeURIComponent(CIRCLE_SVG)}");
48663
48687
  background-color: ${ACTION_COLOR};
48664
48688
  border-color: ${ACTION_COLOR};
48665
48689
  }
48690
+
48691
+ &:focus {
48692
+ outline: none;
48693
+ box-shadow: 0 0 0 0.25rem rgba(113, 75, 103, 0.25);
48694
+ border-color: ${ACTION_COLOR};
48695
+ }
48666
48696
  }
48667
48697
  }
48668
48698
  `;
@@ -53382,7 +53412,13 @@ var PivotSpreadsheetSidePanel = class extends Component {
53382
53412
  }
53383
53413
  onSelectionChanged(ranges) {
53384
53414
  this.state.rangeHasChanged = true;
53385
- this.state.range = ranges[0];
53415
+ if (ranges.length === 0) {
53416
+ this.state.range = void 0;
53417
+ return;
53418
+ }
53419
+ const sheetId = this.env.model.getters.getActiveSheetId();
53420
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
53421
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
53386
53422
  }
53387
53423
  onSelectionConfirmed() {
53388
53424
  if (this.state.range) {
@@ -59763,6 +59799,7 @@ var CarouselPlugin = class extends CorePlugin {
59763
59799
  return "Success";
59764
59800
  case "UPDATE_CAROUSEL":
59765
59801
  if (!this.carousels[cmd.sheetId]?.[cmd.figureId]) return "InvalidFigureId";
59802
+ for (const item of cmd.definition.items) if (item.type === "chart" && !this.getters.getChart(item.chartId)) return "ChartDoesNotExist";
59766
59803
  return "Success";
59767
59804
  }
59768
59805
  return "Success";
@@ -61357,14 +61394,16 @@ var FormulaDependencyGraph = class {
61357
61394
  */
61358
61395
  getCellsDependingOn(ranges, visited = new RangeSet()) {
61359
61396
  visited = visited.copy();
61397
+ let initialRangesToRemove = visited.copy();
61360
61398
  const queue = Array.from(ranges).reverse();
61361
61399
  while (queue.length > 0) {
61362
61400
  const range = queue.pop();
61363
61401
  visited.add(range);
61364
61402
  const impactedRanges = this.rTree.search(range);
61365
61403
  queue.push(...impactedRanges.difference(visited));
61404
+ initialRangesToRemove = initialRangesToRemove.difference(impactedRanges);
61366
61405
  }
61367
- for (const range of ranges) visited.delete(range);
61406
+ for (const range of initialRangesToRemove) visited.delete(range);
61368
61407
  return visited;
61369
61408
  }
61370
61409
  };
@@ -72914,6 +72953,9 @@ css`
72914
72953
  position: absolute;
72915
72954
  cursor: pointer;
72916
72955
  }
72956
+ .o-grid.o-dashboard-grid {
72957
+ background: #ffffff;
72958
+ }
72917
72959
  `;
72918
72960
  var SpreadsheetDashboard = class extends Component {
72919
72961
  static template = "o-spreadsheet-SpreadsheetDashboard";
@@ -74866,11 +74908,7 @@ css`
74866
74908
  appearance: none;
74867
74909
  -webkit-appearance: none;
74868
74910
  -moz-appearance: none;
74869
- background: transparent url("data:image/svg+xml,${encodeURIComponent(`
74870
- <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
74871
- <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
74872
- </svg>
74873
- `)}")
74911
+ background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
74874
74912
  no-repeat right center;
74875
74913
  text-overflow: ellipsis;
74876
74914
 
@@ -79454,6 +79492,6 @@ const chartHelpers = {
79454
79492
  //#endregion
79455
79493
  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, getCaretDownSvg, getCaretUpSvg, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
79456
79494
 
79457
- __info__.version = "19.0.47";
79458
- __info__.date = "2026-08-21T15:28:59.913Z";
79459
- __info__.hash = "59a9b1b";
79495
+ __info__.version = "19.0.49";
79496
+ __info__.date = "2026-09-04T07:28:54.520Z";
79497
+ __info__.hash = "3926688";
@@ -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.0.47
6
- * @date 2026-08-21T15:28:59.913Z
7
- * @hash 59a9b1b
5
+ * @version 19.0.49
6
+ * @date 2026-09-04T07:28:54.520Z
7
+ * @hash 3926688
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -19424,10 +19424,10 @@ stores.inject(MyMetaStore, storeInstance);
19424
19424
  case "bar":
19425
19425
  case "line":
19426
19426
  case "radar":
19427
- options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
19427
+ options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
19428
19428
  break;
19429
19429
  case "funnel":
19430
- drawHorizontalBarChartValues(chart, options, ctx);
19430
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
19431
19431
  break;
19432
19432
  }
19433
19433
  ctx.restore();
@@ -19468,7 +19468,7 @@ stores.inject(MyMetaStore, storeInstance);
19468
19468
  }
19469
19469
  }
19470
19470
  }
19471
- function drawHorizontalBarChartValues(chart, options, ctx) {
19471
+ function drawHorizontalBarChartValues(chart, options, ctx, args) {
19472
19472
  const textsPositions = {};
19473
19473
  for (const dataset of chart._metasets) {
19474
19474
  if (isTrendLineAxis(dataset.xAxisID)) return;
@@ -19483,7 +19483,7 @@ stores.inject(MyMetaStore, storeInstance);
19483
19483
  const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
19484
19484
  const PADDING = 3;
19485
19485
  let xPosition;
19486
- if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
19486
+ if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
19487
19487
  else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
19488
19488
  if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
19489
19489
  for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
@@ -19719,6 +19719,7 @@ stores.inject(MyMetaStore, storeInstance);
19719
19719
  hidden,
19720
19720
  borderColor,
19721
19721
  backgroundColor: borderColor,
19722
+ pointBackgroundColor: borderColor,
19722
19723
  pointRadius: definition.hideDataMarkers ? 0 : 3
19723
19724
  };
19724
19725
  if (fill) {
@@ -29573,9 +29574,10 @@ stores.inject(MyMetaStore, storeInstance);
29573
29574
  compositionActive = false;
29574
29575
  spreadsheetRect = useSpreadsheetRect();
29575
29576
  lastHoveredTokenIndex = void 0;
29576
- debouncedHover = debounce((tokenIndex, hoveredRect) => {
29577
+ debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
29577
29578
  const selection = this.contentHelper.getCurrentSelection();
29578
- if (selection.start !== selection.end) return;
29579
+ const currentContent = this.props.composerStore.currentContent;
29580
+ if (selection.start !== selection.end || currentContent !== composerContent) return;
29579
29581
  const currentHoveredContext = this.props.composerStore.hoveredTokens;
29580
29582
  this.props.composerStore.hoverToken(tokenIndex);
29581
29583
  if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
@@ -29892,7 +29894,8 @@ stores.inject(MyMetaStore, storeInstance);
29892
29894
  onTokenHover(tokenIndex, hoveredRect) {
29893
29895
  if (this.lastHoveredTokenIndex !== tokenIndex) {
29894
29896
  this.lastHoveredTokenIndex = tokenIndex;
29895
- this.debouncedHover(tokenIndex, hoveredRect);
29897
+ const composerContent = this.props.composerStore.currentContent;
29898
+ this.debouncedHover(tokenIndex, composerContent, hoveredRect);
29896
29899
  }
29897
29900
  }
29898
29901
  /**
@@ -31497,6 +31500,42 @@ stores.inject(MyMetaStore, storeInstance);
31497
31500
  }
31498
31501
  };
31499
31502
 
31503
+ //#endregion
31504
+ //#region src/components/icons/raw_svgs.ts
31505
+ /**
31506
+ * SVG markup used in `css` tagged templates as `data:image/svg+xml` URIs.
31507
+ *
31508
+ * Keep these values in a separate module so Rolldown references them instead
31509
+ * of inlining them into template literals. Inlining produces nested template
31510
+ * literals, which the downstream `rjsmin` minifier cannot parse correctly
31511
+ * because it relies on regular expressions.
31512
+ *
31513
+ * Do not inline these constants.
31514
+ */
31515
+ const CHECK_SVG = `
31516
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
31517
+ <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
31518
+ </svg>
31519
+ `;
31520
+ const CIRCLE_SVG = `
31521
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
31522
+ <circle r="2" fill="#FFF"/>
31523
+ </svg>
31524
+ `;
31525
+ const TRANSPARENT_BACKGROUND_SVG = `
31526
+ <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
31527
+ <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
31528
+ </svg>
31529
+ `;
31530
+ const CURSOR_SVG = `
31531
+ <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>
31532
+ `;
31533
+ const CARET_DOWN_SVG = `
31534
+ <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
31535
+ <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
31536
+ </svg>
31537
+ `;
31538
+
31500
31539
  //#endregion
31501
31540
  //#region src/components/side_panel/components/section/section.ts
31502
31541
  var Section = class extends _odoo_owl.Component {
@@ -31523,11 +31562,7 @@ stores.inject(MyMetaStore, storeInstance);
31523
31562
  cursor: pointer;
31524
31563
  border: 1px solid ${GRAY_300};
31525
31564
  background-position: 1px 1px;
31526
- background-image: url("data:image/svg+xml,${encodeURIComponent(`
31527
- <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
31528
- <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
31529
- </svg>
31530
- `)}");
31565
+ background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
31531
31566
  }
31532
31567
  `;
31533
31568
  var RoundColorPicker = class extends _odoo_owl.Component {
@@ -32788,11 +32823,6 @@ stores.inject(MyMetaStore, storeInstance);
32788
32823
 
32789
32824
  //#endregion
32790
32825
  //#region src/components/side_panel/components/checkbox/checkbox.ts
32791
- const CHECK_SVG = `
32792
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
32793
- <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
32794
- </svg>
32795
- `;
32796
32826
  const CHECKBOX_WIDTH = 14;
32797
32827
  css`
32798
32828
  label.o-checkbox {
@@ -45024,9 +45054,7 @@ stores.inject(MyMetaStore, storeInstance);
45024
45054
  //#region src/components/grid_overlay/grid_overlay.ts
45025
45055
  css`
45026
45056
  .o-paint-format-cursor {
45027
- cursor: url("data:image/svg+xml,${encodeURIComponent(`
45028
- <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>
45029
- `)}"), auto;
45057
+ cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
45030
45058
  }
45031
45059
  `;
45032
45060
  function useCellHovered(env, gridRef) {
@@ -48657,14 +48685,16 @@ stores.inject(MyMetaStore, storeInstance);
48657
48685
  border-radius: 8px;
48658
48686
 
48659
48687
  &:checked {
48660
- background: url("data:image/svg+xml,${encodeURIComponent(`
48661
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
48662
- <circle r="2" fill="#FFF"/>
48663
- </svg>
48664
- `)}");
48688
+ background: url("data:image/svg+xml,${encodeURIComponent(CIRCLE_SVG)}");
48665
48689
  background-color: ${ACTION_COLOR};
48666
48690
  border-color: ${ACTION_COLOR};
48667
48691
  }
48692
+
48693
+ &:focus {
48694
+ outline: none;
48695
+ box-shadow: 0 0 0 0.25rem rgba(113, 75, 103, 0.25);
48696
+ border-color: ${ACTION_COLOR};
48697
+ }
48668
48698
  }
48669
48699
  }
48670
48700
  `;
@@ -53384,7 +53414,13 @@ stores.inject(MyMetaStore, storeInstance);
53384
53414
  }
53385
53415
  onSelectionChanged(ranges) {
53386
53416
  this.state.rangeHasChanged = true;
53387
- this.state.range = ranges[0];
53417
+ if (ranges.length === 0) {
53418
+ this.state.range = void 0;
53419
+ return;
53420
+ }
53421
+ const sheetId = this.env.model.getters.getActiveSheetId();
53422
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
53423
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
53388
53424
  }
53389
53425
  onSelectionConfirmed() {
53390
53426
  if (this.state.range) {
@@ -59765,6 +59801,7 @@ stores.inject(MyMetaStore, storeInstance);
59765
59801
  return "Success";
59766
59802
  case "UPDATE_CAROUSEL":
59767
59803
  if (!this.carousels[cmd.sheetId]?.[cmd.figureId]) return "InvalidFigureId";
59804
+ for (const item of cmd.definition.items) if (item.type === "chart" && !this.getters.getChart(item.chartId)) return "ChartDoesNotExist";
59768
59805
  return "Success";
59769
59806
  }
59770
59807
  return "Success";
@@ -61359,14 +61396,16 @@ stores.inject(MyMetaStore, storeInstance);
61359
61396
  */
61360
61397
  getCellsDependingOn(ranges, visited = new RangeSet()) {
61361
61398
  visited = visited.copy();
61399
+ let initialRangesToRemove = visited.copy();
61362
61400
  const queue = Array.from(ranges).reverse();
61363
61401
  while (queue.length > 0) {
61364
61402
  const range = queue.pop();
61365
61403
  visited.add(range);
61366
61404
  const impactedRanges = this.rTree.search(range);
61367
61405
  queue.push(...impactedRanges.difference(visited));
61406
+ initialRangesToRemove = initialRangesToRemove.difference(impactedRanges);
61368
61407
  }
61369
- for (const range of ranges) visited.delete(range);
61408
+ for (const range of initialRangesToRemove) visited.delete(range);
61370
61409
  return visited;
61371
61410
  }
61372
61411
  };
@@ -72916,6 +72955,9 @@ stores.inject(MyMetaStore, storeInstance);
72916
72955
  position: absolute;
72917
72956
  cursor: pointer;
72918
72957
  }
72958
+ .o-grid.o-dashboard-grid {
72959
+ background: #ffffff;
72960
+ }
72919
72961
  `;
72920
72962
  var SpreadsheetDashboard = class extends _odoo_owl.Component {
72921
72963
  static template = "o-spreadsheet-SpreadsheetDashboard";
@@ -74868,11 +74910,7 @@ stores.inject(MyMetaStore, storeInstance);
74868
74910
  appearance: none;
74869
74911
  -webkit-appearance: none;
74870
74912
  -moz-appearance: none;
74871
- background: transparent url("data:image/svg+xml,${encodeURIComponent(`
74872
- <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
74873
- <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
74874
- </svg>
74875
- `)}")
74913
+ background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
74876
74914
  no-repeat right center;
74877
74915
  text-overflow: ellipsis;
74878
74916
 
@@ -79507,8 +79545,8 @@ exports.stores = stores;
79507
79545
  exports.tokenColors = tokenColors;
79508
79546
  exports.tokenize = tokenize;
79509
79547
 
79510
- __info__.version = "19.0.47";
79511
- __info__.date = "2026-08-21T15:28:59.913Z";
79512
- __info__.hash = "59a9b1b";
79548
+ __info__.version = "19.0.49";
79549
+ __info__.date = "2026-09-04T07:28:54.520Z";
79550
+ __info__.hash = "3926688";
79513
79551
 
79514
79552
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);