@odoo/o-spreadsheet 19.2.28 → 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.28
6
- * @date 2026-09-04T07:33:57.749Z
7
- * @hash 102af11
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);
@@ -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.28
6
- * @date 2026-09-04T07:33:56.173Z
7
- * @hash 102af11
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";
@@ -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);
@@ -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: {
@@ -33966,7 +33966,7 @@ var AbstractComposerStore = class extends SpreadsheetStore {
33966
33966
  col: range.zone.left,
33967
33967
  row: range.zone.top
33968
33968
  });
33969
- if (spreadZone) return this.getters.getRangeFromZone(sheetId, spreadZone);
33969
+ if (spreadZone) return this.getters.getRangeFromZone(range.sheetId, spreadZone);
33970
33970
  return range;
33971
33971
  }
33972
33972
  async updateAutoCompleteProvider() {
@@ -39709,43 +39709,6 @@ var CalendarChartConfigPanel = class extends GenericChartConfigPanel {
39709
39709
  onChange: this.onUpdateDataSetsHaveTitle.bind(this)
39710
39710
  }];
39711
39711
  }
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
39712
  getGroupByType(currentAxis) {
39750
39713
  return (currentAxis === "horizontal" ? this.props.definition.horizontalGroupBy : this.props.definition.verticalGroupBy) || "year";
39751
39714
  }
@@ -42336,7 +42299,7 @@ var FindAndReplacePanel = class extends Component {
42336
42299
  }
42337
42300
  get specificRangeMatchesCount() {
42338
42301
  const range = this.searchOptions.specificRange;
42339
- if (!range) return "";
42302
+ if (!range || range.invalidSheetName || range.invalidXc) return "";
42340
42303
  const { sheetId, zone } = range;
42341
42304
  return _t("%(matches)s matches in range %(range)s of %(sheetName)s", {
42342
42305
  matches: this.store.specificRangeMatchesCount,
@@ -52200,6 +52163,11 @@ var GridOverlay = class extends Component {
52200
52163
  });
52201
52164
  return icon?.onClick ? icon : void 0;
52202
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
+ }
52203
52171
  };
52204
52172
 
52205
52173
  //#endregion
@@ -66926,7 +66894,8 @@ var GeoFeaturePlugin = class extends UIPlugin {
66926
66894
  static getters = [
66927
66895
  "getGeoJsonFeatures",
66928
66896
  "geoFeatureNameToId",
66929
- "getGeoChartAvailableRegions"
66897
+ "getGeoChartAvailableRegions",
66898
+ "loadUsedGeoJsonFeatures"
66930
66899
  ];
66931
66900
  geoJsonService;
66932
66901
  geoJsonCache = {};
@@ -66963,6 +66932,23 @@ var GeoFeaturePlugin = class extends UIPlugin {
66963
66932
  }
66964
66933
  return this.geoJsonService.geoFeatureNameToId(region, featureName);
66965
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
+ }
66966
66952
  convertToGeoJson(json) {
66967
66953
  if (!json) return null;
66968
66954
  if (json.type === "Topology") {
@@ -69946,7 +69932,7 @@ var InternalViewport = class {
69946
69932
  let height = lastRowEnd - this.offsetCorrectionY;
69947
69933
  if (this.canScrollVertically) {
69948
69934
  height = Math.max(height, this.viewportHeight);
69949
- if (lastRowEnd + 46 > height && !this.getters.isReadonly()) height += 46;
69935
+ if (lastRowEnd + 46 > height && !this.getters.isReadonly() && this.viewportHeight > 46) height += 46;
69950
69936
  }
69951
69937
  return {
69952
69938
  width,
@@ -81836,6 +81822,6 @@ const chartHelpers = {
81836
81822
  //#endregion
81837
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 };
81838
81824
 
81839
- __info__.version = "19.2.28";
81840
- __info__.date = "2026-09-04T07:33:56.173Z";
81841
- __info__.hash = "102af11";
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.28
6
- * @date 2026-09-04T07:33:56.173Z
7
- * @hash 102af11
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) {
@@ -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);
@@ -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: {
@@ -33968,7 +33968,7 @@ stores.inject(MyMetaStore, storeInstance);
33968
33968
  col: range.zone.left,
33969
33969
  row: range.zone.top
33970
33970
  });
33971
- if (spreadZone) return this.getters.getRangeFromZone(sheetId, spreadZone);
33971
+ if (spreadZone) return this.getters.getRangeFromZone(range.sheetId, spreadZone);
33972
33972
  return range;
33973
33973
  }
33974
33974
  async updateAutoCompleteProvider() {
@@ -39711,43 +39711,6 @@ stores.inject(MyMetaStore, storeInstance);
39711
39711
  onChange: this.onUpdateDataSetsHaveTitle.bind(this)
39712
39712
  }];
39713
39713
  }
39714
- getGroupByOptions() {
39715
- const sheetId = this.env.model.getters.getFigureSheetId(this.env.model.getters.getFigureIdFromChartId(this.props.chartId));
39716
- const dataSets = createDataSets(this.env.model.getters, this.props.definition.dataSets, sheetId, this.props.definition.dataSetsHaveTitle);
39717
- if (dataSets.length === 0) return [];
39718
- const labelRange = createValidRange(this.env.model.getters, sheetId, this.props.definition.labelRange);
39719
- const labels = getBarChartData(this.props.definition, dataSets, labelRange, this.env.model.getters).labels.filter((l) => isDateTime(l, DEFAULT_LOCALE));
39720
- if (labels.length === 0) return [];
39721
- const dates = labels.map((label) => toJsDate(label, this.env.model.getters.getLocale()));
39722
- const uniqueYears = /* @__PURE__ */ new Set();
39723
- const uniqueMonths = /* @__PURE__ */ new Set();
39724
- const uniqueDays = /* @__PURE__ */ new Set();
39725
- const uniqueHours = /* @__PURE__ */ new Set();
39726
- const uniqueMinutes = /* @__PURE__ */ new Set();
39727
- const uniqueSeconds = /* @__PURE__ */ new Set();
39728
- for (const date of dates) {
39729
- uniqueYears.add(date.getFullYear());
39730
- uniqueMonths.add(date.getMonth());
39731
- uniqueDays.add(date.getDate());
39732
- uniqueHours.add(date.getHours());
39733
- uniqueMinutes.add(date.getMinutes());
39734
- uniqueSeconds.add(date.getSeconds());
39735
- }
39736
- return this.groupByChoices.filter((groupBy) => {
39737
- switch (groupBy.value) {
39738
- case "year": return uniqueYears.size > 1;
39739
- case "quarter_number":
39740
- case "month_number": return uniqueMonths.size > 1;
39741
- case "iso_week_number":
39742
- case "day_of_month":
39743
- case "day_of_week": return uniqueDays.size > 1;
39744
- case "hour_number": return uniqueHours.size > 1;
39745
- case "minute_number": return uniqueMinutes.size > 1;
39746
- case "second_number": return uniqueSeconds.size > 1;
39747
- default: return false;
39748
- }
39749
- });
39750
- }
39751
39714
  getGroupByType(currentAxis) {
39752
39715
  return (currentAxis === "horizontal" ? this.props.definition.horizontalGroupBy : this.props.definition.verticalGroupBy) || "year";
39753
39716
  }
@@ -42338,7 +42301,7 @@ stores.inject(MyMetaStore, storeInstance);
42338
42301
  }
42339
42302
  get specificRangeMatchesCount() {
42340
42303
  const range = this.searchOptions.specificRange;
42341
- if (!range) return "";
42304
+ if (!range || range.invalidSheetName || range.invalidXc) return "";
42342
42305
  const { sheetId, zone } = range;
42343
42306
  return _t("%(matches)s matches in range %(range)s of %(sheetName)s", {
42344
42307
  matches: this.store.specificRangeMatchesCount,
@@ -52202,6 +52165,11 @@ stores.inject(MyMetaStore, storeInstance);
52202
52165
  });
52203
52166
  return icon?.onClick ? icon : void 0;
52204
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
+ }
52205
52173
  };
52206
52174
 
52207
52175
  //#endregion
@@ -66928,7 +66896,8 @@ stores.inject(MyMetaStore, storeInstance);
66928
66896
  static getters = [
66929
66897
  "getGeoJsonFeatures",
66930
66898
  "geoFeatureNameToId",
66931
- "getGeoChartAvailableRegions"
66899
+ "getGeoChartAvailableRegions",
66900
+ "loadUsedGeoJsonFeatures"
66932
66901
  ];
66933
66902
  geoJsonService;
66934
66903
  geoJsonCache = {};
@@ -66965,6 +66934,23 @@ stores.inject(MyMetaStore, storeInstance);
66965
66934
  }
66966
66935
  return this.geoJsonService.geoFeatureNameToId(region, featureName);
66967
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
+ }
66968
66954
  convertToGeoJson(json) {
66969
66955
  if (!json) return null;
66970
66956
  if (json.type === "Topology") {
@@ -69948,7 +69934,7 @@ stores.inject(MyMetaStore, storeInstance);
69948
69934
  let height = lastRowEnd - this.offsetCorrectionY;
69949
69935
  if (this.canScrollVertically) {
69950
69936
  height = Math.max(height, this.viewportHeight);
69951
- if (lastRowEnd + 46 > height && !this.getters.isReadonly()) height += 46;
69937
+ if (lastRowEnd + 46 > height && !this.getters.isReadonly() && this.viewportHeight > 46) height += 46;
69952
69938
  }
69953
69939
  return {
69954
69940
  width,
@@ -81896,8 +81882,8 @@ exports.stores = stores;
81896
81882
  exports.tokenColors = tokenColors;
81897
81883
  exports.tokenize = tokenize;
81898
81884
 
81899
- __info__.version = "19.2.28";
81900
- __info__.date = "2026-09-04T07:33:56.173Z";
81901
- __info__.hash = "102af11";
81885
+ __info__.version = "19.2.29";
81886
+ __info__.date = "2026-09-10T05:38:15.721Z";
81887
+ __info__.hash = "a3d2956";
81902
81888
 
81903
81889
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);