@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.
- package/dist/o_spreadsheet.css +7 -4
- package/dist/o_spreadsheet.esm.js +56 -59
- package/dist/o_spreadsheet.iife.js +56 -59
- package/dist/o_spreadsheet.iife.min.js +10 -10
- package/dist/o_spreadsheet.xml +7 -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.2.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
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.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
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 (
|
|
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("
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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.
|
|
81829
|
-
__info__.date = "2026-
|
|
81830
|
-
__info__.hash = "
|
|
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.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
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 (
|
|
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("
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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.
|
|
81889
|
-
__info__.date = "2026-
|
|
81890
|
-
__info__.hash = "
|
|
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);
|