@odoo/o-spreadsheet 19.0.48 → 19.0.50

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.48
6
- * @date 2026-08-29T09:14:14.219Z
7
- * @hash 0a6c168
5
+ * @version 19.0.50
6
+ * @date 2026-09-10T05:35:45.664Z
7
+ * @hash e499258
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.48
6
- * @date 2026-08-29T09:14:12.472Z
7
- * @hash 0a6c168
5
+ * @version 19.0.50
6
+ * @date 2026-09-10T05:35:44.046Z
7
+ * @hash e499258
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";
@@ -16420,7 +16420,7 @@ const RemoveDuplicateTerms = { Errors: {
16420
16420
  ["MoreThanOneRangeSelected"]: _t("Please select only one range of cells"),
16421
16421
  ["EmptyTarget"]: _t("Please select a range of cells containing values."),
16422
16422
  ["NoColumnsProvided"]: _t("Please select at latest one column to analyze."),
16423
- ["WillRemoveExistingMerge"]: _t("This operation is not possible due to a merge. Please remove the merges first than try again.")
16423
+ ["WillRemoveExistingMerge"]: _t("Cannot perform this action on merged cells. Unmerge the cells and try again.")
16424
16424
  } };
16425
16425
  const DVTerms = {
16426
16426
  DateIs: {
@@ -19419,13 +19419,14 @@ const chartShowValuesPlugin = {
19419
19419
  case "doughnut":
19420
19420
  drawPieChartValues(chart, options, ctx);
19421
19421
  break;
19422
+ case "combo":
19422
19423
  case "bar":
19423
19424
  case "line":
19424
19425
  case "radar":
19425
- options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
19426
+ options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
19426
19427
  break;
19427
19428
  case "funnel":
19428
- drawHorizontalBarChartValues(chart, options, ctx);
19429
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
19429
19430
  break;
19430
19431
  }
19431
19432
  ctx.restore();
@@ -19449,7 +19450,7 @@ function drawLineOrBarOrRadarChartValues(chart, options, ctx) {
19449
19450
  const point = dataset.data[i];
19450
19451
  const xPosition = point.x;
19451
19452
  let yPosition = 0;
19452
- if (chart.config.type === "line" || chart.config.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
19453
+ if (dataset.type === "line" || dataset.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
19453
19454
  else {
19454
19455
  const yZeroLine = yAxisScale.getPixelForValue(0);
19455
19456
  const distanceFromAxisOrigin = Math.abs(yZeroLine - point.y);
@@ -19466,7 +19467,7 @@ function drawLineOrBarOrRadarChartValues(chart, options, ctx) {
19466
19467
  }
19467
19468
  }
19468
19469
  }
19469
- function drawHorizontalBarChartValues(chart, options, ctx) {
19470
+ function drawHorizontalBarChartValues(chart, options, ctx, args) {
19470
19471
  const textsPositions = {};
19471
19472
  for (const dataset of chart._metasets) {
19472
19473
  if (isTrendLineAxis(dataset.xAxisID)) return;
@@ -19481,7 +19482,7 @@ function drawHorizontalBarChartValues(chart, options, ctx) {
19481
19482
  const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
19482
19483
  const PADDING = 3;
19483
19484
  let xPosition;
19484
- if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
19485
+ if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
19485
19486
  else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
19486
19487
  if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
19487
19488
  for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
@@ -29572,9 +29573,10 @@ var Composer = class extends Component {
29572
29573
  compositionActive = false;
29573
29574
  spreadsheetRect = useSpreadsheetRect();
29574
29575
  lastHoveredTokenIndex = void 0;
29575
- debouncedHover = debounce((tokenIndex, hoveredRect) => {
29576
+ debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
29576
29577
  const selection = this.contentHelper.getCurrentSelection();
29577
- if (selection.start !== selection.end) return;
29578
+ const currentContent = this.props.composerStore.currentContent;
29579
+ if (selection.start !== selection.end || currentContent !== composerContent) return;
29578
29580
  const currentHoveredContext = this.props.composerStore.hoveredTokens;
29579
29581
  this.props.composerStore.hoverToken(tokenIndex);
29580
29582
  if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
@@ -29891,7 +29893,8 @@ var Composer = class extends Component {
29891
29893
  onTokenHover(tokenIndex, hoveredRect) {
29892
29894
  if (this.lastHoveredTokenIndex !== tokenIndex) {
29893
29895
  this.lastHoveredTokenIndex = tokenIndex;
29894
- this.debouncedHover(tokenIndex, hoveredRect);
29896
+ const composerContent = this.props.composerStore.currentContent;
29897
+ this.debouncedHover(tokenIndex, composerContent, hoveredRect);
29895
29898
  }
29896
29899
  }
29897
29900
  /**
@@ -31496,6 +31499,42 @@ var ColorPicker = class extends Component {
31496
31499
  }
31497
31500
  };
31498
31501
 
31502
+ //#endregion
31503
+ //#region src/components/icons/raw_svgs.ts
31504
+ /**
31505
+ * SVG markup used in `css` tagged templates as `data:image/svg+xml` URIs.
31506
+ *
31507
+ * Keep these values in a separate module so Rolldown references them instead
31508
+ * of inlining them into template literals. Inlining produces nested template
31509
+ * literals, which the downstream `rjsmin` minifier cannot parse correctly
31510
+ * because it relies on regular expressions.
31511
+ *
31512
+ * Do not inline these constants.
31513
+ */
31514
+ const CHECK_SVG = `
31515
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
31516
+ <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
31517
+ </svg>
31518
+ `;
31519
+ const CIRCLE_SVG = `
31520
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
31521
+ <circle r="2" fill="#FFF"/>
31522
+ </svg>
31523
+ `;
31524
+ const TRANSPARENT_BACKGROUND_SVG = `
31525
+ <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
31526
+ <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
31527
+ </svg>
31528
+ `;
31529
+ const CURSOR_SVG = `
31530
+ <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>
31531
+ `;
31532
+ const CARET_DOWN_SVG = `
31533
+ <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
31534
+ <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
31535
+ </svg>
31536
+ `;
31537
+
31499
31538
  //#endregion
31500
31539
  //#region src/components/side_panel/components/section/section.ts
31501
31540
  var Section = class extends Component {
@@ -31522,11 +31561,7 @@ css`
31522
31561
  cursor: pointer;
31523
31562
  border: 1px solid ${GRAY_300};
31524
31563
  background-position: 1px 1px;
31525
- background-image: url("data:image/svg+xml,${encodeURIComponent(`
31526
- <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
31527
- <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
31528
- </svg>
31529
- `)}");
31564
+ background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
31530
31565
  }
31531
31566
  `;
31532
31567
  var RoundColorPicker = class extends Component {
@@ -32787,11 +32822,6 @@ var FilterMenuCriterion = class extends Component {
32787
32822
 
32788
32823
  //#endregion
32789
32824
  //#region src/components/side_panel/components/checkbox/checkbox.ts
32790
- const CHECK_SVG = `
32791
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
32792
- <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
32793
- </svg>
32794
- `;
32795
32825
  const CHECKBOX_WIDTH = 14;
32796
32826
  css`
32797
32827
  label.o-checkbox {
@@ -45023,9 +45053,7 @@ var HoveredIconStore = class extends SpreadsheetStore {
45023
45053
  //#region src/components/grid_overlay/grid_overlay.ts
45024
45054
  css`
45025
45055
  .o-paint-format-cursor {
45026
- cursor: url("data:image/svg+xml,${encodeURIComponent(`
45027
- <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>
45028
- `)}"), auto;
45056
+ cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
45029
45057
  }
45030
45058
  `;
45031
45059
  function useCellHovered(env, gridRef) {
@@ -45245,6 +45273,11 @@ var GridOverlay = class extends Component {
45245
45273
  });
45246
45274
  return icon?.onClick ? icon : void 0;
45247
45275
  }
45276
+ get isFooterVisible() {
45277
+ const { y } = this.env.model.getters.getMainViewportCoordinates();
45278
+ const { height } = this.env.model.getters.getSheetViewDimension();
45279
+ return !this.env.model.getters.isReadonly() && height - y > 46;
45280
+ }
45248
45281
  };
45249
45282
 
45250
45283
  //#endregion
@@ -48656,11 +48689,7 @@ css`
48656
48689
  border-radius: 8px;
48657
48690
 
48658
48691
  &:checked {
48659
- background: url("data:image/svg+xml,${encodeURIComponent(`
48660
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
48661
- <circle r="2" fill="#FFF"/>
48662
- </svg>
48663
- `)}");
48692
+ background: url("data:image/svg+xml,${encodeURIComponent(CIRCLE_SVG)}");
48664
48693
  background-color: ${ACTION_COLOR};
48665
48694
  border-color: ${ACTION_COLOR};
48666
48695
  }
@@ -51885,7 +51914,7 @@ var FindAndReplacePanel = class extends Component {
51885
51914
  }
51886
51915
  get specificRangeMatchesCount() {
51887
51916
  const range = this.searchOptions.specificRange;
51888
- if (!range) return "";
51917
+ if (!range || range.invalidSheetName || range.invalidXc) return "";
51889
51918
  const { sheetId, zone } = range;
51890
51919
  return _t("%(matches)s matches in range %(range)s of %(sheetName)s", {
51891
51920
  matches: this.store.specificRangeMatchesCount,
@@ -53389,7 +53418,13 @@ var PivotSpreadsheetSidePanel = class extends Component {
53389
53418
  }
53390
53419
  onSelectionChanged(ranges) {
53391
53420
  this.state.rangeHasChanged = true;
53392
- this.state.range = ranges[0];
53421
+ if (ranges.length === 0) {
53422
+ this.state.range = void 0;
53423
+ return;
53424
+ }
53425
+ const sheetId = this.env.model.getters.getActiveSheetId();
53426
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
53427
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
53393
53428
  }
53394
53429
  onSelectionConfirmed() {
53395
53430
  if (this.state.range) {
@@ -59770,6 +59805,7 @@ var CarouselPlugin = class extends CorePlugin {
59770
59805
  return "Success";
59771
59806
  case "UPDATE_CAROUSEL":
59772
59807
  if (!this.carousels[cmd.sheetId]?.[cmd.figureId]) return "InvalidFigureId";
59808
+ for (const item of cmd.definition.items) if (item.type === "chart" && !this.getters.getChart(item.chartId)) return "ChartDoesNotExist";
59773
59809
  return "Success";
59774
59810
  }
59775
59811
  return "Success";
@@ -61364,14 +61400,16 @@ var FormulaDependencyGraph = class {
61364
61400
  */
61365
61401
  getCellsDependingOn(ranges, visited = new RangeSet()) {
61366
61402
  visited = visited.copy();
61403
+ let initialRangesToRemove = visited.copy();
61367
61404
  const queue = Array.from(ranges).reverse();
61368
61405
  while (queue.length > 0) {
61369
61406
  const range = queue.pop();
61370
61407
  visited.add(range);
61371
61408
  const impactedRanges = this.rTree.search(range);
61372
61409
  queue.push(...impactedRanges.difference(visited));
61410
+ initialRangesToRemove = initialRangesToRemove.difference(impactedRanges);
61373
61411
  }
61374
- for (const range of ranges) visited.delete(range);
61412
+ for (const range of initialRangesToRemove) visited.delete(range);
61375
61413
  return visited;
61376
61414
  }
61377
61415
  };
@@ -66563,7 +66601,8 @@ var GeoFeaturePlugin = class extends UIPlugin {
66563
66601
  static getters = [
66564
66602
  "getGeoJsonFeatures",
66565
66603
  "geoFeatureNameToId",
66566
- "getGeoChartAvailableRegions"
66604
+ "getGeoChartAvailableRegions",
66605
+ "loadUsedGeoJsonFeatures"
66567
66606
  ];
66568
66607
  geoJsonService;
66569
66608
  geoJsonCache = {};
@@ -66600,6 +66639,23 @@ var GeoFeaturePlugin = class extends UIPlugin {
66600
66639
  }
66601
66640
  return this.geoJsonService.geoFeatureNameToId(region, featureName);
66602
66641
  }
66642
+ loadUsedGeoJsonFeatures() {
66643
+ const regions = this.getters.getSheetIds().flatMap((sheetId) => this.getters.getChartIds(sheetId).map((chartId) => {
66644
+ const definition = this.getters.getChartDefinition(chartId);
66645
+ return definition.type === "geo" ? definition.region || this.getters.getGeoChartAvailableRegions()[0]?.id : void 0;
66646
+ })).filter(isDefined);
66647
+ const uniqueRegions = Array.from(new Set(regions));
66648
+ if (uniqueRegions.length && !this.geoJsonService) {
66649
+ console.error("No geoJsonService provided to the model");
66650
+ return Promise.resolve();
66651
+ }
66652
+ for (const region of uniqueRegions) this.getGeoJsonFeatures(region);
66653
+ const promises = uniqueRegions.map((region) => {
66654
+ const cachedGeoJson = this.geoJsonCache[region];
66655
+ return cachedGeoJson instanceof Promise ? cachedGeoJson : Promise.resolve();
66656
+ });
66657
+ return Promise.all(promises).then(() => {});
66658
+ }
66603
66659
  convertToGeoJson(json) {
66604
66660
  if (!json) return null;
66605
66661
  if (json.type === "Topology") {
@@ -69614,7 +69670,7 @@ var InternalViewport = class {
69614
69670
  let height = lastRowEnd - this.offsetCorrectionY;
69615
69671
  if (this.canScrollVertically) {
69616
69672
  height = Math.max(height, this.viewportHeight);
69617
- if (lastRowEnd + 46 > height && !this.getters.isReadonly()) height += 46;
69673
+ if (lastRowEnd + 46 > height && !this.getters.isReadonly() && this.viewportHeight > 46) height += 46;
69618
69674
  }
69619
69675
  return {
69620
69676
  width,
@@ -74876,11 +74932,7 @@ css`
74876
74932
  appearance: none;
74877
74933
  -webkit-appearance: none;
74878
74934
  -moz-appearance: none;
74879
- background: transparent url("data:image/svg+xml,${encodeURIComponent(`
74880
- <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
74881
- <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
74882
- </svg>
74883
- `)}")
74935
+ background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
74884
74936
  no-repeat right center;
74885
74937
  text-overflow: ellipsis;
74886
74938
 
@@ -79464,6 +79516,6 @@ const chartHelpers = {
79464
79516
  //#endregion
79465
79517
  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 };
79466
79518
 
79467
- __info__.version = "19.0.48";
79468
- __info__.date = "2026-08-29T09:14:12.472Z";
79469
- __info__.hash = "0a6c168";
79519
+ __info__.version = "19.0.50";
79520
+ __info__.date = "2026-09-10T05:35:44.046Z";
79521
+ __info__.hash = "e499258";
@@ -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.48
6
- * @date 2026-08-29T09:14:12.472Z
7
- * @hash 0a6c168
5
+ * @version 19.0.50
6
+ * @date 2026-09-10T05:35:44.046Z
7
+ * @hash e499258
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -16422,7 +16422,7 @@ stores.inject(MyMetaStore, storeInstance);
16422
16422
  ["MoreThanOneRangeSelected"]: _t("Please select only one range of cells"),
16423
16423
  ["EmptyTarget"]: _t("Please select a range of cells containing values."),
16424
16424
  ["NoColumnsProvided"]: _t("Please select at latest one column to analyze."),
16425
- ["WillRemoveExistingMerge"]: _t("This operation is not possible due to a merge. Please remove the merges first than try again.")
16425
+ ["WillRemoveExistingMerge"]: _t("Cannot perform this action on merged cells. Unmerge the cells and try again.")
16426
16426
  } };
16427
16427
  const DVTerms = {
16428
16428
  DateIs: {
@@ -19421,13 +19421,14 @@ stores.inject(MyMetaStore, storeInstance);
19421
19421
  case "doughnut":
19422
19422
  drawPieChartValues(chart, options, ctx);
19423
19423
  break;
19424
+ case "combo":
19424
19425
  case "bar":
19425
19426
  case "line":
19426
19427
  case "radar":
19427
- options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
19428
+ options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
19428
19429
  break;
19429
19430
  case "funnel":
19430
- drawHorizontalBarChartValues(chart, options, ctx);
19431
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
19431
19432
  break;
19432
19433
  }
19433
19434
  ctx.restore();
@@ -19451,7 +19452,7 @@ stores.inject(MyMetaStore, storeInstance);
19451
19452
  const point = dataset.data[i];
19452
19453
  const xPosition = point.x;
19453
19454
  let yPosition = 0;
19454
- if (chart.config.type === "line" || chart.config.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
19455
+ if (dataset.type === "line" || dataset.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
19455
19456
  else {
19456
19457
  const yZeroLine = yAxisScale.getPixelForValue(0);
19457
19458
  const distanceFromAxisOrigin = Math.abs(yZeroLine - point.y);
@@ -19468,7 +19469,7 @@ stores.inject(MyMetaStore, storeInstance);
19468
19469
  }
19469
19470
  }
19470
19471
  }
19471
- function drawHorizontalBarChartValues(chart, options, ctx) {
19472
+ function drawHorizontalBarChartValues(chart, options, ctx, args) {
19472
19473
  const textsPositions = {};
19473
19474
  for (const dataset of chart._metasets) {
19474
19475
  if (isTrendLineAxis(dataset.xAxisID)) return;
@@ -19483,7 +19484,7 @@ stores.inject(MyMetaStore, storeInstance);
19483
19484
  const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
19484
19485
  const PADDING = 3;
19485
19486
  let xPosition;
19486
- if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
19487
+ if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
19487
19488
  else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
19488
19489
  if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
19489
19490
  for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
@@ -29574,9 +29575,10 @@ stores.inject(MyMetaStore, storeInstance);
29574
29575
  compositionActive = false;
29575
29576
  spreadsheetRect = useSpreadsheetRect();
29576
29577
  lastHoveredTokenIndex = void 0;
29577
- debouncedHover = debounce((tokenIndex, hoveredRect) => {
29578
+ debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
29578
29579
  const selection = this.contentHelper.getCurrentSelection();
29579
- if (selection.start !== selection.end) return;
29580
+ const currentContent = this.props.composerStore.currentContent;
29581
+ if (selection.start !== selection.end || currentContent !== composerContent) return;
29580
29582
  const currentHoveredContext = this.props.composerStore.hoveredTokens;
29581
29583
  this.props.composerStore.hoverToken(tokenIndex);
29582
29584
  if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
@@ -29893,7 +29895,8 @@ stores.inject(MyMetaStore, storeInstance);
29893
29895
  onTokenHover(tokenIndex, hoveredRect) {
29894
29896
  if (this.lastHoveredTokenIndex !== tokenIndex) {
29895
29897
  this.lastHoveredTokenIndex = tokenIndex;
29896
- this.debouncedHover(tokenIndex, hoveredRect);
29898
+ const composerContent = this.props.composerStore.currentContent;
29899
+ this.debouncedHover(tokenIndex, composerContent, hoveredRect);
29897
29900
  }
29898
29901
  }
29899
29902
  /**
@@ -31498,6 +31501,42 @@ stores.inject(MyMetaStore, storeInstance);
31498
31501
  }
31499
31502
  };
31500
31503
 
31504
+ //#endregion
31505
+ //#region src/components/icons/raw_svgs.ts
31506
+ /**
31507
+ * SVG markup used in `css` tagged templates as `data:image/svg+xml` URIs.
31508
+ *
31509
+ * Keep these values in a separate module so Rolldown references them instead
31510
+ * of inlining them into template literals. Inlining produces nested template
31511
+ * literals, which the downstream `rjsmin` minifier cannot parse correctly
31512
+ * because it relies on regular expressions.
31513
+ *
31514
+ * Do not inline these constants.
31515
+ */
31516
+ const CHECK_SVG = `
31517
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
31518
+ <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
31519
+ </svg>
31520
+ `;
31521
+ const CIRCLE_SVG = `
31522
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
31523
+ <circle r="2" fill="#FFF"/>
31524
+ </svg>
31525
+ `;
31526
+ const TRANSPARENT_BACKGROUND_SVG = `
31527
+ <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
31528
+ <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
31529
+ </svg>
31530
+ `;
31531
+ const CURSOR_SVG = `
31532
+ <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>
31533
+ `;
31534
+ const CARET_DOWN_SVG = `
31535
+ <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
31536
+ <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
31537
+ </svg>
31538
+ `;
31539
+
31501
31540
  //#endregion
31502
31541
  //#region src/components/side_panel/components/section/section.ts
31503
31542
  var Section = class extends _odoo_owl.Component {
@@ -31524,11 +31563,7 @@ stores.inject(MyMetaStore, storeInstance);
31524
31563
  cursor: pointer;
31525
31564
  border: 1px solid ${GRAY_300};
31526
31565
  background-position: 1px 1px;
31527
- background-image: url("data:image/svg+xml,${encodeURIComponent(`
31528
- <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
31529
- <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
31530
- </svg>
31531
- `)}");
31566
+ background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
31532
31567
  }
31533
31568
  `;
31534
31569
  var RoundColorPicker = class extends _odoo_owl.Component {
@@ -32789,11 +32824,6 @@ stores.inject(MyMetaStore, storeInstance);
32789
32824
 
32790
32825
  //#endregion
32791
32826
  //#region src/components/side_panel/components/checkbox/checkbox.ts
32792
- const CHECK_SVG = `
32793
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
32794
- <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
32795
- </svg>
32796
- `;
32797
32827
  const CHECKBOX_WIDTH = 14;
32798
32828
  css`
32799
32829
  label.o-checkbox {
@@ -45025,9 +45055,7 @@ stores.inject(MyMetaStore, storeInstance);
45025
45055
  //#region src/components/grid_overlay/grid_overlay.ts
45026
45056
  css`
45027
45057
  .o-paint-format-cursor {
45028
- cursor: url("data:image/svg+xml,${encodeURIComponent(`
45029
- <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>
45030
- `)}"), auto;
45058
+ cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
45031
45059
  }
45032
45060
  `;
45033
45061
  function useCellHovered(env, gridRef) {
@@ -45247,6 +45275,11 @@ stores.inject(MyMetaStore, storeInstance);
45247
45275
  });
45248
45276
  return icon?.onClick ? icon : void 0;
45249
45277
  }
45278
+ get isFooterVisible() {
45279
+ const { y } = this.env.model.getters.getMainViewportCoordinates();
45280
+ const { height } = this.env.model.getters.getSheetViewDimension();
45281
+ return !this.env.model.getters.isReadonly() && height - y > 46;
45282
+ }
45250
45283
  };
45251
45284
 
45252
45285
  //#endregion
@@ -48658,11 +48691,7 @@ stores.inject(MyMetaStore, storeInstance);
48658
48691
  border-radius: 8px;
48659
48692
 
48660
48693
  &:checked {
48661
- background: url("data:image/svg+xml,${encodeURIComponent(`
48662
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
48663
- <circle r="2" fill="#FFF"/>
48664
- </svg>
48665
- `)}");
48694
+ background: url("data:image/svg+xml,${encodeURIComponent(CIRCLE_SVG)}");
48666
48695
  background-color: ${ACTION_COLOR};
48667
48696
  border-color: ${ACTION_COLOR};
48668
48697
  }
@@ -51887,7 +51916,7 @@ stores.inject(MyMetaStore, storeInstance);
51887
51916
  }
51888
51917
  get specificRangeMatchesCount() {
51889
51918
  const range = this.searchOptions.specificRange;
51890
- if (!range) return "";
51919
+ if (!range || range.invalidSheetName || range.invalidXc) return "";
51891
51920
  const { sheetId, zone } = range;
51892
51921
  return _t("%(matches)s matches in range %(range)s of %(sheetName)s", {
51893
51922
  matches: this.store.specificRangeMatchesCount,
@@ -53391,7 +53420,13 @@ stores.inject(MyMetaStore, storeInstance);
53391
53420
  }
53392
53421
  onSelectionChanged(ranges) {
53393
53422
  this.state.rangeHasChanged = true;
53394
- this.state.range = ranges[0];
53423
+ if (ranges.length === 0) {
53424
+ this.state.range = void 0;
53425
+ return;
53426
+ }
53427
+ const sheetId = this.env.model.getters.getActiveSheetId();
53428
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
53429
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
53395
53430
  }
53396
53431
  onSelectionConfirmed() {
53397
53432
  if (this.state.range) {
@@ -59772,6 +59807,7 @@ stores.inject(MyMetaStore, storeInstance);
59772
59807
  return "Success";
59773
59808
  case "UPDATE_CAROUSEL":
59774
59809
  if (!this.carousels[cmd.sheetId]?.[cmd.figureId]) return "InvalidFigureId";
59810
+ for (const item of cmd.definition.items) if (item.type === "chart" && !this.getters.getChart(item.chartId)) return "ChartDoesNotExist";
59775
59811
  return "Success";
59776
59812
  }
59777
59813
  return "Success";
@@ -61366,14 +61402,16 @@ stores.inject(MyMetaStore, storeInstance);
61366
61402
  */
61367
61403
  getCellsDependingOn(ranges, visited = new RangeSet()) {
61368
61404
  visited = visited.copy();
61405
+ let initialRangesToRemove = visited.copy();
61369
61406
  const queue = Array.from(ranges).reverse();
61370
61407
  while (queue.length > 0) {
61371
61408
  const range = queue.pop();
61372
61409
  visited.add(range);
61373
61410
  const impactedRanges = this.rTree.search(range);
61374
61411
  queue.push(...impactedRanges.difference(visited));
61412
+ initialRangesToRemove = initialRangesToRemove.difference(impactedRanges);
61375
61413
  }
61376
- for (const range of ranges) visited.delete(range);
61414
+ for (const range of initialRangesToRemove) visited.delete(range);
61377
61415
  return visited;
61378
61416
  }
61379
61417
  };
@@ -66565,7 +66603,8 @@ stores.inject(MyMetaStore, storeInstance);
66565
66603
  static getters = [
66566
66604
  "getGeoJsonFeatures",
66567
66605
  "geoFeatureNameToId",
66568
- "getGeoChartAvailableRegions"
66606
+ "getGeoChartAvailableRegions",
66607
+ "loadUsedGeoJsonFeatures"
66569
66608
  ];
66570
66609
  geoJsonService;
66571
66610
  geoJsonCache = {};
@@ -66602,6 +66641,23 @@ stores.inject(MyMetaStore, storeInstance);
66602
66641
  }
66603
66642
  return this.geoJsonService.geoFeatureNameToId(region, featureName);
66604
66643
  }
66644
+ loadUsedGeoJsonFeatures() {
66645
+ const regions = this.getters.getSheetIds().flatMap((sheetId) => this.getters.getChartIds(sheetId).map((chartId) => {
66646
+ const definition = this.getters.getChartDefinition(chartId);
66647
+ return definition.type === "geo" ? definition.region || this.getters.getGeoChartAvailableRegions()[0]?.id : void 0;
66648
+ })).filter(isDefined);
66649
+ const uniqueRegions = Array.from(new Set(regions));
66650
+ if (uniqueRegions.length && !this.geoJsonService) {
66651
+ console.error("No geoJsonService provided to the model");
66652
+ return Promise.resolve();
66653
+ }
66654
+ for (const region of uniqueRegions) this.getGeoJsonFeatures(region);
66655
+ const promises = uniqueRegions.map((region) => {
66656
+ const cachedGeoJson = this.geoJsonCache[region];
66657
+ return cachedGeoJson instanceof Promise ? cachedGeoJson : Promise.resolve();
66658
+ });
66659
+ return Promise.all(promises).then(() => {});
66660
+ }
66605
66661
  convertToGeoJson(json) {
66606
66662
  if (!json) return null;
66607
66663
  if (json.type === "Topology") {
@@ -69616,7 +69672,7 @@ stores.inject(MyMetaStore, storeInstance);
69616
69672
  let height = lastRowEnd - this.offsetCorrectionY;
69617
69673
  if (this.canScrollVertically) {
69618
69674
  height = Math.max(height, this.viewportHeight);
69619
- if (lastRowEnd + 46 > height && !this.getters.isReadonly()) height += 46;
69675
+ if (lastRowEnd + 46 > height && !this.getters.isReadonly() && this.viewportHeight > 46) height += 46;
69620
69676
  }
69621
69677
  return {
69622
69678
  width,
@@ -74878,11 +74934,7 @@ stores.inject(MyMetaStore, storeInstance);
74878
74934
  appearance: none;
74879
74935
  -webkit-appearance: none;
74880
74936
  -moz-appearance: none;
74881
- background: transparent url("data:image/svg+xml,${encodeURIComponent(`
74882
- <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
74883
- <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
74884
- </svg>
74885
- `)}")
74937
+ background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
74886
74938
  no-repeat right center;
74887
74939
  text-overflow: ellipsis;
74888
74940
 
@@ -79517,8 +79569,8 @@ exports.stores = stores;
79517
79569
  exports.tokenColors = tokenColors;
79518
79570
  exports.tokenize = tokenize;
79519
79571
 
79520
- __info__.version = "19.0.48";
79521
- __info__.date = "2026-08-29T09:14:12.472Z";
79522
- __info__.hash = "0a6c168";
79572
+ __info__.version = "19.0.50";
79573
+ __info__.date = "2026-09-10T05:35:44.046Z";
79574
+ __info__.hash = "e499258";
79523
79575
 
79524
79576
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);