@odoo/o-spreadsheet 19.0.48 → 19.0.50
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 +3 -3
- package/dist/o_spreadsheet.esm.js +95 -43
- package/dist/o_spreadsheet.iife.js +95 -43
- package/dist/o_spreadsheet.iife.min.js +11 -11
- package/dist/o_spreadsheet.xml +4 -7
- 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.0.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 19.0.50
|
|
6
|
+
* @date 2026-09-10T05:35:45.664Z
|
|
7
|
+
* @hash e499258
|
|
8
8
|
*/
|
|
9
9
|
/* Originates from src/components/top_bar/top_bar.scss */
|
|
10
10
|
@media (max-width: 1200px) {
|
|
@@ -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.0.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 19.0.50
|
|
6
|
+
* @date 2026-09-10T05:35:44.046Z
|
|
7
|
+
* @hash e499258
|
|
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, xml } from "@odoo/owl";
|
|
@@ -16420,7 +16420,7 @@ const RemoveDuplicateTerms = { Errors: {
|
|
|
16420
16420
|
["MoreThanOneRangeSelected"]: _t("Please select only one range of cells"),
|
|
16421
16421
|
["EmptyTarget"]: _t("Please select a range of cells containing values."),
|
|
16422
16422
|
["NoColumnsProvided"]: _t("Please select at latest one column to analyze."),
|
|
16423
|
-
["WillRemoveExistingMerge"]: _t("
|
|
16423
|
+
["WillRemoveExistingMerge"]: _t("Cannot perform this action on merged cells. Unmerge the cells and try again.")
|
|
16424
16424
|
} };
|
|
16425
16425
|
const DVTerms = {
|
|
16426
16426
|
DateIs: {
|
|
@@ -19419,13 +19419,14 @@ const chartShowValuesPlugin = {
|
|
|
19419
19419
|
case "doughnut":
|
|
19420
19420
|
drawPieChartValues(chart, options, ctx);
|
|
19421
19421
|
break;
|
|
19422
|
+
case "combo":
|
|
19422
19423
|
case "bar":
|
|
19423
19424
|
case "line":
|
|
19424
19425
|
case "radar":
|
|
19425
|
-
options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
|
|
19426
|
+
options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
|
|
19426
19427
|
break;
|
|
19427
19428
|
case "funnel":
|
|
19428
|
-
drawHorizontalBarChartValues(chart, options, ctx);
|
|
19429
|
+
drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
|
|
19429
19430
|
break;
|
|
19430
19431
|
}
|
|
19431
19432
|
ctx.restore();
|
|
@@ -19449,7 +19450,7 @@ function drawLineOrBarOrRadarChartValues(chart, options, ctx) {
|
|
|
19449
19450
|
const point = dataset.data[i];
|
|
19450
19451
|
const xPosition = point.x;
|
|
19451
19452
|
let yPosition = 0;
|
|
19452
|
-
if (
|
|
19453
|
+
if (dataset.type === "line" || dataset.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
|
|
19453
19454
|
else {
|
|
19454
19455
|
const yZeroLine = yAxisScale.getPixelForValue(0);
|
|
19455
19456
|
const distanceFromAxisOrigin = Math.abs(yZeroLine - point.y);
|
|
@@ -19466,7 +19467,7 @@ function drawLineOrBarOrRadarChartValues(chart, options, ctx) {
|
|
|
19466
19467
|
}
|
|
19467
19468
|
}
|
|
19468
19469
|
}
|
|
19469
|
-
function drawHorizontalBarChartValues(chart, options, ctx) {
|
|
19470
|
+
function drawHorizontalBarChartValues(chart, options, ctx, args) {
|
|
19470
19471
|
const textsPositions = {};
|
|
19471
19472
|
for (const dataset of chart._metasets) {
|
|
19472
19473
|
if (isTrendLineAxis(dataset.xAxisID)) return;
|
|
@@ -19481,7 +19482,7 @@ function drawHorizontalBarChartValues(chart, options, ctx) {
|
|
|
19481
19482
|
const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
|
|
19482
19483
|
const PADDING = 3;
|
|
19483
19484
|
let xPosition;
|
|
19484
|
-
if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
|
|
19485
|
+
if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
|
|
19485
19486
|
else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
|
|
19486
19487
|
if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
|
|
19487
19488
|
for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
|
|
@@ -29572,9 +29573,10 @@ var Composer = class extends Component {
|
|
|
29572
29573
|
compositionActive = false;
|
|
29573
29574
|
spreadsheetRect = useSpreadsheetRect();
|
|
29574
29575
|
lastHoveredTokenIndex = void 0;
|
|
29575
|
-
debouncedHover = debounce((tokenIndex, hoveredRect) => {
|
|
29576
|
+
debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
|
|
29576
29577
|
const selection = this.contentHelper.getCurrentSelection();
|
|
29577
|
-
|
|
29578
|
+
const currentContent = this.props.composerStore.currentContent;
|
|
29579
|
+
if (selection.start !== selection.end || currentContent !== composerContent) return;
|
|
29578
29580
|
const currentHoveredContext = this.props.composerStore.hoveredTokens;
|
|
29579
29581
|
this.props.composerStore.hoverToken(tokenIndex);
|
|
29580
29582
|
if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
|
|
@@ -29891,7 +29893,8 @@ var Composer = class extends Component {
|
|
|
29891
29893
|
onTokenHover(tokenIndex, hoveredRect) {
|
|
29892
29894
|
if (this.lastHoveredTokenIndex !== tokenIndex) {
|
|
29893
29895
|
this.lastHoveredTokenIndex = tokenIndex;
|
|
29894
|
-
this.
|
|
29896
|
+
const composerContent = this.props.composerStore.currentContent;
|
|
29897
|
+
this.debouncedHover(tokenIndex, composerContent, hoveredRect);
|
|
29895
29898
|
}
|
|
29896
29899
|
}
|
|
29897
29900
|
/**
|
|
@@ -31496,6 +31499,42 @@ var ColorPicker = class extends Component {
|
|
|
31496
31499
|
}
|
|
31497
31500
|
};
|
|
31498
31501
|
|
|
31502
|
+
//#endregion
|
|
31503
|
+
//#region src/components/icons/raw_svgs.ts
|
|
31504
|
+
/**
|
|
31505
|
+
* SVG markup used in `css` tagged templates as `data:image/svg+xml` URIs.
|
|
31506
|
+
*
|
|
31507
|
+
* Keep these values in a separate module so Rolldown references them instead
|
|
31508
|
+
* of inlining them into template literals. Inlining produces nested template
|
|
31509
|
+
* literals, which the downstream `rjsmin` minifier cannot parse correctly
|
|
31510
|
+
* because it relies on regular expressions.
|
|
31511
|
+
*
|
|
31512
|
+
* Do not inline these constants.
|
|
31513
|
+
*/
|
|
31514
|
+
const CHECK_SVG = `
|
|
31515
|
+
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
|
|
31516
|
+
<path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
|
|
31517
|
+
</svg>
|
|
31518
|
+
`;
|
|
31519
|
+
const CIRCLE_SVG = `
|
|
31520
|
+
<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
|
|
31521
|
+
<circle r="2" fill="#FFF"/>
|
|
31522
|
+
</svg>
|
|
31523
|
+
`;
|
|
31524
|
+
const TRANSPARENT_BACKGROUND_SVG = `
|
|
31525
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
|
|
31526
|
+
<path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
|
|
31527
|
+
</svg>
|
|
31528
|
+
`;
|
|
31529
|
+
const CURSOR_SVG = `
|
|
31530
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="16"><path d="M6.5.4c1.3-.8 2.9-.1 3.8 1.4l2.9 5.1c.2.4.9 1.6-.4 2.3l-1.6.9 1.8 3.1c.2.4.1 1-.2 1.2l-1.6 1c-.3.1-.9 0-1.1-.4l-1.8-3.1-1.6 1c-.6.4-1.7 0-2.2-.8L0 4.3"/><path fill="#fff" d="M9.1 2a1.4 1.1 60 0 0-1.7-.6L5.5 2.5l.9 1.6-1 .6-.9-1.6-.6.4 1.8 3.1-1.3.7-1.8-3.1-1 .6 3.8 6.6 6.8-3.98M3.9 8.8 10.82 5l.795 1.4-6.81 3.96"/></svg>
|
|
31531
|
+
`;
|
|
31532
|
+
const CARET_DOWN_SVG = `
|
|
31533
|
+
<svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
|
|
31534
|
+
<polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
|
|
31535
|
+
</svg>
|
|
31536
|
+
`;
|
|
31537
|
+
|
|
31499
31538
|
//#endregion
|
|
31500
31539
|
//#region src/components/side_panel/components/section/section.ts
|
|
31501
31540
|
var Section = class extends Component {
|
|
@@ -31522,11 +31561,7 @@ css`
|
|
|
31522
31561
|
cursor: pointer;
|
|
31523
31562
|
border: 1px solid ${GRAY_300};
|
|
31524
31563
|
background-position: 1px 1px;
|
|
31525
|
-
background-image: url("data:image/svg+xml,${encodeURIComponent(
|
|
31526
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
|
|
31527
|
-
<path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
|
|
31528
|
-
</svg>
|
|
31529
|
-
`)}");
|
|
31564
|
+
background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
|
|
31530
31565
|
}
|
|
31531
31566
|
`;
|
|
31532
31567
|
var RoundColorPicker = class extends Component {
|
|
@@ -32787,11 +32822,6 @@ var FilterMenuCriterion = class extends Component {
|
|
|
32787
32822
|
|
|
32788
32823
|
//#endregion
|
|
32789
32824
|
//#region src/components/side_panel/components/checkbox/checkbox.ts
|
|
32790
|
-
const CHECK_SVG = `
|
|
32791
|
-
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
|
|
32792
|
-
<path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
|
|
32793
|
-
</svg>
|
|
32794
|
-
`;
|
|
32795
32825
|
const CHECKBOX_WIDTH = 14;
|
|
32796
32826
|
css`
|
|
32797
32827
|
label.o-checkbox {
|
|
@@ -45023,9 +45053,7 @@ var HoveredIconStore = class extends SpreadsheetStore {
|
|
|
45023
45053
|
//#region src/components/grid_overlay/grid_overlay.ts
|
|
45024
45054
|
css`
|
|
45025
45055
|
.o-paint-format-cursor {
|
|
45026
|
-
cursor: url("data:image/svg+xml,${encodeURIComponent(
|
|
45027
|
-
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="16"><path d="M6.5.4c1.3-.8 2.9-.1 3.8 1.4l2.9 5.1c.2.4.9 1.6-.4 2.3l-1.6.9 1.8 3.1c.2.4.1 1-.2 1.2l-1.6 1c-.3.1-.9 0-1.1-.4l-1.8-3.1-1.6 1c-.6.4-1.7 0-2.2-.8L0 4.3"/><path fill="#fff" d="M9.1 2a1.4 1.1 60 0 0-1.7-.6L5.5 2.5l.9 1.6-1 .6-.9-1.6-.6.4 1.8 3.1-1.3.7-1.8-3.1-1 .6 3.8 6.6 6.8-3.98M3.9 8.8 10.82 5l.795 1.4-6.81 3.96"/></svg>
|
|
45028
|
-
`)}"), auto;
|
|
45056
|
+
cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
|
|
45029
45057
|
}
|
|
45030
45058
|
`;
|
|
45031
45059
|
function useCellHovered(env, gridRef) {
|
|
@@ -45245,6 +45273,11 @@ var GridOverlay = class extends Component {
|
|
|
45245
45273
|
});
|
|
45246
45274
|
return icon?.onClick ? icon : void 0;
|
|
45247
45275
|
}
|
|
45276
|
+
get isFooterVisible() {
|
|
45277
|
+
const { y } = this.env.model.getters.getMainViewportCoordinates();
|
|
45278
|
+
const { height } = this.env.model.getters.getSheetViewDimension();
|
|
45279
|
+
return !this.env.model.getters.isReadonly() && height - y > 46;
|
|
45280
|
+
}
|
|
45248
45281
|
};
|
|
45249
45282
|
|
|
45250
45283
|
//#endregion
|
|
@@ -48656,11 +48689,7 @@ css`
|
|
|
48656
48689
|
border-radius: 8px;
|
|
48657
48690
|
|
|
48658
48691
|
&:checked {
|
|
48659
|
-
background: url("data:image/svg+xml,${encodeURIComponent(
|
|
48660
|
-
<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
|
|
48661
|
-
<circle r="2" fill="#FFF"/>
|
|
48662
|
-
</svg>
|
|
48663
|
-
`)}");
|
|
48692
|
+
background: url("data:image/svg+xml,${encodeURIComponent(CIRCLE_SVG)}");
|
|
48664
48693
|
background-color: ${ACTION_COLOR};
|
|
48665
48694
|
border-color: ${ACTION_COLOR};
|
|
48666
48695
|
}
|
|
@@ -51885,7 +51914,7 @@ var FindAndReplacePanel = class extends Component {
|
|
|
51885
51914
|
}
|
|
51886
51915
|
get specificRangeMatchesCount() {
|
|
51887
51916
|
const range = this.searchOptions.specificRange;
|
|
51888
|
-
if (!range) return "";
|
|
51917
|
+
if (!range || range.invalidSheetName || range.invalidXc) return "";
|
|
51889
51918
|
const { sheetId, zone } = range;
|
|
51890
51919
|
return _t("%(matches)s matches in range %(range)s of %(sheetName)s", {
|
|
51891
51920
|
matches: this.store.specificRangeMatchesCount,
|
|
@@ -53389,7 +53418,13 @@ var PivotSpreadsheetSidePanel = class extends Component {
|
|
|
53389
53418
|
}
|
|
53390
53419
|
onSelectionChanged(ranges) {
|
|
53391
53420
|
this.state.rangeHasChanged = true;
|
|
53392
|
-
|
|
53421
|
+
if (ranges.length === 0) {
|
|
53422
|
+
this.state.range = void 0;
|
|
53423
|
+
return;
|
|
53424
|
+
}
|
|
53425
|
+
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
53426
|
+
const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
|
|
53427
|
+
this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
|
|
53393
53428
|
}
|
|
53394
53429
|
onSelectionConfirmed() {
|
|
53395
53430
|
if (this.state.range) {
|
|
@@ -59770,6 +59805,7 @@ var CarouselPlugin = class extends CorePlugin {
|
|
|
59770
59805
|
return "Success";
|
|
59771
59806
|
case "UPDATE_CAROUSEL":
|
|
59772
59807
|
if (!this.carousels[cmd.sheetId]?.[cmd.figureId]) return "InvalidFigureId";
|
|
59808
|
+
for (const item of cmd.definition.items) if (item.type === "chart" && !this.getters.getChart(item.chartId)) return "ChartDoesNotExist";
|
|
59773
59809
|
return "Success";
|
|
59774
59810
|
}
|
|
59775
59811
|
return "Success";
|
|
@@ -61364,14 +61400,16 @@ var FormulaDependencyGraph = class {
|
|
|
61364
61400
|
*/
|
|
61365
61401
|
getCellsDependingOn(ranges, visited = new RangeSet()) {
|
|
61366
61402
|
visited = visited.copy();
|
|
61403
|
+
let initialRangesToRemove = visited.copy();
|
|
61367
61404
|
const queue = Array.from(ranges).reverse();
|
|
61368
61405
|
while (queue.length > 0) {
|
|
61369
61406
|
const range = queue.pop();
|
|
61370
61407
|
visited.add(range);
|
|
61371
61408
|
const impactedRanges = this.rTree.search(range);
|
|
61372
61409
|
queue.push(...impactedRanges.difference(visited));
|
|
61410
|
+
initialRangesToRemove = initialRangesToRemove.difference(impactedRanges);
|
|
61373
61411
|
}
|
|
61374
|
-
for (const range of
|
|
61412
|
+
for (const range of initialRangesToRemove) visited.delete(range);
|
|
61375
61413
|
return visited;
|
|
61376
61414
|
}
|
|
61377
61415
|
};
|
|
@@ -66563,7 +66601,8 @@ var GeoFeaturePlugin = class extends UIPlugin {
|
|
|
66563
66601
|
static getters = [
|
|
66564
66602
|
"getGeoJsonFeatures",
|
|
66565
66603
|
"geoFeatureNameToId",
|
|
66566
|
-
"getGeoChartAvailableRegions"
|
|
66604
|
+
"getGeoChartAvailableRegions",
|
|
66605
|
+
"loadUsedGeoJsonFeatures"
|
|
66567
66606
|
];
|
|
66568
66607
|
geoJsonService;
|
|
66569
66608
|
geoJsonCache = {};
|
|
@@ -66600,6 +66639,23 @@ var GeoFeaturePlugin = class extends UIPlugin {
|
|
|
66600
66639
|
}
|
|
66601
66640
|
return this.geoJsonService.geoFeatureNameToId(region, featureName);
|
|
66602
66641
|
}
|
|
66642
|
+
loadUsedGeoJsonFeatures() {
|
|
66643
|
+
const regions = this.getters.getSheetIds().flatMap((sheetId) => this.getters.getChartIds(sheetId).map((chartId) => {
|
|
66644
|
+
const definition = this.getters.getChartDefinition(chartId);
|
|
66645
|
+
return definition.type === "geo" ? definition.region || this.getters.getGeoChartAvailableRegions()[0]?.id : void 0;
|
|
66646
|
+
})).filter(isDefined);
|
|
66647
|
+
const uniqueRegions = Array.from(new Set(regions));
|
|
66648
|
+
if (uniqueRegions.length && !this.geoJsonService) {
|
|
66649
|
+
console.error("No geoJsonService provided to the model");
|
|
66650
|
+
return Promise.resolve();
|
|
66651
|
+
}
|
|
66652
|
+
for (const region of uniqueRegions) this.getGeoJsonFeatures(region);
|
|
66653
|
+
const promises = uniqueRegions.map((region) => {
|
|
66654
|
+
const cachedGeoJson = this.geoJsonCache[region];
|
|
66655
|
+
return cachedGeoJson instanceof Promise ? cachedGeoJson : Promise.resolve();
|
|
66656
|
+
});
|
|
66657
|
+
return Promise.all(promises).then(() => {});
|
|
66658
|
+
}
|
|
66603
66659
|
convertToGeoJson(json) {
|
|
66604
66660
|
if (!json) return null;
|
|
66605
66661
|
if (json.type === "Topology") {
|
|
@@ -69614,7 +69670,7 @@ var InternalViewport = class {
|
|
|
69614
69670
|
let height = lastRowEnd - this.offsetCorrectionY;
|
|
69615
69671
|
if (this.canScrollVertically) {
|
|
69616
69672
|
height = Math.max(height, this.viewportHeight);
|
|
69617
|
-
if (lastRowEnd + 46 > height && !this.getters.isReadonly()) height += 46;
|
|
69673
|
+
if (lastRowEnd + 46 > height && !this.getters.isReadonly() && this.viewportHeight > 46) height += 46;
|
|
69618
69674
|
}
|
|
69619
69675
|
return {
|
|
69620
69676
|
width,
|
|
@@ -74876,11 +74932,7 @@ css`
|
|
|
74876
74932
|
appearance: none;
|
|
74877
74933
|
-webkit-appearance: none;
|
|
74878
74934
|
-moz-appearance: none;
|
|
74879
|
-
background: transparent url("data:image/svg+xml,${encodeURIComponent(
|
|
74880
|
-
<svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
|
|
74881
|
-
<polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
|
|
74882
|
-
</svg>
|
|
74883
|
-
`)}")
|
|
74935
|
+
background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
|
|
74884
74936
|
no-repeat right center;
|
|
74885
74937
|
text-overflow: ellipsis;
|
|
74886
74938
|
|
|
@@ -79464,6 +79516,6 @@ const chartHelpers = {
|
|
|
79464
79516
|
//#endregion
|
|
79465
79517
|
export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, ClientDisconnectedError, CommandResult, CorePlugin, CoreViewPlugin, DispatchResult, EvaluationError, LocalTransportService, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, chartHelpers, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, getCaretDownSvg, getCaretUpSvg, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
|
|
79466
79518
|
|
|
79467
|
-
__info__.version = "19.0.
|
|
79468
|
-
__info__.date = "2026-
|
|
79469
|
-
__info__.hash = "
|
|
79519
|
+
__info__.version = "19.0.50";
|
|
79520
|
+
__info__.date = "2026-09-10T05:35:44.046Z";
|
|
79521
|
+
__info__.hash = "e499258";
|
|
@@ -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.0.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 19.0.50
|
|
6
|
+
* @date 2026-09-10T05:35:44.046Z
|
|
7
|
+
* @hash e499258
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
(function(exports, _odoo_owl) {
|
|
@@ -16422,7 +16422,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
16422
16422
|
["MoreThanOneRangeSelected"]: _t("Please select only one range of cells"),
|
|
16423
16423
|
["EmptyTarget"]: _t("Please select a range of cells containing values."),
|
|
16424
16424
|
["NoColumnsProvided"]: _t("Please select at latest one column to analyze."),
|
|
16425
|
-
["WillRemoveExistingMerge"]: _t("
|
|
16425
|
+
["WillRemoveExistingMerge"]: _t("Cannot perform this action on merged cells. Unmerge the cells and try again.")
|
|
16426
16426
|
} };
|
|
16427
16427
|
const DVTerms = {
|
|
16428
16428
|
DateIs: {
|
|
@@ -19421,13 +19421,14 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
19421
19421
|
case "doughnut":
|
|
19422
19422
|
drawPieChartValues(chart, options, ctx);
|
|
19423
19423
|
break;
|
|
19424
|
+
case "combo":
|
|
19424
19425
|
case "bar":
|
|
19425
19426
|
case "line":
|
|
19426
19427
|
case "radar":
|
|
19427
|
-
options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
|
|
19428
|
+
options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
|
|
19428
19429
|
break;
|
|
19429
19430
|
case "funnel":
|
|
19430
|
-
drawHorizontalBarChartValues(chart, options, ctx);
|
|
19431
|
+
drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
|
|
19431
19432
|
break;
|
|
19432
19433
|
}
|
|
19433
19434
|
ctx.restore();
|
|
@@ -19451,7 +19452,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
19451
19452
|
const point = dataset.data[i];
|
|
19452
19453
|
const xPosition = point.x;
|
|
19453
19454
|
let yPosition = 0;
|
|
19454
|
-
if (
|
|
19455
|
+
if (dataset.type === "line" || dataset.type === "radar") yPosition = value < 0 ? point.y + 10 : point.y - 10;
|
|
19455
19456
|
else {
|
|
19456
19457
|
const yZeroLine = yAxisScale.getPixelForValue(0);
|
|
19457
19458
|
const distanceFromAxisOrigin = Math.abs(yZeroLine - point.y);
|
|
@@ -19468,7 +19469,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
19468
19469
|
}
|
|
19469
19470
|
}
|
|
19470
19471
|
}
|
|
19471
|
-
function drawHorizontalBarChartValues(chart, options, ctx) {
|
|
19472
|
+
function drawHorizontalBarChartValues(chart, options, ctx, args) {
|
|
19472
19473
|
const textsPositions = {};
|
|
19473
19474
|
for (const dataset of chart._metasets) {
|
|
19474
19475
|
if (isTrendLineAxis(dataset.xAxisID)) return;
|
|
@@ -19483,7 +19484,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
19483
19484
|
const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
|
|
19484
19485
|
const PADDING = 3;
|
|
19485
19486
|
let xPosition;
|
|
19486
|
-
if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
|
|
19487
|
+
if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
|
|
19487
19488
|
else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
|
|
19488
19489
|
if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
|
|
19489
19490
|
for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
|
|
@@ -29574,9 +29575,10 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
29574
29575
|
compositionActive = false;
|
|
29575
29576
|
spreadsheetRect = useSpreadsheetRect();
|
|
29576
29577
|
lastHoveredTokenIndex = void 0;
|
|
29577
|
-
debouncedHover = debounce((tokenIndex, hoveredRect) => {
|
|
29578
|
+
debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
|
|
29578
29579
|
const selection = this.contentHelper.getCurrentSelection();
|
|
29579
|
-
|
|
29580
|
+
const currentContent = this.props.composerStore.currentContent;
|
|
29581
|
+
if (selection.start !== selection.end || currentContent !== composerContent) return;
|
|
29580
29582
|
const currentHoveredContext = this.props.composerStore.hoveredTokens;
|
|
29581
29583
|
this.props.composerStore.hoverToken(tokenIndex);
|
|
29582
29584
|
if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
|
|
@@ -29893,7 +29895,8 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
29893
29895
|
onTokenHover(tokenIndex, hoveredRect) {
|
|
29894
29896
|
if (this.lastHoveredTokenIndex !== tokenIndex) {
|
|
29895
29897
|
this.lastHoveredTokenIndex = tokenIndex;
|
|
29896
|
-
this.
|
|
29898
|
+
const composerContent = this.props.composerStore.currentContent;
|
|
29899
|
+
this.debouncedHover(tokenIndex, composerContent, hoveredRect);
|
|
29897
29900
|
}
|
|
29898
29901
|
}
|
|
29899
29902
|
/**
|
|
@@ -31498,6 +31501,42 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
31498
31501
|
}
|
|
31499
31502
|
};
|
|
31500
31503
|
|
|
31504
|
+
//#endregion
|
|
31505
|
+
//#region src/components/icons/raw_svgs.ts
|
|
31506
|
+
/**
|
|
31507
|
+
* SVG markup used in `css` tagged templates as `data:image/svg+xml` URIs.
|
|
31508
|
+
*
|
|
31509
|
+
* Keep these values in a separate module so Rolldown references them instead
|
|
31510
|
+
* of inlining them into template literals. Inlining produces nested template
|
|
31511
|
+
* literals, which the downstream `rjsmin` minifier cannot parse correctly
|
|
31512
|
+
* because it relies on regular expressions.
|
|
31513
|
+
*
|
|
31514
|
+
* Do not inline these constants.
|
|
31515
|
+
*/
|
|
31516
|
+
const CHECK_SVG = `
|
|
31517
|
+
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
|
|
31518
|
+
<path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
|
|
31519
|
+
</svg>
|
|
31520
|
+
`;
|
|
31521
|
+
const CIRCLE_SVG = `
|
|
31522
|
+
<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
|
|
31523
|
+
<circle r="2" fill="#FFF"/>
|
|
31524
|
+
</svg>
|
|
31525
|
+
`;
|
|
31526
|
+
const TRANSPARENT_BACKGROUND_SVG = `
|
|
31527
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
|
|
31528
|
+
<path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
|
|
31529
|
+
</svg>
|
|
31530
|
+
`;
|
|
31531
|
+
const CURSOR_SVG = `
|
|
31532
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="16"><path d="M6.5.4c1.3-.8 2.9-.1 3.8 1.4l2.9 5.1c.2.4.9 1.6-.4 2.3l-1.6.9 1.8 3.1c.2.4.1 1-.2 1.2l-1.6 1c-.3.1-.9 0-1.1-.4l-1.8-3.1-1.6 1c-.6.4-1.7 0-2.2-.8L0 4.3"/><path fill="#fff" d="M9.1 2a1.4 1.1 60 0 0-1.7-.6L5.5 2.5l.9 1.6-1 .6-.9-1.6-.6.4 1.8 3.1-1.3.7-1.8-3.1-1 .6 3.8 6.6 6.8-3.98M3.9 8.8 10.82 5l.795 1.4-6.81 3.96"/></svg>
|
|
31533
|
+
`;
|
|
31534
|
+
const CARET_DOWN_SVG = `
|
|
31535
|
+
<svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
|
|
31536
|
+
<polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
|
|
31537
|
+
</svg>
|
|
31538
|
+
`;
|
|
31539
|
+
|
|
31501
31540
|
//#endregion
|
|
31502
31541
|
//#region src/components/side_panel/components/section/section.ts
|
|
31503
31542
|
var Section = class extends _odoo_owl.Component {
|
|
@@ -31524,11 +31563,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
31524
31563
|
cursor: pointer;
|
|
31525
31564
|
border: 1px solid ${GRAY_300};
|
|
31526
31565
|
background-position: 1px 1px;
|
|
31527
|
-
background-image: url("data:image/svg+xml,${encodeURIComponent(
|
|
31528
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
|
|
31529
|
-
<path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
|
|
31530
|
-
</svg>
|
|
31531
|
-
`)}");
|
|
31566
|
+
background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
|
|
31532
31567
|
}
|
|
31533
31568
|
`;
|
|
31534
31569
|
var RoundColorPicker = class extends _odoo_owl.Component {
|
|
@@ -32789,11 +32824,6 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
32789
32824
|
|
|
32790
32825
|
//#endregion
|
|
32791
32826
|
//#region src/components/side_panel/components/checkbox/checkbox.ts
|
|
32792
|
-
const CHECK_SVG = `
|
|
32793
|
-
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
|
|
32794
|
-
<path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
|
|
32795
|
-
</svg>
|
|
32796
|
-
`;
|
|
32797
32827
|
const CHECKBOX_WIDTH = 14;
|
|
32798
32828
|
css`
|
|
32799
32829
|
label.o-checkbox {
|
|
@@ -45025,9 +45055,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
45025
45055
|
//#region src/components/grid_overlay/grid_overlay.ts
|
|
45026
45056
|
css`
|
|
45027
45057
|
.o-paint-format-cursor {
|
|
45028
|
-
cursor: url("data:image/svg+xml,${encodeURIComponent(
|
|
45029
|
-
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="16"><path d="M6.5.4c1.3-.8 2.9-.1 3.8 1.4l2.9 5.1c.2.4.9 1.6-.4 2.3l-1.6.9 1.8 3.1c.2.4.1 1-.2 1.2l-1.6 1c-.3.1-.9 0-1.1-.4l-1.8-3.1-1.6 1c-.6.4-1.7 0-2.2-.8L0 4.3"/><path fill="#fff" d="M9.1 2a1.4 1.1 60 0 0-1.7-.6L5.5 2.5l.9 1.6-1 .6-.9-1.6-.6.4 1.8 3.1-1.3.7-1.8-3.1-1 .6 3.8 6.6 6.8-3.98M3.9 8.8 10.82 5l.795 1.4-6.81 3.96"/></svg>
|
|
45030
|
-
`)}"), auto;
|
|
45058
|
+
cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
|
|
45031
45059
|
}
|
|
45032
45060
|
`;
|
|
45033
45061
|
function useCellHovered(env, gridRef) {
|
|
@@ -45247,6 +45275,11 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
45247
45275
|
});
|
|
45248
45276
|
return icon?.onClick ? icon : void 0;
|
|
45249
45277
|
}
|
|
45278
|
+
get isFooterVisible() {
|
|
45279
|
+
const { y } = this.env.model.getters.getMainViewportCoordinates();
|
|
45280
|
+
const { height } = this.env.model.getters.getSheetViewDimension();
|
|
45281
|
+
return !this.env.model.getters.isReadonly() && height - y > 46;
|
|
45282
|
+
}
|
|
45250
45283
|
};
|
|
45251
45284
|
|
|
45252
45285
|
//#endregion
|
|
@@ -48658,11 +48691,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
48658
48691
|
border-radius: 8px;
|
|
48659
48692
|
|
|
48660
48693
|
&:checked {
|
|
48661
|
-
background: url("data:image/svg+xml,${encodeURIComponent(
|
|
48662
|
-
<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
|
|
48663
|
-
<circle r="2" fill="#FFF"/>
|
|
48664
|
-
</svg>
|
|
48665
|
-
`)}");
|
|
48694
|
+
background: url("data:image/svg+xml,${encodeURIComponent(CIRCLE_SVG)}");
|
|
48666
48695
|
background-color: ${ACTION_COLOR};
|
|
48667
48696
|
border-color: ${ACTION_COLOR};
|
|
48668
48697
|
}
|
|
@@ -51887,7 +51916,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
51887
51916
|
}
|
|
51888
51917
|
get specificRangeMatchesCount() {
|
|
51889
51918
|
const range = this.searchOptions.specificRange;
|
|
51890
|
-
if (!range) return "";
|
|
51919
|
+
if (!range || range.invalidSheetName || range.invalidXc) return "";
|
|
51891
51920
|
const { sheetId, zone } = range;
|
|
51892
51921
|
return _t("%(matches)s matches in range %(range)s of %(sheetName)s", {
|
|
51893
51922
|
matches: this.store.specificRangeMatchesCount,
|
|
@@ -53391,7 +53420,13 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
53391
53420
|
}
|
|
53392
53421
|
onSelectionChanged(ranges) {
|
|
53393
53422
|
this.state.rangeHasChanged = true;
|
|
53394
|
-
|
|
53423
|
+
if (ranges.length === 0) {
|
|
53424
|
+
this.state.range = void 0;
|
|
53425
|
+
return;
|
|
53426
|
+
}
|
|
53427
|
+
const sheetId = this.env.model.getters.getActiveSheetId();
|
|
53428
|
+
const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
|
|
53429
|
+
this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
|
|
53395
53430
|
}
|
|
53396
53431
|
onSelectionConfirmed() {
|
|
53397
53432
|
if (this.state.range) {
|
|
@@ -59772,6 +59807,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
59772
59807
|
return "Success";
|
|
59773
59808
|
case "UPDATE_CAROUSEL":
|
|
59774
59809
|
if (!this.carousels[cmd.sheetId]?.[cmd.figureId]) return "InvalidFigureId";
|
|
59810
|
+
for (const item of cmd.definition.items) if (item.type === "chart" && !this.getters.getChart(item.chartId)) return "ChartDoesNotExist";
|
|
59775
59811
|
return "Success";
|
|
59776
59812
|
}
|
|
59777
59813
|
return "Success";
|
|
@@ -61366,14 +61402,16 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
61366
61402
|
*/
|
|
61367
61403
|
getCellsDependingOn(ranges, visited = new RangeSet()) {
|
|
61368
61404
|
visited = visited.copy();
|
|
61405
|
+
let initialRangesToRemove = visited.copy();
|
|
61369
61406
|
const queue = Array.from(ranges).reverse();
|
|
61370
61407
|
while (queue.length > 0) {
|
|
61371
61408
|
const range = queue.pop();
|
|
61372
61409
|
visited.add(range);
|
|
61373
61410
|
const impactedRanges = this.rTree.search(range);
|
|
61374
61411
|
queue.push(...impactedRanges.difference(visited));
|
|
61412
|
+
initialRangesToRemove = initialRangesToRemove.difference(impactedRanges);
|
|
61375
61413
|
}
|
|
61376
|
-
for (const range of
|
|
61414
|
+
for (const range of initialRangesToRemove) visited.delete(range);
|
|
61377
61415
|
return visited;
|
|
61378
61416
|
}
|
|
61379
61417
|
};
|
|
@@ -66565,7 +66603,8 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
66565
66603
|
static getters = [
|
|
66566
66604
|
"getGeoJsonFeatures",
|
|
66567
66605
|
"geoFeatureNameToId",
|
|
66568
|
-
"getGeoChartAvailableRegions"
|
|
66606
|
+
"getGeoChartAvailableRegions",
|
|
66607
|
+
"loadUsedGeoJsonFeatures"
|
|
66569
66608
|
];
|
|
66570
66609
|
geoJsonService;
|
|
66571
66610
|
geoJsonCache = {};
|
|
@@ -66602,6 +66641,23 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
66602
66641
|
}
|
|
66603
66642
|
return this.geoJsonService.geoFeatureNameToId(region, featureName);
|
|
66604
66643
|
}
|
|
66644
|
+
loadUsedGeoJsonFeatures() {
|
|
66645
|
+
const regions = this.getters.getSheetIds().flatMap((sheetId) => this.getters.getChartIds(sheetId).map((chartId) => {
|
|
66646
|
+
const definition = this.getters.getChartDefinition(chartId);
|
|
66647
|
+
return definition.type === "geo" ? definition.region || this.getters.getGeoChartAvailableRegions()[0]?.id : void 0;
|
|
66648
|
+
})).filter(isDefined);
|
|
66649
|
+
const uniqueRegions = Array.from(new Set(regions));
|
|
66650
|
+
if (uniqueRegions.length && !this.geoJsonService) {
|
|
66651
|
+
console.error("No geoJsonService provided to the model");
|
|
66652
|
+
return Promise.resolve();
|
|
66653
|
+
}
|
|
66654
|
+
for (const region of uniqueRegions) this.getGeoJsonFeatures(region);
|
|
66655
|
+
const promises = uniqueRegions.map((region) => {
|
|
66656
|
+
const cachedGeoJson = this.geoJsonCache[region];
|
|
66657
|
+
return cachedGeoJson instanceof Promise ? cachedGeoJson : Promise.resolve();
|
|
66658
|
+
});
|
|
66659
|
+
return Promise.all(promises).then(() => {});
|
|
66660
|
+
}
|
|
66605
66661
|
convertToGeoJson(json) {
|
|
66606
66662
|
if (!json) return null;
|
|
66607
66663
|
if (json.type === "Topology") {
|
|
@@ -69616,7 +69672,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
69616
69672
|
let height = lastRowEnd - this.offsetCorrectionY;
|
|
69617
69673
|
if (this.canScrollVertically) {
|
|
69618
69674
|
height = Math.max(height, this.viewportHeight);
|
|
69619
|
-
if (lastRowEnd + 46 > height && !this.getters.isReadonly()) height += 46;
|
|
69675
|
+
if (lastRowEnd + 46 > height && !this.getters.isReadonly() && this.viewportHeight > 46) height += 46;
|
|
69620
69676
|
}
|
|
69621
69677
|
return {
|
|
69622
69678
|
width,
|
|
@@ -74878,11 +74934,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
74878
74934
|
appearance: none;
|
|
74879
74935
|
-webkit-appearance: none;
|
|
74880
74936
|
-moz-appearance: none;
|
|
74881
|
-
background: transparent url("data:image/svg+xml,${encodeURIComponent(
|
|
74882
|
-
<svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
|
|
74883
|
-
<polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
|
|
74884
|
-
</svg>
|
|
74885
|
-
`)}")
|
|
74937
|
+
background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
|
|
74886
74938
|
no-repeat right center;
|
|
74887
74939
|
text-overflow: ellipsis;
|
|
74888
74940
|
|
|
@@ -79517,8 +79569,8 @@ exports.stores = stores;
|
|
|
79517
79569
|
exports.tokenColors = tokenColors;
|
|
79518
79570
|
exports.tokenize = tokenize;
|
|
79519
79571
|
|
|
79520
|
-
__info__.version = "19.0.
|
|
79521
|
-
__info__.date = "2026-
|
|
79522
|
-
__info__.hash = "
|
|
79572
|
+
__info__.version = "19.0.50";
|
|
79573
|
+
__info__.date = "2026-09-10T05:35:44.046Z";
|
|
79574
|
+
__info__.hash = "e499258";
|
|
79523
79575
|
|
|
79524
79576
|
})(this.o_spreadsheet = this.o_spreadsheet || {}, owl);
|