@odoo/o-spreadsheet 19.1.33 → 19.1.35

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.1.33
6
- * @date 2026-08-29T09:14:50.804Z
7
- * @hash 5c5b7a2
5
+ * @version 19.1.35
6
+ * @date 2026-09-10T05:36:17.404Z
7
+ * @hash 619eeac
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);
@@ -2582,6 +2582,9 @@
2582
2582
  position: absolute;
2583
2583
  cursor: pointer;
2584
2584
  }
2585
+ .o-grid.o-dashboard-grid {
2586
+ background: #ffffff;
2587
+ }
2585
2588
  }
2586
2589
 
2587
2590
  /* 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.1.33
6
- * @date 2026-08-29T09:14:49.301Z
7
- * @hash 5c5b7a2
5
+ * @version 19.1.35
6
+ * @date 2026-09-10T05:36:15.885Z
7
+ * @hash 619eeac
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";
@@ -8263,16 +8263,16 @@ const chartShowValuesPlugin = {
8263
8263
  drawLineOrBarOrRadarChartValues(chart, options, ctx);
8264
8264
  break;
8265
8265
  case "bar":
8266
- options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
8266
+ options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
8267
8267
  break;
8268
8268
  case "pyramid":
8269
- drawHorizontalBarChartValues(chart, options, ctx);
8269
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true });
8270
8270
  break;
8271
8271
  case "calendar":
8272
8272
  drawBarChartValues(chart, options, ctx);
8273
8273
  break;
8274
8274
  case "funnel":
8275
- drawHorizontalBarChartValues(chart, options, ctx);
8275
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
8276
8276
  break;
8277
8277
  }
8278
8278
  ctx.restore();
@@ -8296,7 +8296,7 @@ function drawLineOrBarOrRadarChartValues(chart, options, ctx) {
8296
8296
  const point = dataset.data[i];
8297
8297
  const xPosition = point.x;
8298
8298
  let yPosition = 0;
8299
- if (chart.config.type === "line" || chart.config.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
8299
+ if (dataset.type === "line" || dataset.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
8300
8300
  else {
8301
8301
  const yZeroLine = yAxisScale.getPixelForValue(0);
8302
8302
  const distanceFromAxisOrigin = Math.abs(yZeroLine - point.y);
@@ -8342,7 +8342,7 @@ function drawBarChartValues(chart, options, ctx) {
8342
8342
  }
8343
8343
  }
8344
8344
  }
8345
- function drawHorizontalBarChartValues(chart, options, ctx) {
8345
+ function drawHorizontalBarChartValues(chart, options, ctx, args) {
8346
8346
  const textsPositions = {};
8347
8347
  for (const dataset of chart._metasets) {
8348
8348
  if (isTrendLineAxis(dataset.xAxisID)) return;
@@ -8357,7 +8357,7 @@ function drawHorizontalBarChartValues(chart, options, ctx) {
8357
8357
  const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
8358
8358
  const PADDING = 3;
8359
8359
  let xPosition;
8360
- if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
8360
+ if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
8361
8361
  else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
8362
8362
  if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
8363
8363
  for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
@@ -11186,7 +11186,7 @@ const RemoveDuplicateTerms = { Errors: {
11186
11186
  ["MoreThanOneRangeSelected"]: _t("Please select only one range of cells"),
11187
11187
  ["EmptyTarget"]: _t("Please select a range of cells containing values."),
11188
11188
  ["NoColumnsProvided"]: _t("Please select at latest one column to analyze."),
11189
- ["WillRemoveExistingMerge"]: _t("This operation is not possible due to a merge. Please remove the merges first than try again.")
11189
+ ["WillRemoveExistingMerge"]: _t("Cannot perform this action on merged cells. Unmerge the cells and try again.")
11190
11190
  } };
11191
11191
  const DVTerms = {
11192
11192
  DateIs: {
@@ -26874,9 +26874,10 @@ var Composer = class extends Component {
26874
26874
  compositionActive = false;
26875
26875
  spreadsheetRect = useSpreadsheetRect();
26876
26876
  lastHoveredTokenIndex = void 0;
26877
- debouncedHover = debounce((tokenIndex, hoveredRect) => {
26877
+ debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
26878
26878
  const selection = this.contentHelper.getCurrentSelection();
26879
- if (selection.start !== selection.end) return;
26879
+ const currentContent = this.props.composerStore.currentContent;
26880
+ if (selection.start !== selection.end || currentContent !== composerContent) return;
26880
26881
  const currentHoveredContext = this.props.composerStore.hoveredTokens;
26881
26882
  this.props.composerStore.hoverToken(tokenIndex);
26882
26883
  if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
@@ -27194,7 +27195,8 @@ var Composer = class extends Component {
27194
27195
  onTokenHover(tokenIndex, hoveredRect) {
27195
27196
  if (this.lastHoveredTokenIndex !== tokenIndex) {
27196
27197
  this.lastHoveredTokenIndex = tokenIndex;
27197
- this.debouncedHover(tokenIndex, hoveredRect);
27198
+ const composerContent = this.props.composerStore.currentContent;
27199
+ this.debouncedHover(tokenIndex, composerContent, hoveredRect);
27198
27200
  }
27199
27201
  }
27200
27202
  /**
@@ -42780,6 +42782,11 @@ var GridOverlay = class extends Component {
42780
42782
  });
42781
42783
  return icon?.onClick ? icon : void 0;
42782
42784
  }
42785
+ get isFooterVisible() {
42786
+ const { y } = this.env.model.getters.getMainViewportCoordinates();
42787
+ const { height } = this.env.model.getters.getSheetViewDimension();
42788
+ return !this.env.model.getters.isReadonly() && height - y > 46;
42789
+ }
42783
42790
  };
42784
42791
 
42785
42792
  //#endregion
@@ -46372,43 +46379,6 @@ var CalendarChartConfigPanel = class extends GenericChartConfigPanel {
46372
46379
  onChange: this.onUpdateDataSetsHaveTitle.bind(this)
46373
46380
  }];
46374
46381
  }
46375
- getGroupByOptions() {
46376
- const sheetId = this.env.model.getters.getFigureSheetId(this.env.model.getters.getFigureIdFromChartId(this.props.chartId));
46377
- const dataSets = createDataSets(this.env.model.getters, this.props.definition.dataSets, sheetId, this.props.definition.dataSetsHaveTitle);
46378
- if (dataSets.length === 0) return [];
46379
- const labelRange = createValidRange(this.env.model.getters, sheetId, this.props.definition.labelRange);
46380
- const labels = getBarChartData(this.props.definition, dataSets, labelRange, this.env.model.getters).labels.filter((l) => isDateTime(l, DEFAULT_LOCALE));
46381
- if (labels.length === 0) return [];
46382
- const dates = labels.map((label) => toJsDate(label, this.env.model.getters.getLocale()));
46383
- const uniqueYears = /* @__PURE__ */ new Set();
46384
- const uniqueMonths = /* @__PURE__ */ new Set();
46385
- const uniqueDays = /* @__PURE__ */ new Set();
46386
- const uniqueHours = /* @__PURE__ */ new Set();
46387
- const uniqueMinutes = /* @__PURE__ */ new Set();
46388
- const uniqueSeconds = /* @__PURE__ */ new Set();
46389
- for (const date of dates) {
46390
- uniqueYears.add(date.getFullYear());
46391
- uniqueMonths.add(date.getMonth());
46392
- uniqueDays.add(date.getDate());
46393
- uniqueHours.add(date.getHours());
46394
- uniqueMinutes.add(date.getMinutes());
46395
- uniqueSeconds.add(date.getSeconds());
46396
- }
46397
- return this.groupByChoices.filter((groupBy) => {
46398
- switch (groupBy.value) {
46399
- case "year": return uniqueYears.size > 1;
46400
- case "quarter_number":
46401
- case "month_number": return uniqueMonths.size > 1;
46402
- case "iso_week_number":
46403
- case "day_of_month":
46404
- case "day_of_week": return uniqueDays.size > 1;
46405
- case "hour_number": return uniqueHours.size > 1;
46406
- case "minute_number": return uniqueMinutes.size > 1;
46407
- case "second_number": return uniqueSeconds.size > 1;
46408
- default: return false;
46409
- }
46410
- });
46411
- }
46412
46382
  getGroupByType(currentAxis) {
46413
46383
  return (currentAxis === "horizontal" ? this.props.definition.horizontalGroupBy : this.props.definition.verticalGroupBy) || "year";
46414
46384
  }
@@ -48899,7 +48869,7 @@ var FindAndReplacePanel = class extends Component {
48899
48869
  }
48900
48870
  get specificRangeMatchesCount() {
48901
48871
  const range = this.searchOptions.specificRange;
48902
- if (!range) return "";
48872
+ if (!range || range.invalidSheetName || range.invalidXc) return "";
48903
48873
  const { sheetId, zone } = range;
48904
48874
  return _t("%(matches)s matches in range %(range)s of %(sheetName)s", {
48905
48875
  matches: this.store.specificRangeMatchesCount,
@@ -50994,7 +50964,13 @@ var PivotSpreadsheetSidePanel = class extends Component {
50994
50964
  }
50995
50965
  onSelectionChanged(ranges) {
50996
50966
  this.state.rangeHasChanged = true;
50997
- this.state.range = ranges[0];
50967
+ if (ranges.length === 0) {
50968
+ this.state.range = void 0;
50969
+ return;
50970
+ }
50971
+ const sheetId = this.env.model.getters.getActiveSheetId();
50972
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
50973
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
50998
50974
  }
50999
50975
  onSelectionConfirmed() {
51000
50976
  if (this.state.range) {
@@ -53666,6 +53642,7 @@ var CarouselPlugin = class extends CorePlugin {
53666
53642
  return "Success";
53667
53643
  case "UPDATE_CAROUSEL":
53668
53644
  if (!this.carousels[cmd.sheetId]?.[cmd.figureId]) return "InvalidFigureId";
53645
+ for (const item of cmd.definition.items) if (item.type === "chart" && !this.getters.getChart(item.chartId)) return "ChartDoesNotExist";
53669
53646
  return "Success";
53670
53647
  }
53671
53648
  return "Success";
@@ -58756,14 +58733,16 @@ var FormulaDependencyGraph = class {
58756
58733
  */
58757
58734
  getCellsDependingOn(ranges, visited = new RangeSet()) {
58758
58735
  visited = visited.copy();
58736
+ let initialRangesToRemove = visited.copy();
58759
58737
  const queue = Array.from(ranges).reverse();
58760
58738
  while (queue.length > 0) {
58761
58739
  const range = queue.pop();
58762
58740
  visited.add(range);
58763
58741
  const impactedRanges = this.rTree.search(range);
58764
58742
  queue.push(...impactedRanges.difference(visited));
58743
+ initialRangesToRemove = initialRangesToRemove.difference(impactedRanges);
58765
58744
  }
58766
- for (const range of ranges) visited.delete(range);
58745
+ for (const range of initialRangesToRemove) visited.delete(range);
58767
58746
  return visited;
58768
58747
  }
58769
58748
  };
@@ -64502,7 +64481,8 @@ var GeoFeaturePlugin = class extends UIPlugin {
64502
64481
  static getters = [
64503
64482
  "getGeoJsonFeatures",
64504
64483
  "geoFeatureNameToId",
64505
- "getGeoChartAvailableRegions"
64484
+ "getGeoChartAvailableRegions",
64485
+ "loadUsedGeoJsonFeatures"
64506
64486
  ];
64507
64487
  geoJsonService;
64508
64488
  geoJsonCache = {};
@@ -64539,6 +64519,23 @@ var GeoFeaturePlugin = class extends UIPlugin {
64539
64519
  }
64540
64520
  return this.geoJsonService.geoFeatureNameToId(region, featureName);
64541
64521
  }
64522
+ loadUsedGeoJsonFeatures() {
64523
+ const regions = this.getters.getSheetIds().flatMap((sheetId) => this.getters.getChartIds(sheetId).map((chartId) => {
64524
+ const definition = this.getters.getChartDefinition(chartId);
64525
+ return definition.type === "geo" ? definition.region || this.getters.getGeoChartAvailableRegions()[0]?.id : void 0;
64526
+ })).filter(isDefined);
64527
+ const uniqueRegions = Array.from(new Set(regions));
64528
+ if (uniqueRegions.length && !this.geoJsonService) {
64529
+ console.error("No geoJsonService provided to the model");
64530
+ return Promise.resolve();
64531
+ }
64532
+ for (const region of uniqueRegions) this.getGeoJsonFeatures(region);
64533
+ const promises = uniqueRegions.map((region) => {
64534
+ const cachedGeoJson = this.geoJsonCache[region];
64535
+ return cachedGeoJson instanceof Promise ? cachedGeoJson : Promise.resolve();
64536
+ });
64537
+ return Promise.all(promises).then(() => {});
64538
+ }
64542
64539
  convertToGeoJson(json) {
64543
64540
  if (!json) return null;
64544
64541
  if (json.type === "Topology") {
@@ -67436,7 +67433,7 @@ var InternalViewport = class {
67436
67433
  let height = lastRowEnd - this.offsetCorrectionY;
67437
67434
  if (this.canScrollVertically) {
67438
67435
  height = Math.max(height, this.viewportHeight);
67439
- if (lastRowEnd + 46 > height && !this.getters.isReadonly()) height += 46;
67436
+ if (lastRowEnd + 46 > height && !this.getters.isReadonly() && this.viewportHeight > 46) height += 46;
67440
67437
  }
67441
67438
  return {
67442
67439
  width,
@@ -79196,6 +79193,6 @@ const chartHelpers = {
79196
79193
  //#endregion
79197
79194
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, ClientDisconnectedError, CommandResult, CorePlugin, CoreViewPlugin, DEFAULT_LOCALE, DEFAULT_LOCALES, DispatchResult, EvaluationError, LocalTransportService, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, categories, chartHelpers, components, constants, convertAstNodes, coreTypes, createAutocompleteArgumentsProvider, findCellInNewZone, functionCache, getCaretDownSvg, getCaretUpSvg, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
79198
79195
 
79199
- __info__.version = "19.1.33";
79200
- __info__.date = "2026-08-29T09:14:49.301Z";
79201
- __info__.hash = "5c5b7a2";
79196
+ __info__.version = "19.1.35";
79197
+ __info__.date = "2026-09-10T05:36:15.885Z";
79198
+ __info__.hash = "619eeac";
@@ -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.1.33
6
- * @date 2026-08-29T09:14:49.301Z
7
- * @hash 5c5b7a2
5
+ * @version 19.1.35
6
+ * @date 2026-09-10T05:36:15.885Z
7
+ * @hash 619eeac
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -8265,16 +8265,16 @@ stores.inject(MyMetaStore, storeInstance);
8265
8265
  drawLineOrBarOrRadarChartValues(chart, options, ctx);
8266
8266
  break;
8267
8267
  case "bar":
8268
- options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
8268
+ options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
8269
8269
  break;
8270
8270
  case "pyramid":
8271
- drawHorizontalBarChartValues(chart, options, ctx);
8271
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true });
8272
8272
  break;
8273
8273
  case "calendar":
8274
8274
  drawBarChartValues(chart, options, ctx);
8275
8275
  break;
8276
8276
  case "funnel":
8277
- drawHorizontalBarChartValues(chart, options, ctx);
8277
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
8278
8278
  break;
8279
8279
  }
8280
8280
  ctx.restore();
@@ -8298,7 +8298,7 @@ stores.inject(MyMetaStore, storeInstance);
8298
8298
  const point = dataset.data[i];
8299
8299
  const xPosition = point.x;
8300
8300
  let yPosition = 0;
8301
- if (chart.config.type === "line" || chart.config.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
8301
+ if (dataset.type === "line" || dataset.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
8302
8302
  else {
8303
8303
  const yZeroLine = yAxisScale.getPixelForValue(0);
8304
8304
  const distanceFromAxisOrigin = Math.abs(yZeroLine - point.y);
@@ -8344,7 +8344,7 @@ stores.inject(MyMetaStore, storeInstance);
8344
8344
  }
8345
8345
  }
8346
8346
  }
8347
- function drawHorizontalBarChartValues(chart, options, ctx) {
8347
+ function drawHorizontalBarChartValues(chart, options, ctx, args) {
8348
8348
  const textsPositions = {};
8349
8349
  for (const dataset of chart._metasets) {
8350
8350
  if (isTrendLineAxis(dataset.xAxisID)) return;
@@ -8359,7 +8359,7 @@ stores.inject(MyMetaStore, storeInstance);
8359
8359
  const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
8360
8360
  const PADDING = 3;
8361
8361
  let xPosition;
8362
- if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
8362
+ if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
8363
8363
  else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
8364
8364
  if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
8365
8365
  for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
@@ -11188,7 +11188,7 @@ stores.inject(MyMetaStore, storeInstance);
11188
11188
  ["MoreThanOneRangeSelected"]: _t("Please select only one range of cells"),
11189
11189
  ["EmptyTarget"]: _t("Please select a range of cells containing values."),
11190
11190
  ["NoColumnsProvided"]: _t("Please select at latest one column to analyze."),
11191
- ["WillRemoveExistingMerge"]: _t("This operation is not possible due to a merge. Please remove the merges first than try again.")
11191
+ ["WillRemoveExistingMerge"]: _t("Cannot perform this action on merged cells. Unmerge the cells and try again.")
11192
11192
  } };
11193
11193
  const DVTerms = {
11194
11194
  DateIs: {
@@ -26876,9 +26876,10 @@ stores.inject(MyMetaStore, storeInstance);
26876
26876
  compositionActive = false;
26877
26877
  spreadsheetRect = useSpreadsheetRect();
26878
26878
  lastHoveredTokenIndex = void 0;
26879
- debouncedHover = debounce((tokenIndex, hoveredRect) => {
26879
+ debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
26880
26880
  const selection = this.contentHelper.getCurrentSelection();
26881
- if (selection.start !== selection.end) return;
26881
+ const currentContent = this.props.composerStore.currentContent;
26882
+ if (selection.start !== selection.end || currentContent !== composerContent) return;
26882
26883
  const currentHoveredContext = this.props.composerStore.hoveredTokens;
26883
26884
  this.props.composerStore.hoverToken(tokenIndex);
26884
26885
  if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
@@ -27196,7 +27197,8 @@ stores.inject(MyMetaStore, storeInstance);
27196
27197
  onTokenHover(tokenIndex, hoveredRect) {
27197
27198
  if (this.lastHoveredTokenIndex !== tokenIndex) {
27198
27199
  this.lastHoveredTokenIndex = tokenIndex;
27199
- this.debouncedHover(tokenIndex, hoveredRect);
27200
+ const composerContent = this.props.composerStore.currentContent;
27201
+ this.debouncedHover(tokenIndex, composerContent, hoveredRect);
27200
27202
  }
27201
27203
  }
27202
27204
  /**
@@ -42782,6 +42784,11 @@ stores.inject(MyMetaStore, storeInstance);
42782
42784
  });
42783
42785
  return icon?.onClick ? icon : void 0;
42784
42786
  }
42787
+ get isFooterVisible() {
42788
+ const { y } = this.env.model.getters.getMainViewportCoordinates();
42789
+ const { height } = this.env.model.getters.getSheetViewDimension();
42790
+ return !this.env.model.getters.isReadonly() && height - y > 46;
42791
+ }
42785
42792
  };
42786
42793
 
42787
42794
  //#endregion
@@ -46374,43 +46381,6 @@ stores.inject(MyMetaStore, storeInstance);
46374
46381
  onChange: this.onUpdateDataSetsHaveTitle.bind(this)
46375
46382
  }];
46376
46383
  }
46377
- getGroupByOptions() {
46378
- const sheetId = this.env.model.getters.getFigureSheetId(this.env.model.getters.getFigureIdFromChartId(this.props.chartId));
46379
- const dataSets = createDataSets(this.env.model.getters, this.props.definition.dataSets, sheetId, this.props.definition.dataSetsHaveTitle);
46380
- if (dataSets.length === 0) return [];
46381
- const labelRange = createValidRange(this.env.model.getters, sheetId, this.props.definition.labelRange);
46382
- const labels = getBarChartData(this.props.definition, dataSets, labelRange, this.env.model.getters).labels.filter((l) => isDateTime(l, DEFAULT_LOCALE));
46383
- if (labels.length === 0) return [];
46384
- const dates = labels.map((label) => toJsDate(label, this.env.model.getters.getLocale()));
46385
- const uniqueYears = /* @__PURE__ */ new Set();
46386
- const uniqueMonths = /* @__PURE__ */ new Set();
46387
- const uniqueDays = /* @__PURE__ */ new Set();
46388
- const uniqueHours = /* @__PURE__ */ new Set();
46389
- const uniqueMinutes = /* @__PURE__ */ new Set();
46390
- const uniqueSeconds = /* @__PURE__ */ new Set();
46391
- for (const date of dates) {
46392
- uniqueYears.add(date.getFullYear());
46393
- uniqueMonths.add(date.getMonth());
46394
- uniqueDays.add(date.getDate());
46395
- uniqueHours.add(date.getHours());
46396
- uniqueMinutes.add(date.getMinutes());
46397
- uniqueSeconds.add(date.getSeconds());
46398
- }
46399
- return this.groupByChoices.filter((groupBy) => {
46400
- switch (groupBy.value) {
46401
- case "year": return uniqueYears.size > 1;
46402
- case "quarter_number":
46403
- case "month_number": return uniqueMonths.size > 1;
46404
- case "iso_week_number":
46405
- case "day_of_month":
46406
- case "day_of_week": return uniqueDays.size > 1;
46407
- case "hour_number": return uniqueHours.size > 1;
46408
- case "minute_number": return uniqueMinutes.size > 1;
46409
- case "second_number": return uniqueSeconds.size > 1;
46410
- default: return false;
46411
- }
46412
- });
46413
- }
46414
46384
  getGroupByType(currentAxis) {
46415
46385
  return (currentAxis === "horizontal" ? this.props.definition.horizontalGroupBy : this.props.definition.verticalGroupBy) || "year";
46416
46386
  }
@@ -48901,7 +48871,7 @@ stores.inject(MyMetaStore, storeInstance);
48901
48871
  }
48902
48872
  get specificRangeMatchesCount() {
48903
48873
  const range = this.searchOptions.specificRange;
48904
- if (!range) return "";
48874
+ if (!range || range.invalidSheetName || range.invalidXc) return "";
48905
48875
  const { sheetId, zone } = range;
48906
48876
  return _t("%(matches)s matches in range %(range)s of %(sheetName)s", {
48907
48877
  matches: this.store.specificRangeMatchesCount,
@@ -50996,7 +50966,13 @@ stores.inject(MyMetaStore, storeInstance);
50996
50966
  }
50997
50967
  onSelectionChanged(ranges) {
50998
50968
  this.state.rangeHasChanged = true;
50999
- this.state.range = ranges[0];
50969
+ if (ranges.length === 0) {
50970
+ this.state.range = void 0;
50971
+ return;
50972
+ }
50973
+ const sheetId = this.env.model.getters.getActiveSheetId();
50974
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
50975
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
51000
50976
  }
51001
50977
  onSelectionConfirmed() {
51002
50978
  if (this.state.range) {
@@ -53668,6 +53644,7 @@ stores.inject(MyMetaStore, storeInstance);
53668
53644
  return "Success";
53669
53645
  case "UPDATE_CAROUSEL":
53670
53646
  if (!this.carousels[cmd.sheetId]?.[cmd.figureId]) return "InvalidFigureId";
53647
+ for (const item of cmd.definition.items) if (item.type === "chart" && !this.getters.getChart(item.chartId)) return "ChartDoesNotExist";
53671
53648
  return "Success";
53672
53649
  }
53673
53650
  return "Success";
@@ -58758,14 +58735,16 @@ stores.inject(MyMetaStore, storeInstance);
58758
58735
  */
58759
58736
  getCellsDependingOn(ranges, visited = new RangeSet()) {
58760
58737
  visited = visited.copy();
58738
+ let initialRangesToRemove = visited.copy();
58761
58739
  const queue = Array.from(ranges).reverse();
58762
58740
  while (queue.length > 0) {
58763
58741
  const range = queue.pop();
58764
58742
  visited.add(range);
58765
58743
  const impactedRanges = this.rTree.search(range);
58766
58744
  queue.push(...impactedRanges.difference(visited));
58745
+ initialRangesToRemove = initialRangesToRemove.difference(impactedRanges);
58767
58746
  }
58768
- for (const range of ranges) visited.delete(range);
58747
+ for (const range of initialRangesToRemove) visited.delete(range);
58769
58748
  return visited;
58770
58749
  }
58771
58750
  };
@@ -64504,7 +64483,8 @@ stores.inject(MyMetaStore, storeInstance);
64504
64483
  static getters = [
64505
64484
  "getGeoJsonFeatures",
64506
64485
  "geoFeatureNameToId",
64507
- "getGeoChartAvailableRegions"
64486
+ "getGeoChartAvailableRegions",
64487
+ "loadUsedGeoJsonFeatures"
64508
64488
  ];
64509
64489
  geoJsonService;
64510
64490
  geoJsonCache = {};
@@ -64541,6 +64521,23 @@ stores.inject(MyMetaStore, storeInstance);
64541
64521
  }
64542
64522
  return this.geoJsonService.geoFeatureNameToId(region, featureName);
64543
64523
  }
64524
+ loadUsedGeoJsonFeatures() {
64525
+ const regions = this.getters.getSheetIds().flatMap((sheetId) => this.getters.getChartIds(sheetId).map((chartId) => {
64526
+ const definition = this.getters.getChartDefinition(chartId);
64527
+ return definition.type === "geo" ? definition.region || this.getters.getGeoChartAvailableRegions()[0]?.id : void 0;
64528
+ })).filter(isDefined);
64529
+ const uniqueRegions = Array.from(new Set(regions));
64530
+ if (uniqueRegions.length && !this.geoJsonService) {
64531
+ console.error("No geoJsonService provided to the model");
64532
+ return Promise.resolve();
64533
+ }
64534
+ for (const region of uniqueRegions) this.getGeoJsonFeatures(region);
64535
+ const promises = uniqueRegions.map((region) => {
64536
+ const cachedGeoJson = this.geoJsonCache[region];
64537
+ return cachedGeoJson instanceof Promise ? cachedGeoJson : Promise.resolve();
64538
+ });
64539
+ return Promise.all(promises).then(() => {});
64540
+ }
64544
64541
  convertToGeoJson(json) {
64545
64542
  if (!json) return null;
64546
64543
  if (json.type === "Topology") {
@@ -67438,7 +67435,7 @@ stores.inject(MyMetaStore, storeInstance);
67438
67435
  let height = lastRowEnd - this.offsetCorrectionY;
67439
67436
  if (this.canScrollVertically) {
67440
67437
  height = Math.max(height, this.viewportHeight);
67441
- if (lastRowEnd + 46 > height && !this.getters.isReadonly()) height += 46;
67438
+ if (lastRowEnd + 46 > height && !this.getters.isReadonly() && this.viewportHeight > 46) height += 46;
67442
67439
  }
67443
67440
  return {
67444
67441
  width,
@@ -79251,8 +79248,8 @@ exports.stores = stores;
79251
79248
  exports.tokenColors = tokenColors;
79252
79249
  exports.tokenize = tokenize;
79253
79250
 
79254
- __info__.version = "19.1.33";
79255
- __info__.date = "2026-08-29T09:14:49.301Z";
79256
- __info__.hash = "5c5b7a2";
79251
+ __info__.version = "19.1.35";
79252
+ __info__.date = "2026-09-10T05:36:15.885Z";
79253
+ __info__.hash = "619eeac";
79257
79254
 
79258
79255
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);