@odoo/o-spreadsheet 19.2.27 → 19.2.29

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.2.27
6
- * @date 2026-08-29T09:15:16.412Z
7
- * @hash 9e63c60
5
+ * @version 19.2.29
6
+ * @date 2026-09-10T05:38:17.282Z
7
+ * @hash a3d2956
8
8
  */
9
9
  :root {
10
10
  --os-gray-100: light-dark(#f9fafb, #1b1d26);
@@ -21,7 +21,7 @@
21
21
  --os-black: light-dark(#000000, #ffffff);
22
22
  --os-white-bg: light-dark(#ffffff, var(--os-gray-200));
23
23
 
24
- --os-default-font: "Roboto", "Arial";
24
+ --os-default-font: "Roboto", "Arial", "Liberation Sans";
25
25
  --os-default-font-size: 10px;
26
26
  --os-link-color: light-dark(#017e84, #02c7b5);
27
27
  --os-link-hover-color: light-dark(#01585c, #4ed8cb);
@@ -2647,6 +2647,9 @@
2647
2647
  position: absolute;
2648
2648
  cursor: pointer;
2649
2649
  }
2650
+ .o-grid.o-dashboard-grid {
2651
+ background: #ffffff;
2652
+ }
2650
2653
  }
2651
2654
 
2652
2655
  /* Originates from src/components/dashboard/clickable_cell_sort_icon/clickable_cell_sort_icon.css */
@@ -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.2.27
6
- * @date 2026-08-29T09:15:15.122Z
7
- * @hash 9e63c60
5
+ * @version 19.2.29
6
+ * @date 2026-09-10T05:38:15.721Z
7
+ * @hash a3d2956
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, whenReady, xml } from "@odoo/owl";
@@ -8339,16 +8339,16 @@ const chartShowValuesPlugin = {
8339
8339
  drawLineOrBarOrRadarChartValues(chart, options, ctx);
8340
8340
  break;
8341
8341
  case "bar":
8342
- options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
8342
+ options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
8343
8343
  break;
8344
8344
  case "pyramid":
8345
- drawHorizontalBarChartValues(chart, options, ctx);
8345
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true });
8346
8346
  break;
8347
8347
  case "calendar":
8348
8348
  drawBarChartValues(chart, options, ctx);
8349
8349
  break;
8350
8350
  case "funnel":
8351
- drawHorizontalBarChartValues(chart, options, ctx);
8351
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
8352
8352
  break;
8353
8353
  }
8354
8354
  ctx.restore();
@@ -8372,7 +8372,7 @@ function drawLineOrBarOrRadarChartValues(chart, options, ctx) {
8372
8372
  const point = dataset.data[i];
8373
8373
  const xPosition = point.x;
8374
8374
  let yPosition = 0;
8375
- if (chart.config.type === "line" || chart.config.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
8375
+ if (dataset.type === "line" || dataset.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
8376
8376
  else {
8377
8377
  const yZeroLine = yAxisScale.getPixelForValue(0);
8378
8378
  const distanceFromAxisOrigin = Math.abs(yZeroLine - point.y);
@@ -8418,7 +8418,7 @@ function drawBarChartValues(chart, options, ctx) {
8418
8418
  }
8419
8419
  }
8420
8420
  }
8421
- function drawHorizontalBarChartValues(chart, options, ctx) {
8421
+ function drawHorizontalBarChartValues(chart, options, ctx, args) {
8422
8422
  const textsPositions = {};
8423
8423
  for (const dataset of chart._metasets) {
8424
8424
  if (isTrendLineAxis(dataset.xAxisID)) return;
@@ -8433,7 +8433,7 @@ function drawHorizontalBarChartValues(chart, options, ctx) {
8433
8433
  const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
8434
8434
  const PADDING = 3;
8435
8435
  let xPosition;
8436
- if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
8436
+ if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
8437
8437
  else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
8438
8438
  if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
8439
8439
  for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
@@ -11262,7 +11262,7 @@ const RemoveDuplicateTerms = { Errors: {
11262
11262
  ["MoreThanOneRangeSelected"]: _t("Please select only one range of cells"),
11263
11263
  ["EmptySelectedRange"]: _t("Please select a range of cells containing values."),
11264
11264
  ["NoColumnsProvided"]: _t("Please select at latest one column to analyze."),
11265
- ["WillRemoveExistingMerge"]: _t("This operation is not possible due to a merge. Please remove the merges first than try again.")
11265
+ ["WillRemoveExistingMerge"]: _t("Cannot perform this action on merged cells. Unmerge the cells and try again.")
11266
11266
  } };
11267
11267
  const DVTerms = {
11268
11268
  DateIs: {
@@ -32335,9 +32335,10 @@ var Composer = class extends Component {
32335
32335
  compositionActive = false;
32336
32336
  spreadsheetRect = useSpreadsheetRect();
32337
32337
  lastHoveredTokenIndex = void 0;
32338
- debouncedHover = debounce((tokenIndex, hoveredRect) => {
32338
+ debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
32339
32339
  const selection = this.contentHelper.getCurrentSelection();
32340
- if (selection.start !== selection.end) return;
32340
+ const currentContent = this.props.composerStore.currentContent;
32341
+ if (selection.start !== selection.end || currentContent !== composerContent) return;
32341
32342
  const currentHoveredContext = this.props.composerStore.hoveredTokens;
32342
32343
  this.props.composerStore.hoverToken(tokenIndex);
32343
32344
  if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
@@ -32655,7 +32656,8 @@ var Composer = class extends Component {
32655
32656
  onTokenHover(tokenIndex, hoveredRect) {
32656
32657
  if (this.lastHoveredTokenIndex !== tokenIndex) {
32657
32658
  this.lastHoveredTokenIndex = tokenIndex;
32658
- this.debouncedHover(tokenIndex, hoveredRect);
32659
+ const composerContent = this.props.composerStore.currentContent;
32660
+ this.debouncedHover(tokenIndex, composerContent, hoveredRect);
32659
32661
  }
32660
32662
  }
32661
32663
  /**
@@ -33964,7 +33966,7 @@ var AbstractComposerStore = class extends SpreadsheetStore {
33964
33966
  col: range.zone.left,
33965
33967
  row: range.zone.top
33966
33968
  });
33967
- if (spreadZone) return this.getters.getRangeFromZone(sheetId, spreadZone);
33969
+ if (spreadZone) return this.getters.getRangeFromZone(range.sheetId, spreadZone);
33968
33970
  return range;
33969
33971
  }
33970
33972
  async updateAutoCompleteProvider() {
@@ -39707,43 +39709,6 @@ var CalendarChartConfigPanel = class extends GenericChartConfigPanel {
39707
39709
  onChange: this.onUpdateDataSetsHaveTitle.bind(this)
39708
39710
  }];
39709
39711
  }
39710
- getGroupByOptions() {
39711
- const sheetId = this.env.model.getters.getFigureSheetId(this.env.model.getters.getFigureIdFromChartId(this.props.chartId));
39712
- const dataSets = createDataSets(this.env.model.getters, this.props.definition.dataSets, sheetId, this.props.definition.dataSetsHaveTitle);
39713
- if (dataSets.length === 0) return [];
39714
- const labelRange = createValidRange(this.env.model.getters, sheetId, this.props.definition.labelRange);
39715
- const labels = getBarChartData(this.props.definition, dataSets, labelRange, this.env.model.getters).labels.filter((l) => isDateTime(l, DEFAULT_LOCALE));
39716
- if (labels.length === 0) return [];
39717
- const dates = labels.map((label) => toJsDate(label, this.env.model.getters.getLocale()));
39718
- const uniqueYears = /* @__PURE__ */ new Set();
39719
- const uniqueMonths = /* @__PURE__ */ new Set();
39720
- const uniqueDays = /* @__PURE__ */ new Set();
39721
- const uniqueHours = /* @__PURE__ */ new Set();
39722
- const uniqueMinutes = /* @__PURE__ */ new Set();
39723
- const uniqueSeconds = /* @__PURE__ */ new Set();
39724
- for (const date of dates) {
39725
- uniqueYears.add(date.getFullYear());
39726
- uniqueMonths.add(date.getMonth());
39727
- uniqueDays.add(date.getDate());
39728
- uniqueHours.add(date.getHours());
39729
- uniqueMinutes.add(date.getMinutes());
39730
- uniqueSeconds.add(date.getSeconds());
39731
- }
39732
- return this.groupByChoices.filter((groupBy) => {
39733
- switch (groupBy.value) {
39734
- case "year": return uniqueYears.size > 1;
39735
- case "quarter_number":
39736
- case "month_number": return uniqueMonths.size > 1;
39737
- case "iso_week_number":
39738
- case "day_of_month":
39739
- case "day_of_week": return uniqueDays.size > 1;
39740
- case "hour_number": return uniqueHours.size > 1;
39741
- case "minute_number": return uniqueMinutes.size > 1;
39742
- case "second_number": return uniqueSeconds.size > 1;
39743
- default: return false;
39744
- }
39745
- });
39746
- }
39747
39712
  getGroupByType(currentAxis) {
39748
39713
  return (currentAxis === "horizontal" ? this.props.definition.horizontalGroupBy : this.props.definition.verticalGroupBy) || "year";
39749
39714
  }
@@ -42334,7 +42299,7 @@ var FindAndReplacePanel = class extends Component {
42334
42299
  }
42335
42300
  get specificRangeMatchesCount() {
42336
42301
  const range = this.searchOptions.specificRange;
42337
- if (!range) return "";
42302
+ if (!range || range.invalidSheetName || range.invalidXc) return "";
42338
42303
  const { sheetId, zone } = range;
42339
42304
  return _t("%(matches)s matches in range %(range)s of %(sheetName)s", {
42340
42305
  matches: this.store.specificRangeMatchesCount,
@@ -46228,7 +46193,13 @@ var PivotSpreadsheetSidePanel = class extends Component {
46228
46193
  }
46229
46194
  onSelectionChanged(ranges) {
46230
46195
  this.state.rangeHasChanged = true;
46231
- this.state.range = ranges[0];
46196
+ if (ranges.length === 0) {
46197
+ this.state.range = void 0;
46198
+ return;
46199
+ }
46200
+ const sheetId = this.env.model.getters.getActiveSheetId();
46201
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
46202
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
46232
46203
  }
46233
46204
  onSelectionConfirmed() {
46234
46205
  if (this.state.range) {
@@ -52192,6 +52163,11 @@ var GridOverlay = class extends Component {
52192
52163
  });
52193
52164
  return icon?.onClick ? icon : void 0;
52194
52165
  }
52166
+ get isFooterVisible() {
52167
+ const { y } = this.env.model.getters.getMainViewportCoordinates();
52168
+ const { height } = this.env.model.getters.getSheetViewDimension();
52169
+ return !this.env.model.getters.isReadonly() && height - y > 46;
52170
+ }
52195
52171
  };
52196
52172
 
52197
52173
  //#endregion
@@ -55773,6 +55749,7 @@ var CarouselPlugin = class extends CorePlugin {
55773
55749
  return "Success";
55774
55750
  case "UPDATE_CAROUSEL":
55775
55751
  if (!this.carousels[cmd.sheetId]?.[cmd.figureId]) return "InvalidFigureId";
55752
+ for (const item of cmd.definition.items) if (item.type === "chart" && !this.getters.getChart(item.chartId)) return "ChartDoesNotExist";
55776
55753
  return "Success";
55777
55754
  }
55778
55755
  return "Success";
@@ -60985,14 +60962,16 @@ var FormulaDependencyGraph = class {
60985
60962
  */
60986
60963
  getCellsDependingOn(ranges, visited = new RangeSet()) {
60987
60964
  visited = visited.copy();
60965
+ let initialRangesToRemove = visited.copy();
60988
60966
  const queue = Array.from(ranges).reverse();
60989
60967
  while (queue.length > 0) {
60990
60968
  const range = queue.pop();
60991
60969
  visited.add(range);
60992
60970
  const impactedRanges = this.rTree.search(range);
60993
60971
  queue.push(...impactedRanges.difference(visited));
60972
+ initialRangesToRemove = initialRangesToRemove.difference(impactedRanges);
60994
60973
  }
60995
- for (const range of ranges) visited.delete(range);
60974
+ for (const range of initialRangesToRemove) visited.delete(range);
60996
60975
  return visited;
60997
60976
  }
60998
60977
  };
@@ -66915,7 +66894,8 @@ var GeoFeaturePlugin = class extends UIPlugin {
66915
66894
  static getters = [
66916
66895
  "getGeoJsonFeatures",
66917
66896
  "geoFeatureNameToId",
66918
- "getGeoChartAvailableRegions"
66897
+ "getGeoChartAvailableRegions",
66898
+ "loadUsedGeoJsonFeatures"
66919
66899
  ];
66920
66900
  geoJsonService;
66921
66901
  geoJsonCache = {};
@@ -66952,6 +66932,23 @@ var GeoFeaturePlugin = class extends UIPlugin {
66952
66932
  }
66953
66933
  return this.geoJsonService.geoFeatureNameToId(region, featureName);
66954
66934
  }
66935
+ loadUsedGeoJsonFeatures() {
66936
+ const regions = this.getters.getSheetIds().flatMap((sheetId) => this.getters.getChartIds(sheetId).map((chartId) => {
66937
+ const definition = this.getters.getChartDefinition(chartId);
66938
+ return definition.type === "geo" ? definition.region || this.getters.getGeoChartAvailableRegions()[0]?.id : void 0;
66939
+ })).filter(isDefined);
66940
+ const uniqueRegions = Array.from(new Set(regions));
66941
+ if (uniqueRegions.length && !this.geoJsonService) {
66942
+ console.error("No geoJsonService provided to the model");
66943
+ return Promise.resolve();
66944
+ }
66945
+ for (const region of uniqueRegions) this.getGeoJsonFeatures(region);
66946
+ const promises = uniqueRegions.map((region) => {
66947
+ const cachedGeoJson = this.geoJsonCache[region];
66948
+ return cachedGeoJson instanceof Promise ? cachedGeoJson : Promise.resolve();
66949
+ });
66950
+ return Promise.all(promises).then(() => {});
66951
+ }
66955
66952
  convertToGeoJson(json) {
66956
66953
  if (!json) return null;
66957
66954
  if (json.type === "Topology") {
@@ -69935,7 +69932,7 @@ var InternalViewport = class {
69935
69932
  let height = lastRowEnd - this.offsetCorrectionY;
69936
69933
  if (this.canScrollVertically) {
69937
69934
  height = Math.max(height, this.viewportHeight);
69938
- if (lastRowEnd + 46 > height && !this.getters.isReadonly()) height += 46;
69935
+ if (lastRowEnd + 46 > height && !this.getters.isReadonly() && this.viewportHeight > 46) height += 46;
69939
69936
  }
69940
69937
  return {
69941
69938
  width,
@@ -81825,6 +81822,6 @@ const chartHelpers = {
81825
81822
  //#endregion
81826
81823
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, ClientDisconnectedError, CommandResult, CompiledFormula, CorePlugin, CoreViewPlugin, DEFAULT_LOCALE, DEFAULT_LOCALES, DispatchResult, EvaluationError, LocalTransportService, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, canExecuteInReadonly, categories, chartHelpers, components, constants, convertAstNodes, coreTypes, createAutocompleteArgumentsProvider, findCellInNewZone, functionCache, getCaretDownSvg, getCaretUpSvg, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, isCoreCommand, isSheetDependent, iterateAstNodes, links, load, lockedSheetAllowedCommands, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
81827
81824
 
81828
- __info__.version = "19.2.27";
81829
- __info__.date = "2026-08-29T09:15:15.122Z";
81830
- __info__.hash = "9e63c60";
81825
+ __info__.version = "19.2.29";
81826
+ __info__.date = "2026-09-10T05:38:15.721Z";
81827
+ __info__.hash = "a3d2956";
@@ -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.2.27
6
- * @date 2026-08-29T09:15:15.122Z
7
- * @hash 9e63c60
5
+ * @version 19.2.29
6
+ * @date 2026-09-10T05:38:15.721Z
7
+ * @hash a3d2956
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -8341,16 +8341,16 @@ stores.inject(MyMetaStore, storeInstance);
8341
8341
  drawLineOrBarOrRadarChartValues(chart, options, ctx);
8342
8342
  break;
8343
8343
  case "bar":
8344
- options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
8344
+ options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
8345
8345
  break;
8346
8346
  case "pyramid":
8347
- drawHorizontalBarChartValues(chart, options, ctx);
8347
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true });
8348
8348
  break;
8349
8349
  case "calendar":
8350
8350
  drawBarChartValues(chart, options, ctx);
8351
8351
  break;
8352
8352
  case "funnel":
8353
- drawHorizontalBarChartValues(chart, options, ctx);
8353
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
8354
8354
  break;
8355
8355
  }
8356
8356
  ctx.restore();
@@ -8374,7 +8374,7 @@ stores.inject(MyMetaStore, storeInstance);
8374
8374
  const point = dataset.data[i];
8375
8375
  const xPosition = point.x;
8376
8376
  let yPosition = 0;
8377
- if (chart.config.type === "line" || chart.config.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
8377
+ if (dataset.type === "line" || dataset.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
8378
8378
  else {
8379
8379
  const yZeroLine = yAxisScale.getPixelForValue(0);
8380
8380
  const distanceFromAxisOrigin = Math.abs(yZeroLine - point.y);
@@ -8420,7 +8420,7 @@ stores.inject(MyMetaStore, storeInstance);
8420
8420
  }
8421
8421
  }
8422
8422
  }
8423
- function drawHorizontalBarChartValues(chart, options, ctx) {
8423
+ function drawHorizontalBarChartValues(chart, options, ctx, args) {
8424
8424
  const textsPositions = {};
8425
8425
  for (const dataset of chart._metasets) {
8426
8426
  if (isTrendLineAxis(dataset.xAxisID)) return;
@@ -8435,7 +8435,7 @@ stores.inject(MyMetaStore, storeInstance);
8435
8435
  const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
8436
8436
  const PADDING = 3;
8437
8437
  let xPosition;
8438
- if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
8438
+ if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
8439
8439
  else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
8440
8440
  if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
8441
8441
  for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
@@ -11264,7 +11264,7 @@ stores.inject(MyMetaStore, storeInstance);
11264
11264
  ["MoreThanOneRangeSelected"]: _t("Please select only one range of cells"),
11265
11265
  ["EmptySelectedRange"]: _t("Please select a range of cells containing values."),
11266
11266
  ["NoColumnsProvided"]: _t("Please select at latest one column to analyze."),
11267
- ["WillRemoveExistingMerge"]: _t("This operation is not possible due to a merge. Please remove the merges first than try again.")
11267
+ ["WillRemoveExistingMerge"]: _t("Cannot perform this action on merged cells. Unmerge the cells and try again.")
11268
11268
  } };
11269
11269
  const DVTerms = {
11270
11270
  DateIs: {
@@ -32337,9 +32337,10 @@ stores.inject(MyMetaStore, storeInstance);
32337
32337
  compositionActive = false;
32338
32338
  spreadsheetRect = useSpreadsheetRect();
32339
32339
  lastHoveredTokenIndex = void 0;
32340
- debouncedHover = debounce((tokenIndex, hoveredRect) => {
32340
+ debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
32341
32341
  const selection = this.contentHelper.getCurrentSelection();
32342
- if (selection.start !== selection.end) return;
32342
+ const currentContent = this.props.composerStore.currentContent;
32343
+ if (selection.start !== selection.end || currentContent !== composerContent) return;
32343
32344
  const currentHoveredContext = this.props.composerStore.hoveredTokens;
32344
32345
  this.props.composerStore.hoverToken(tokenIndex);
32345
32346
  if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
@@ -32657,7 +32658,8 @@ stores.inject(MyMetaStore, storeInstance);
32657
32658
  onTokenHover(tokenIndex, hoveredRect) {
32658
32659
  if (this.lastHoveredTokenIndex !== tokenIndex) {
32659
32660
  this.lastHoveredTokenIndex = tokenIndex;
32660
- this.debouncedHover(tokenIndex, hoveredRect);
32661
+ const composerContent = this.props.composerStore.currentContent;
32662
+ this.debouncedHover(tokenIndex, composerContent, hoveredRect);
32661
32663
  }
32662
32664
  }
32663
32665
  /**
@@ -33966,7 +33968,7 @@ stores.inject(MyMetaStore, storeInstance);
33966
33968
  col: range.zone.left,
33967
33969
  row: range.zone.top
33968
33970
  });
33969
- if (spreadZone) return this.getters.getRangeFromZone(sheetId, spreadZone);
33971
+ if (spreadZone) return this.getters.getRangeFromZone(range.sheetId, spreadZone);
33970
33972
  return range;
33971
33973
  }
33972
33974
  async updateAutoCompleteProvider() {
@@ -39709,43 +39711,6 @@ stores.inject(MyMetaStore, storeInstance);
39709
39711
  onChange: this.onUpdateDataSetsHaveTitle.bind(this)
39710
39712
  }];
39711
39713
  }
39712
- getGroupByOptions() {
39713
- const sheetId = this.env.model.getters.getFigureSheetId(this.env.model.getters.getFigureIdFromChartId(this.props.chartId));
39714
- const dataSets = createDataSets(this.env.model.getters, this.props.definition.dataSets, sheetId, this.props.definition.dataSetsHaveTitle);
39715
- if (dataSets.length === 0) return [];
39716
- const labelRange = createValidRange(this.env.model.getters, sheetId, this.props.definition.labelRange);
39717
- const labels = getBarChartData(this.props.definition, dataSets, labelRange, this.env.model.getters).labels.filter((l) => isDateTime(l, DEFAULT_LOCALE));
39718
- if (labels.length === 0) return [];
39719
- const dates = labels.map((label) => toJsDate(label, this.env.model.getters.getLocale()));
39720
- const uniqueYears = /* @__PURE__ */ new Set();
39721
- const uniqueMonths = /* @__PURE__ */ new Set();
39722
- const uniqueDays = /* @__PURE__ */ new Set();
39723
- const uniqueHours = /* @__PURE__ */ new Set();
39724
- const uniqueMinutes = /* @__PURE__ */ new Set();
39725
- const uniqueSeconds = /* @__PURE__ */ new Set();
39726
- for (const date of dates) {
39727
- uniqueYears.add(date.getFullYear());
39728
- uniqueMonths.add(date.getMonth());
39729
- uniqueDays.add(date.getDate());
39730
- uniqueHours.add(date.getHours());
39731
- uniqueMinutes.add(date.getMinutes());
39732
- uniqueSeconds.add(date.getSeconds());
39733
- }
39734
- return this.groupByChoices.filter((groupBy) => {
39735
- switch (groupBy.value) {
39736
- case "year": return uniqueYears.size > 1;
39737
- case "quarter_number":
39738
- case "month_number": return uniqueMonths.size > 1;
39739
- case "iso_week_number":
39740
- case "day_of_month":
39741
- case "day_of_week": return uniqueDays.size > 1;
39742
- case "hour_number": return uniqueHours.size > 1;
39743
- case "minute_number": return uniqueMinutes.size > 1;
39744
- case "second_number": return uniqueSeconds.size > 1;
39745
- default: return false;
39746
- }
39747
- });
39748
- }
39749
39714
  getGroupByType(currentAxis) {
39750
39715
  return (currentAxis === "horizontal" ? this.props.definition.horizontalGroupBy : this.props.definition.verticalGroupBy) || "year";
39751
39716
  }
@@ -42336,7 +42301,7 @@ stores.inject(MyMetaStore, storeInstance);
42336
42301
  }
42337
42302
  get specificRangeMatchesCount() {
42338
42303
  const range = this.searchOptions.specificRange;
42339
- if (!range) return "";
42304
+ if (!range || range.invalidSheetName || range.invalidXc) return "";
42340
42305
  const { sheetId, zone } = range;
42341
42306
  return _t("%(matches)s matches in range %(range)s of %(sheetName)s", {
42342
42307
  matches: this.store.specificRangeMatchesCount,
@@ -46230,7 +46195,13 @@ stores.inject(MyMetaStore, storeInstance);
46230
46195
  }
46231
46196
  onSelectionChanged(ranges) {
46232
46197
  this.state.rangeHasChanged = true;
46233
- this.state.range = ranges[0];
46198
+ if (ranges.length === 0) {
46199
+ this.state.range = void 0;
46200
+ return;
46201
+ }
46202
+ const sheetId = this.env.model.getters.getActiveSheetId();
46203
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
46204
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
46234
46205
  }
46235
46206
  onSelectionConfirmed() {
46236
46207
  if (this.state.range) {
@@ -52194,6 +52165,11 @@ stores.inject(MyMetaStore, storeInstance);
52194
52165
  });
52195
52166
  return icon?.onClick ? icon : void 0;
52196
52167
  }
52168
+ get isFooterVisible() {
52169
+ const { y } = this.env.model.getters.getMainViewportCoordinates();
52170
+ const { height } = this.env.model.getters.getSheetViewDimension();
52171
+ return !this.env.model.getters.isReadonly() && height - y > 46;
52172
+ }
52197
52173
  };
52198
52174
 
52199
52175
  //#endregion
@@ -55775,6 +55751,7 @@ stores.inject(MyMetaStore, storeInstance);
55775
55751
  return "Success";
55776
55752
  case "UPDATE_CAROUSEL":
55777
55753
  if (!this.carousels[cmd.sheetId]?.[cmd.figureId]) return "InvalidFigureId";
55754
+ for (const item of cmd.definition.items) if (item.type === "chart" && !this.getters.getChart(item.chartId)) return "ChartDoesNotExist";
55778
55755
  return "Success";
55779
55756
  }
55780
55757
  return "Success";
@@ -60987,14 +60964,16 @@ stores.inject(MyMetaStore, storeInstance);
60987
60964
  */
60988
60965
  getCellsDependingOn(ranges, visited = new RangeSet()) {
60989
60966
  visited = visited.copy();
60967
+ let initialRangesToRemove = visited.copy();
60990
60968
  const queue = Array.from(ranges).reverse();
60991
60969
  while (queue.length > 0) {
60992
60970
  const range = queue.pop();
60993
60971
  visited.add(range);
60994
60972
  const impactedRanges = this.rTree.search(range);
60995
60973
  queue.push(...impactedRanges.difference(visited));
60974
+ initialRangesToRemove = initialRangesToRemove.difference(impactedRanges);
60996
60975
  }
60997
- for (const range of ranges) visited.delete(range);
60976
+ for (const range of initialRangesToRemove) visited.delete(range);
60998
60977
  return visited;
60999
60978
  }
61000
60979
  };
@@ -66917,7 +66896,8 @@ stores.inject(MyMetaStore, storeInstance);
66917
66896
  static getters = [
66918
66897
  "getGeoJsonFeatures",
66919
66898
  "geoFeatureNameToId",
66920
- "getGeoChartAvailableRegions"
66899
+ "getGeoChartAvailableRegions",
66900
+ "loadUsedGeoJsonFeatures"
66921
66901
  ];
66922
66902
  geoJsonService;
66923
66903
  geoJsonCache = {};
@@ -66954,6 +66934,23 @@ stores.inject(MyMetaStore, storeInstance);
66954
66934
  }
66955
66935
  return this.geoJsonService.geoFeatureNameToId(region, featureName);
66956
66936
  }
66937
+ loadUsedGeoJsonFeatures() {
66938
+ const regions = this.getters.getSheetIds().flatMap((sheetId) => this.getters.getChartIds(sheetId).map((chartId) => {
66939
+ const definition = this.getters.getChartDefinition(chartId);
66940
+ return definition.type === "geo" ? definition.region || this.getters.getGeoChartAvailableRegions()[0]?.id : void 0;
66941
+ })).filter(isDefined);
66942
+ const uniqueRegions = Array.from(new Set(regions));
66943
+ if (uniqueRegions.length && !this.geoJsonService) {
66944
+ console.error("No geoJsonService provided to the model");
66945
+ return Promise.resolve();
66946
+ }
66947
+ for (const region of uniqueRegions) this.getGeoJsonFeatures(region);
66948
+ const promises = uniqueRegions.map((region) => {
66949
+ const cachedGeoJson = this.geoJsonCache[region];
66950
+ return cachedGeoJson instanceof Promise ? cachedGeoJson : Promise.resolve();
66951
+ });
66952
+ return Promise.all(promises).then(() => {});
66953
+ }
66957
66954
  convertToGeoJson(json) {
66958
66955
  if (!json) return null;
66959
66956
  if (json.type === "Topology") {
@@ -69937,7 +69934,7 @@ stores.inject(MyMetaStore, storeInstance);
69937
69934
  let height = lastRowEnd - this.offsetCorrectionY;
69938
69935
  if (this.canScrollVertically) {
69939
69936
  height = Math.max(height, this.viewportHeight);
69940
- if (lastRowEnd + 46 > height && !this.getters.isReadonly()) height += 46;
69937
+ if (lastRowEnd + 46 > height && !this.getters.isReadonly() && this.viewportHeight > 46) height += 46;
69941
69938
  }
69942
69939
  return {
69943
69940
  width,
@@ -81885,8 +81882,8 @@ exports.stores = stores;
81885
81882
  exports.tokenColors = tokenColors;
81886
81883
  exports.tokenize = tokenize;
81887
81884
 
81888
- __info__.version = "19.2.27";
81889
- __info__.date = "2026-08-29T09:15:15.122Z";
81890
- __info__.hash = "9e63c60";
81885
+ __info__.version = "19.2.29";
81886
+ __info__.date = "2026-09-10T05:38:15.721Z";
81887
+ __info__.hash = "a3d2956";
81891
81888
 
81892
81889
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);