@odoo/o-spreadsheet 18.1.29 → 18.1.31
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.cjs.js +131 -59
- package/dist/o-spreadsheet.d.ts +5 -0
- package/dist/o-spreadsheet.esm.js +131 -59
- package/dist/o-spreadsheet.iife.js +131 -59
- package/dist/o-spreadsheet.iife.min.js +9 -9
- package/dist/o_spreadsheet.xml +11 -9
- package/package.json +1 -1
|
@@ -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 18.1.
|
|
6
|
-
* @date 2025-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 18.1.31
|
|
6
|
+
* @date 2025-08-04T06:52:11.010Z
|
|
7
|
+
* @hash 4f581fb
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
(function (exports, owl) {
|
|
@@ -10478,6 +10478,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
10478
10478
|
}
|
|
10479
10479
|
setup() {
|
|
10480
10480
|
owl.onMounted(() => {
|
|
10481
|
+
registerChartJSExtensions();
|
|
10481
10482
|
const runtime = this.chartRuntime;
|
|
10482
10483
|
this.currentRuntime = runtime;
|
|
10483
10484
|
// Note: chartJS modify the runtime in place, so it's important to give it a copy
|
|
@@ -11135,6 +11136,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
11135
11136
|
|
|
11136
11137
|
autoCompleteProviders.add("dataValidation", {
|
|
11137
11138
|
displayAllOnInitialContent: true,
|
|
11139
|
+
canBeToggled: false,
|
|
11138
11140
|
getProposals(tokenAtCursor, content) {
|
|
11139
11141
|
if (content.startsWith("=")) {
|
|
11140
11142
|
return [];
|
|
@@ -11142,31 +11144,40 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
11142
11144
|
if (!this.composer.currentEditedCell) {
|
|
11143
11145
|
return [];
|
|
11144
11146
|
}
|
|
11145
|
-
|
|
11146
|
-
|
|
11147
|
-
|
|
11148
|
-
|
|
11149
|
-
|
|
11150
|
-
}
|
|
11151
|
-
let values;
|
|
11152
|
-
if (rule.criterion.type === "isValueInList") {
|
|
11153
|
-
values = rule.criterion.values;
|
|
11154
|
-
}
|
|
11155
|
-
else {
|
|
11156
|
-
const range = this.getters.getRangeFromSheetXC(position.sheetId, rule.criterion.values[0]);
|
|
11157
|
-
values = Array.from(new Set(this.getters
|
|
11158
|
-
.getRangeValues(range)
|
|
11159
|
-
.filter(isNotNull)
|
|
11160
|
-
.map((value) => value.toString())
|
|
11161
|
-
.filter((val) => val !== "")));
|
|
11162
|
-
}
|
|
11163
|
-
return values.map((value) => ({ text: value }));
|
|
11147
|
+
return getProposedValues(this.getters, this.composer.currentEditedCell).map((value) => ({
|
|
11148
|
+
text: value.value?.toString() || "",
|
|
11149
|
+
htmlContent: [{ value: value.label }],
|
|
11150
|
+
fuzzySearchKey: value.label,
|
|
11151
|
+
}));
|
|
11164
11152
|
},
|
|
11165
11153
|
selectProposal(tokenAtCursor, value) {
|
|
11166
11154
|
this.composer.setCurrentContent(value);
|
|
11167
11155
|
this.composer.stopEdition();
|
|
11168
11156
|
},
|
|
11169
11157
|
});
|
|
11158
|
+
function getProposedValues(getters, position) {
|
|
11159
|
+
const rule = getters.getValidationRuleForCell(position);
|
|
11160
|
+
if (!rule ||
|
|
11161
|
+
(rule.criterion.type !== "isValueInList" && rule.criterion.type !== "isValueInRange")) {
|
|
11162
|
+
return [];
|
|
11163
|
+
}
|
|
11164
|
+
let values = [];
|
|
11165
|
+
if (rule.criterion.type === "isValueInList") {
|
|
11166
|
+
values = rule.criterion.values.map((value) => ({ label: value, value }));
|
|
11167
|
+
}
|
|
11168
|
+
else {
|
|
11169
|
+
const labelsSet = new Set();
|
|
11170
|
+
const range = getters.getRangeFromSheetXC(position.sheetId, rule.criterion.values[0]);
|
|
11171
|
+
for (const p of positions(range.zone)) {
|
|
11172
|
+
const cell = getters.getEvaluatedCell({ ...p, sheetId: range.sheetId });
|
|
11173
|
+
if (cell.formattedValue && !labelsSet.has(cell.formattedValue)) {
|
|
11174
|
+
labelsSet.add(cell.formattedValue);
|
|
11175
|
+
values.push({ label: cell.formattedValue, value: cell.value });
|
|
11176
|
+
}
|
|
11177
|
+
}
|
|
11178
|
+
}
|
|
11179
|
+
return values;
|
|
11180
|
+
}
|
|
11170
11181
|
|
|
11171
11182
|
function getHtmlContentFromPattern(pattern, value, highlightColor, className) {
|
|
11172
11183
|
const pendingHtmlContent = [];
|
|
@@ -18937,11 +18948,17 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
18937
18948
|
if (isEvaluationError(cellReference?.value)) {
|
|
18938
18949
|
return cellReference;
|
|
18939
18950
|
}
|
|
18940
|
-
|
|
18941
|
-
|
|
18942
|
-
|
|
18943
|
-
|
|
18944
|
-
|
|
18951
|
+
if (cellReference === undefined) {
|
|
18952
|
+
assert(() => this.__originCellPosition?.col !== undefined, "In this context, the function [[FUNCTION_NAME]] needs to have a cell or range in parameter.");
|
|
18953
|
+
return this.__originCellPosition.col + 1;
|
|
18954
|
+
}
|
|
18955
|
+
const zone = this.getters.getRangeFromSheetXC(this.getters.getActiveSheetId(), cellReference.value).zone;
|
|
18956
|
+
if (zone.left === zone.right) {
|
|
18957
|
+
return zone.left + 1;
|
|
18958
|
+
}
|
|
18959
|
+
return generateMatrix(zone.right - zone.left + 1, 1, (col, row) => ({
|
|
18960
|
+
value: zone.left + col + 1,
|
|
18961
|
+
}));
|
|
18945
18962
|
},
|
|
18946
18963
|
isExported: true,
|
|
18947
18964
|
};
|
|
@@ -19160,11 +19177,17 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
19160
19177
|
if (isEvaluationError(cellReference?.value)) {
|
|
19161
19178
|
return cellReference;
|
|
19162
19179
|
}
|
|
19163
|
-
|
|
19164
|
-
|
|
19165
|
-
|
|
19166
|
-
|
|
19167
|
-
|
|
19180
|
+
if (cellReference === undefined) {
|
|
19181
|
+
assert(() => this.__originCellPosition?.row !== undefined, "In this context, the function [[FUNCTION_NAME]] needs to have a cell or range in parameter.");
|
|
19182
|
+
return this.__originCellPosition.row + 1;
|
|
19183
|
+
}
|
|
19184
|
+
const zone = this.getters.getRangeFromSheetXC(this.getters.getActiveSheetId(), cellReference.value).zone;
|
|
19185
|
+
if (zone.top === zone.bottom) {
|
|
19186
|
+
return zone.top + 1;
|
|
19187
|
+
}
|
|
19188
|
+
return generateMatrix(1, zone.bottom - zone.top + 1, (col, row) => ({
|
|
19189
|
+
value: zone.top + row + 1,
|
|
19190
|
+
}));
|
|
19168
19191
|
},
|
|
19169
19192
|
isExported: true,
|
|
19170
19193
|
};
|
|
@@ -21440,6 +21463,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
21440
21463
|
proposals,
|
|
21441
21464
|
selectProposal: provider.selectProposal,
|
|
21442
21465
|
autoSelectFirstProposal: provider.autoSelectFirstProposal ?? false,
|
|
21466
|
+
canBeToggled: provider.canBeToggled,
|
|
21443
21467
|
};
|
|
21444
21468
|
}
|
|
21445
21469
|
if (exactMatch && this._currentContent !== this.initialContent) {
|
|
@@ -21462,6 +21486,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
21462
21486
|
proposals,
|
|
21463
21487
|
selectProposal: provider.selectProposal,
|
|
21464
21488
|
autoSelectFirstProposal: provider.autoSelectFirstProposal ?? false,
|
|
21489
|
+
canBeToggled: provider.canBeToggled,
|
|
21465
21490
|
};
|
|
21466
21491
|
}
|
|
21467
21492
|
}
|
|
@@ -41500,9 +41525,13 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
41500
41525
|
}
|
|
41501
41526
|
}
|
|
41502
41527
|
closeAssistant() {
|
|
41528
|
+
if (!this.canBeToggled)
|
|
41529
|
+
return;
|
|
41503
41530
|
this.assistant.forcedClosed = true;
|
|
41504
41531
|
}
|
|
41505
41532
|
openAssistant() {
|
|
41533
|
+
if (!this.canBeToggled)
|
|
41534
|
+
return;
|
|
41506
41535
|
this.assistant.forcedClosed = false;
|
|
41507
41536
|
}
|
|
41508
41537
|
onWheel(event) {
|
|
@@ -41512,6 +41541,9 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
41512
41541
|
event.stopPropagation();
|
|
41513
41542
|
}
|
|
41514
41543
|
}
|
|
41544
|
+
get canBeToggled() {
|
|
41545
|
+
return this.autoCompleteState.provider?.canBeToggled ?? true;
|
|
41546
|
+
}
|
|
41515
41547
|
// ---------------------------------------------------------------------------
|
|
41516
41548
|
// Private
|
|
41517
41549
|
// ---------------------------------------------------------------------------
|
|
@@ -41647,7 +41679,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
41647
41679
|
}
|
|
41648
41680
|
}
|
|
41649
41681
|
autoComplete(value) {
|
|
41650
|
-
if (!value || this.assistant.forcedClosed) {
|
|
41682
|
+
if (!value || (this.assistant.forcedClosed && this.canBeToggled)) {
|
|
41651
41683
|
return;
|
|
41652
41684
|
}
|
|
41653
41685
|
this.autoCompleteState.provider?.selectProposal(value);
|
|
@@ -42444,7 +42476,8 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
42444
42476
|
static props = {
|
|
42445
42477
|
editedCf: Object,
|
|
42446
42478
|
onCancel: Function,
|
|
42447
|
-
|
|
42479
|
+
onExit: Function,
|
|
42480
|
+
isNewCf: Boolean,
|
|
42448
42481
|
};
|
|
42449
42482
|
static components = {
|
|
42450
42483
|
SelectionInput,
|
|
@@ -42463,6 +42496,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
42463
42496
|
getTextDecoration = getTextDecoration;
|
|
42464
42497
|
colorNumberString = colorNumberString;
|
|
42465
42498
|
state;
|
|
42499
|
+
hasEditedCf = this.props.isNewCf;
|
|
42466
42500
|
setup() {
|
|
42467
42501
|
this.state = owl.useState({
|
|
42468
42502
|
errors: [],
|
|
@@ -42520,6 +42554,9 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
42520
42554
|
ranges: ranges.map((xc) => this.env.model.getters.getRangeDataFromXc(sheetId, xc)),
|
|
42521
42555
|
sheetId,
|
|
42522
42556
|
});
|
|
42557
|
+
if (result.isSuccessful) {
|
|
42558
|
+
this.hasEditedCf = true;
|
|
42559
|
+
}
|
|
42523
42560
|
const reasons = result.reasons.filter((r) => r !== "NoChanges" /* CommandResult.NoChanges */);
|
|
42524
42561
|
if (!newCf.suppressErrors) {
|
|
42525
42562
|
this.state.errors = reasons;
|
|
@@ -42541,7 +42578,15 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
42541
42578
|
onSave() {
|
|
42542
42579
|
const result = this.updateConditionalFormat({});
|
|
42543
42580
|
if (result.length === 0) {
|
|
42544
|
-
this.props.
|
|
42581
|
+
this.props.onExit();
|
|
42582
|
+
}
|
|
42583
|
+
}
|
|
42584
|
+
onCancel() {
|
|
42585
|
+
if (this.hasEditedCf) {
|
|
42586
|
+
this.props.onCancel();
|
|
42587
|
+
}
|
|
42588
|
+
else {
|
|
42589
|
+
this.props.onExit();
|
|
42545
42590
|
}
|
|
42546
42591
|
}
|
|
42547
42592
|
getDefaultRules() {
|
|
@@ -46892,9 +46937,15 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
46892
46937
|
return domain.reduce((current, acc) => this.filterDataEntriesFromDomainNode(current, acc), dataEntries);
|
|
46893
46938
|
}
|
|
46894
46939
|
filterDataEntriesFromDomainNode(dataEntries, domain) {
|
|
46895
|
-
const { field, value } = domain;
|
|
46940
|
+
const { field, value, type } = domain;
|
|
46896
46941
|
const { nameWithGranularity } = this.getDimension(field);
|
|
46897
|
-
return dataEntries.filter((entry) =>
|
|
46942
|
+
return dataEntries.filter((entry) => {
|
|
46943
|
+
const cellValue = entry[nameWithGranularity]?.value;
|
|
46944
|
+
if (type === "char") {
|
|
46945
|
+
return String(cellValue) === String(value);
|
|
46946
|
+
}
|
|
46947
|
+
return cellValue === value;
|
|
46948
|
+
});
|
|
46898
46949
|
}
|
|
46899
46950
|
getDimension(nameWithGranularity) {
|
|
46900
46951
|
return this.definition.getDimension(nameWithGranularity);
|
|
@@ -49394,6 +49445,11 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
49394
49445
|
rect = this.defaultRect;
|
|
49395
49446
|
isEditing = false;
|
|
49396
49447
|
isCellReferenceVisible = false;
|
|
49448
|
+
currentEditedCell = {
|
|
49449
|
+
col: 0,
|
|
49450
|
+
row: 0,
|
|
49451
|
+
sheetId: this.env.model.getters.getActiveSheetId(),
|
|
49452
|
+
};
|
|
49397
49453
|
composerStore;
|
|
49398
49454
|
composerFocusStore;
|
|
49399
49455
|
composerInterface;
|
|
@@ -49423,7 +49479,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
49423
49479
|
return this.isCellReferenceVisible;
|
|
49424
49480
|
}
|
|
49425
49481
|
get cellReference() {
|
|
49426
|
-
const { col, row, sheetId } = this.
|
|
49482
|
+
const { col, row, sheetId } = this.currentEditedCell;
|
|
49427
49483
|
const prefixSheet = sheetId !== this.env.model.getters.getActiveSheetId();
|
|
49428
49484
|
return getFullReference(prefixSheet ? this.env.model.getters.getSheetName(sheetId) : undefined, toXC(col, row));
|
|
49429
49485
|
}
|
|
@@ -49515,12 +49571,17 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
49515
49571
|
if (!isEditing && this.composerFocusStore.activeComposer !== this.composerInterface) {
|
|
49516
49572
|
this.composerFocusStore.focusComposer(this.composerInterface, { focusMode: "inactive" });
|
|
49517
49573
|
}
|
|
49574
|
+
let shouldRecomputeRect = isEditing && !deepEquals(this.currentEditedCell, this.composerStore.currentEditedCell);
|
|
49518
49575
|
if (this.isEditing !== isEditing) {
|
|
49519
49576
|
this.isEditing = isEditing;
|
|
49520
49577
|
if (!isEditing) {
|
|
49521
49578
|
this.rect = this.defaultRect;
|
|
49522
49579
|
return;
|
|
49523
49580
|
}
|
|
49581
|
+
this.currentEditedCell = this.composerStore.currentEditedCell;
|
|
49582
|
+
shouldRecomputeRect = true;
|
|
49583
|
+
}
|
|
49584
|
+
if (shouldRecomputeRect) {
|
|
49524
49585
|
const position = this.env.model.getters.getActivePosition();
|
|
49525
49586
|
const zone = this.env.model.getters.expandZone(position.sheetId, positionToZone(position));
|
|
49526
49587
|
this.rect = this.env.model.getters.getVisibleRect(zone);
|
|
@@ -62488,6 +62549,23 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
62488
62549
|
static getters = ["getRowSize", "getHeaderSize"];
|
|
62489
62550
|
tallestCellInRow = {};
|
|
62490
62551
|
ctx = document.createElement("canvas").getContext("2d");
|
|
62552
|
+
beforeHandle(cmd) {
|
|
62553
|
+
switch (cmd.type) {
|
|
62554
|
+
// Ensure rows are updated before "UPDATE_CELL" is dispatched from cell plugin.
|
|
62555
|
+
// "UPDATE_CELL" uses the Sheet core plugin to access row data.
|
|
62556
|
+
// If "ADD_COLUMNS_ROWS" has not been processed yet by header_sizes_ui,
|
|
62557
|
+
// size updates may apply to incorrect (pre-insert) rows.
|
|
62558
|
+
case "ADD_COLUMNS_ROWS":
|
|
62559
|
+
if (cmd.dimension === "COL") {
|
|
62560
|
+
return;
|
|
62561
|
+
}
|
|
62562
|
+
const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
|
|
62563
|
+
const newCells = Array(cmd.quantity).fill(undefined);
|
|
62564
|
+
const newTallestCells = insertItemsAtIndex(this.tallestCellInRow[cmd.sheetId], newCells, addIndex);
|
|
62565
|
+
this.history.update("tallestCellInRow", cmd.sheetId, newTallestCells);
|
|
62566
|
+
break;
|
|
62567
|
+
}
|
|
62568
|
+
}
|
|
62491
62569
|
handle(cmd) {
|
|
62492
62570
|
switch (cmd.type) {
|
|
62493
62571
|
case "START":
|
|
@@ -62517,16 +62595,6 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
62517
62595
|
this.history.update("tallestCellInRow", cmd.sheetId, tallestCells);
|
|
62518
62596
|
break;
|
|
62519
62597
|
}
|
|
62520
|
-
case "ADD_COLUMNS_ROWS": {
|
|
62521
|
-
if (cmd.dimension === "COL") {
|
|
62522
|
-
return;
|
|
62523
|
-
}
|
|
62524
|
-
const addIndex = getAddHeaderStartIndex(cmd.position, cmd.base);
|
|
62525
|
-
const newCells = Array(cmd.quantity).fill(undefined);
|
|
62526
|
-
const newTallestCells = insertItemsAtIndex(this.tallestCellInRow[cmd.sheetId], newCells, addIndex);
|
|
62527
|
-
this.history.update("tallestCellInRow", cmd.sheetId, newTallestCells);
|
|
62528
|
-
break;
|
|
62529
|
-
}
|
|
62530
62598
|
case "RESIZE_COLUMNS_ROWS":
|
|
62531
62599
|
{
|
|
62532
62600
|
const sheetId = cmd.sheetId;
|
|
@@ -68267,6 +68335,14 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
68267
68335
|
const isBasedBefore = cmd.base < start;
|
|
68268
68336
|
const deltaCol = isBasedBefore && isCol ? thickness : 0;
|
|
68269
68337
|
const deltaRow = isBasedBefore && !isCol ? thickness : 0;
|
|
68338
|
+
const toRemove = isBasedBefore ? cmd.elements.map((el) => el + thickness) : cmd.elements;
|
|
68339
|
+
const originalSize = Object.fromEntries(toRemove.map((element) => {
|
|
68340
|
+
const size = isCol
|
|
68341
|
+
? this.getters.getColSize(cmd.sheetId, element)
|
|
68342
|
+
: this.getters.getUserRowSize(cmd.sheetId, element);
|
|
68343
|
+
const isDefaultCol = isCol && size === DEFAULT_CELL_WIDTH;
|
|
68344
|
+
return [element, isDefaultCol ? undefined : size];
|
|
68345
|
+
}));
|
|
68270
68346
|
const target = [
|
|
68271
68347
|
{
|
|
68272
68348
|
left: isCol ? start + deltaCol : 0,
|
|
@@ -68297,13 +68373,12 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
68297
68373
|
const col = selection.left;
|
|
68298
68374
|
const row = selection.top;
|
|
68299
68375
|
this.setSelectionMixin({ zone: selection, cell: { col, row } }, [selection]);
|
|
68300
|
-
const toRemove = isBasedBefore ? cmd.elements.map((el) => el + thickness) : cmd.elements;
|
|
68301
68376
|
let currentIndex = isBasedBefore ? cmd.base : cmd.base + 1;
|
|
68302
68377
|
const resizingGroups = {};
|
|
68303
68378
|
for (const element of toRemove) {
|
|
68304
|
-
const size =
|
|
68379
|
+
const size = originalSize[element];
|
|
68305
68380
|
const currentSize = this.getters.getHeaderSize(cmd.sheetId, cmd.dimension, currentIndex);
|
|
68306
|
-
if (size != currentSize) {
|
|
68381
|
+
if (size && size != currentSize) {
|
|
68307
68382
|
resizingGroups[size] ??= [];
|
|
68308
68383
|
resizingGroups[size].push(currentIndex);
|
|
68309
68384
|
currentIndex += 1;
|
|
@@ -70022,14 +70097,12 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
70022
70097
|
this.editionState = "initializing";
|
|
70023
70098
|
}
|
|
70024
70099
|
stopEdition() {
|
|
70025
|
-
|
|
70026
|
-
if (!this.state.isEditing || !input)
|
|
70100
|
+
if (!this.state.isEditing || !this.sheetNameRef.el)
|
|
70027
70101
|
return;
|
|
70028
70102
|
this.state.isEditing = false;
|
|
70029
70103
|
this.editionState = "initializing";
|
|
70030
|
-
|
|
70104
|
+
this.sheetNameRef.el.blur();
|
|
70031
70105
|
const inputValue = this.getInputContent() || "";
|
|
70032
|
-
input.innerText = inputValue;
|
|
70033
70106
|
interactiveRenameSheet(this.env, this.props.sheetId, inputValue, () => this.startEdition());
|
|
70034
70107
|
}
|
|
70035
70108
|
cancelEdition() {
|
|
@@ -72194,7 +72267,6 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
72194
72267
|
this.checkViewportSize();
|
|
72195
72268
|
stores.on("store-updated", this, render);
|
|
72196
72269
|
resizeObserver.observe(this.spreadsheetRef.el);
|
|
72197
|
-
registerChartJSExtensions();
|
|
72198
72270
|
});
|
|
72199
72271
|
owl.onWillUnmount(() => {
|
|
72200
72272
|
this.unbindModelEvents();
|
|
@@ -76705,9 +76777,9 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
76705
76777
|
exports.tokenize = tokenize;
|
|
76706
76778
|
|
|
76707
76779
|
|
|
76708
|
-
__info__.version = "18.1.
|
|
76709
|
-
__info__.date = "2025-
|
|
76710
|
-
__info__.hash = "
|
|
76780
|
+
__info__.version = "18.1.31";
|
|
76781
|
+
__info__.date = "2025-08-04T06:52:11.010Z";
|
|
76782
|
+
__info__.hash = "4f581fb";
|
|
76711
76783
|
|
|
76712
76784
|
|
|
76713
76785
|
})(this.o_spreadsheet = this.o_spreadsheet || {}, owl);
|