@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.
- package/dist/o_spreadsheet.css +7 -4
- package/dist/o_spreadsheet.esm.js +55 -58
- package/dist/o_spreadsheet.iife.js +55 -58
- package/dist/o_spreadsheet.iife.min.js +10 -10
- package/dist/o_spreadsheet.xml +11 -10
- package/package.json +1 -1
package/dist/o_spreadsheet.css
CHANGED
|
@@ -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.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
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.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
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 (
|
|
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("
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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.
|
|
79200
|
-
__info__.date = "2026-
|
|
79201
|
-
__info__.hash = "
|
|
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.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
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 (
|
|
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("
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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.
|
|
79255
|
-
__info__.date = "2026-
|
|
79256
|
-
__info__.hash = "
|
|
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);
|