@odoo/o-spreadsheet 18.1.3 → 18.1.5
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 +64 -38
- package/dist/o-spreadsheet.d.ts +9 -4
- package/dist/o-spreadsheet.esm.js +64 -38
- package/dist/o-spreadsheet.iife.js +64 -38
- package/dist/o-spreadsheet.iife.min.js +112 -112
- package/dist/o_spreadsheet.xml +3 -3
- 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-01-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 18.1.5
|
|
6
|
+
* @date 2025-01-31T08:00:10.263Z
|
|
7
|
+
* @hash 97acb8b
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
'use strict';
|
|
@@ -3350,11 +3350,11 @@ const getInvaluableSymbolsRegexp = memoize(function getInvaluableSymbolsRegexp(l
|
|
|
3350
3350
|
* number from the point of view of the isNumber function.
|
|
3351
3351
|
*/
|
|
3352
3352
|
function parseNumber(str, locale) {
|
|
3353
|
+
// remove invaluable characters
|
|
3354
|
+
str = str.replace(getInvaluableSymbolsRegexp(locale), "");
|
|
3353
3355
|
if (locale.decimalSeparator !== ".") {
|
|
3354
3356
|
str = str.replace(locale.decimalSeparator, ".");
|
|
3355
3357
|
}
|
|
3356
|
-
// remove invaluable characters
|
|
3357
|
-
str = str.replace(getInvaluableSymbolsRegexp(locale), "");
|
|
3358
3358
|
let n = Number(str);
|
|
3359
3359
|
if (isNaN(n) && str.includes("%")) {
|
|
3360
3360
|
n = Number(str.split("%")[0]);
|
|
@@ -9658,13 +9658,13 @@ function toExcelDataset(getters, ds) {
|
|
|
9658
9658
|
else if (ds.labelCell) {
|
|
9659
9659
|
label = {
|
|
9660
9660
|
reference: getters.getRangeString(ds.labelCell, "forceSheetReference", {
|
|
9661
|
-
|
|
9661
|
+
useBoundedReference: true,
|
|
9662
9662
|
}),
|
|
9663
9663
|
};
|
|
9664
9664
|
}
|
|
9665
9665
|
return {
|
|
9666
9666
|
label,
|
|
9667
|
-
range: getters.getRangeString(dataRange, "forceSheetReference", {
|
|
9667
|
+
range: getters.getRangeString(dataRange, "forceSheetReference", { useBoundedReference: true }),
|
|
9668
9668
|
backgroundColor: ds.backgroundColor,
|
|
9669
9669
|
rightYAxis: ds.rightYAxis,
|
|
9670
9670
|
};
|
|
@@ -9679,7 +9679,7 @@ function toExcelLabelRange(getters, labelRange, shouldRemoveFirstLabel) {
|
|
|
9679
9679
|
zone.top = zone.top + 1;
|
|
9680
9680
|
}
|
|
9681
9681
|
const range = labelRange.clone({ zone });
|
|
9682
|
-
return getters.getRangeString(range, "forceSheetReference", {
|
|
9682
|
+
return getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
|
|
9683
9683
|
}
|
|
9684
9684
|
/**
|
|
9685
9685
|
* Transform a chart definition which supports dataSets (dataSets and LabelRange)
|
|
@@ -40369,6 +40369,12 @@ class Composer extends owl.Component {
|
|
|
40369
40369
|
}
|
|
40370
40370
|
this.contentHelper.updateEl(el);
|
|
40371
40371
|
});
|
|
40372
|
+
this.env.model.selection.observe(this, {
|
|
40373
|
+
handleEvent: () => this.autoCompleteState.hide(),
|
|
40374
|
+
});
|
|
40375
|
+
owl.onWillUnmount(() => {
|
|
40376
|
+
this.env.model.selection.detachObserver(this);
|
|
40377
|
+
});
|
|
40372
40378
|
owl.useEffect(() => {
|
|
40373
40379
|
this.processContent();
|
|
40374
40380
|
if (document.activeElement === this.contentHelper.el &&
|
|
@@ -53313,7 +53319,7 @@ class CellPlugin extends CorePlugin {
|
|
|
53313
53319
|
/*
|
|
53314
53320
|
* Reconstructs the original formula string based on new dependencies
|
|
53315
53321
|
*/
|
|
53316
|
-
getFormulaString(sheetId, tokens, dependencies,
|
|
53322
|
+
getFormulaString(sheetId, tokens, dependencies, useBoundedReference = false) {
|
|
53317
53323
|
if (!dependencies.length) {
|
|
53318
53324
|
return concat(tokens.map((token) => token.value));
|
|
53319
53325
|
}
|
|
@@ -53321,7 +53327,7 @@ class CellPlugin extends CorePlugin {
|
|
|
53321
53327
|
return concat(tokens.map((token) => {
|
|
53322
53328
|
if (token.type === "REFERENCE") {
|
|
53323
53329
|
const range = dependencies[rangeIndex++];
|
|
53324
|
-
return this.getters.getRangeString(range, sheetId, {
|
|
53330
|
+
return this.getters.getRangeString(range, sheetId, { useBoundedReference });
|
|
53325
53331
|
}
|
|
53326
53332
|
return token.value;
|
|
53327
53333
|
}));
|
|
@@ -53601,7 +53607,7 @@ class FormulaCellWithDependencies {
|
|
|
53601
53607
|
if (token.type === "REFERENCE") {
|
|
53602
53608
|
const index = rangeIndex++;
|
|
53603
53609
|
return this.getRangeString(this.compiledFormula.dependencies[index], this.sheetId, {
|
|
53604
|
-
|
|
53610
|
+
useBoundedReference: true,
|
|
53605
53611
|
});
|
|
53606
53612
|
}
|
|
53607
53613
|
return token.value;
|
|
@@ -53938,7 +53944,7 @@ class ConditionalFormatPlugin extends CorePlugin {
|
|
|
53938
53944
|
if (data.sheets) {
|
|
53939
53945
|
for (let sheet of data.sheets) {
|
|
53940
53946
|
if (this.cfRules[sheet.id]) {
|
|
53941
|
-
sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, {
|
|
53947
|
+
sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useBoundedReference: true }));
|
|
53942
53948
|
}
|
|
53943
53949
|
}
|
|
53944
53950
|
}
|
|
@@ -54007,9 +54013,9 @@ class ConditionalFormatPlugin extends CorePlugin {
|
|
|
54007
54013
|
// ---------------------------------------------------------------------------
|
|
54008
54014
|
// Private
|
|
54009
54015
|
// ---------------------------------------------------------------------------
|
|
54010
|
-
mapToConditionalFormat(sheetId, cf, {
|
|
54016
|
+
mapToConditionalFormat(sheetId, cf, { useBoundedReference } = { useBoundedReference: false }) {
|
|
54011
54017
|
const ranges = cf.ranges.map((range) => {
|
|
54012
|
-
return this.getters.getRangeString(range, sheetId, {
|
|
54018
|
+
return this.getters.getRangeString(range, sheetId, { useBoundedReference });
|
|
54013
54019
|
});
|
|
54014
54020
|
if (cf.rule.type !== "DataBarRule") {
|
|
54015
54021
|
return {
|
|
@@ -54024,7 +54030,7 @@ class ConditionalFormatPlugin extends CorePlugin {
|
|
|
54024
54030
|
...cf.rule,
|
|
54025
54031
|
rangeValues: cf.rule.rangeValues &&
|
|
54026
54032
|
this.getters.getRangeString(cf.rule.rangeValues, sheetId, {
|
|
54027
|
-
|
|
54033
|
+
useBoundedReference,
|
|
54028
54034
|
}),
|
|
54029
54035
|
},
|
|
54030
54036
|
ranges,
|
|
@@ -54465,10 +54471,20 @@ class DataValidationPlugin extends CorePlugin {
|
|
|
54465
54471
|
for (const sheet of data.sheets) {
|
|
54466
54472
|
sheet.dataValidationRules = [];
|
|
54467
54473
|
for (const rule of this.rules[sheet.id]) {
|
|
54468
|
-
|
|
54469
|
-
...rule,
|
|
54470
|
-
ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, {
|
|
54471
|
-
}
|
|
54474
|
+
const excelRule = {
|
|
54475
|
+
...deepCopy(rule),
|
|
54476
|
+
ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useBoundedReference: true })),
|
|
54477
|
+
};
|
|
54478
|
+
if (rule.criterion.type === "isValueInRange") {
|
|
54479
|
+
excelRule.criterion.values = rule.criterion.values.map((value) => {
|
|
54480
|
+
const range = this.getters.getRangeFromSheetXC(sheet.id, value);
|
|
54481
|
+
return this.getters.getRangeString(range, sheet.id, {
|
|
54482
|
+
useBoundedReference: true,
|
|
54483
|
+
useFixedReference: true,
|
|
54484
|
+
});
|
|
54485
|
+
});
|
|
54486
|
+
}
|
|
54487
|
+
sheet.dataValidationRules.push(excelRule);
|
|
54472
54488
|
}
|
|
54473
54489
|
}
|
|
54474
54490
|
}
|
|
@@ -55889,9 +55905,10 @@ class RangeAdapter {
|
|
|
55889
55905
|
* @param range the range (received from getRangeFromXC or getRangeFromZone)
|
|
55890
55906
|
* @param forSheetId the id of the sheet where the range string is supposed to be used.
|
|
55891
55907
|
* @param options
|
|
55908
|
+
* @param options.useBoundedReference if true, the range will be returned with bounded row and column
|
|
55892
55909
|
* @param options.useFixedReference if true, the range will be returned with fixed row and column
|
|
55893
55910
|
*/
|
|
55894
|
-
getRangeString(range, forSheetId, options = { useFixedReference: false }) {
|
|
55911
|
+
getRangeString(range, forSheetId, options = { useBoundedReference: false, useFixedReference: false }) {
|
|
55895
55912
|
if (!range) {
|
|
55896
55913
|
return CellErrorType.InvalidReference;
|
|
55897
55914
|
}
|
|
@@ -55994,13 +56011,13 @@ class RangeAdapter {
|
|
|
55994
56011
|
/**
|
|
55995
56012
|
* Get a Xc string that represent a part of a range
|
|
55996
56013
|
*/
|
|
55997
|
-
getRangePartString(range, part, options = { useFixedReference: false }) {
|
|
55998
|
-
const colFixed = range.parts
|
|
56014
|
+
getRangePartString(range, part, options = { useBoundedReference: false, useFixedReference: false }) {
|
|
56015
|
+
const colFixed = range.parts[part]?.colFixed || options.useFixedReference ? "$" : "";
|
|
55999
56016
|
const col = part === 0 ? numberToLetters(range.zone.left) : numberToLetters(range.zone.right);
|
|
56000
|
-
const rowFixed = range.parts
|
|
56017
|
+
const rowFixed = range.parts[part]?.rowFixed || options.useFixedReference ? "$" : "";
|
|
56001
56018
|
const row = part === 0 ? String(range.zone.top + 1) : String(range.zone.bottom + 1);
|
|
56002
56019
|
let str = "";
|
|
56003
|
-
if (range.isFullCol && !options.
|
|
56020
|
+
if (range.isFullCol && !options.useBoundedReference) {
|
|
56004
56021
|
if (part === 0 && range.unboundedZone.hasHeader) {
|
|
56005
56022
|
str = colFixed + col + rowFixed + row;
|
|
56006
56023
|
}
|
|
@@ -56008,7 +56025,7 @@ class RangeAdapter {
|
|
|
56008
56025
|
str = colFixed + col;
|
|
56009
56026
|
}
|
|
56010
56027
|
}
|
|
56011
|
-
else if (range.isFullRow && !options.
|
|
56028
|
+
else if (range.isFullRow && !options.useBoundedReference) {
|
|
56012
56029
|
if (part === 0 && range.unboundedZone.hasHeader) {
|
|
56013
56030
|
str = colFixed + col + rowFixed + row;
|
|
56014
56031
|
}
|
|
@@ -61309,7 +61326,7 @@ function withPivotPresentationLayer (PivotClass) {
|
|
|
61309
61326
|
const symbolIndex = rowDomain.findIndex((row) => row.field === symbolName);
|
|
61310
61327
|
return this.getPivotHeaderValueAndFormat(rowDomain.slice(0, symbolIndex + 1));
|
|
61311
61328
|
}
|
|
61312
|
-
return this.
|
|
61329
|
+
return this.getPivotCellValueAndFormat(symbolName, domain);
|
|
61313
61330
|
};
|
|
61314
61331
|
const result = this.getters.evaluateCompiledFormula(measure.computedBy.sheetId, formula, getSymbolValue);
|
|
61315
61332
|
if (isMatrix(result)) {
|
|
@@ -63187,6 +63204,7 @@ class Session extends EventBus {
|
|
|
63187
63204
|
waitingUndoRedoAck = false;
|
|
63188
63205
|
isReplayingInitialRevisions = false;
|
|
63189
63206
|
processedRevisions = new Set();
|
|
63207
|
+
lastRevisionMessage = undefined;
|
|
63190
63208
|
uuidGenerator = new UuidGenerator();
|
|
63191
63209
|
lastLocalOperation;
|
|
63192
63210
|
/**
|
|
@@ -63287,7 +63305,10 @@ class Session extends EventBus {
|
|
|
63287
63305
|
* Notify the server that the user client left the collaborative session
|
|
63288
63306
|
*/
|
|
63289
63307
|
async leave(data) {
|
|
63290
|
-
if (data &&
|
|
63308
|
+
if (data &&
|
|
63309
|
+
Object.keys(this.clients).length === 1 &&
|
|
63310
|
+
this.lastRevisionMessage &&
|
|
63311
|
+
this.lastRevisionMessage?.type !== "SNAPSHOT_CREATED") {
|
|
63291
63312
|
await this.snapshot(data());
|
|
63292
63313
|
}
|
|
63293
63314
|
delete this.clients[this.clientId];
|
|
@@ -63508,6 +63529,7 @@ class Session extends EventBus {
|
|
|
63508
63529
|
this.pendingMessages = this.pendingMessages.filter((msg) => msg.nextRevisionId !== message.nextRevisionId);
|
|
63509
63530
|
this.serverRevisionId = message.nextRevisionId;
|
|
63510
63531
|
this.processedRevisions.add(message.nextRevisionId);
|
|
63532
|
+
this.lastRevisionMessage = message;
|
|
63511
63533
|
this.sendPendingMessage();
|
|
63512
63534
|
break;
|
|
63513
63535
|
}
|
|
@@ -64475,14 +64497,12 @@ class SheetUIPlugin extends UIPlugin {
|
|
|
64475
64497
|
}
|
|
64476
64498
|
break;
|
|
64477
64499
|
case "AUTORESIZE_ROWS":
|
|
64478
|
-
|
|
64479
|
-
|
|
64480
|
-
|
|
64481
|
-
|
|
64482
|
-
|
|
64483
|
-
|
|
64484
|
-
});
|
|
64485
|
-
}
|
|
64500
|
+
this.dispatch("RESIZE_COLUMNS_ROWS", {
|
|
64501
|
+
elements: cmd.rows,
|
|
64502
|
+
dimension: "ROW",
|
|
64503
|
+
size: null,
|
|
64504
|
+
sheetId: cmd.sheetId,
|
|
64505
|
+
});
|
|
64486
64506
|
break;
|
|
64487
64507
|
}
|
|
64488
64508
|
}
|
|
@@ -71506,6 +71526,9 @@ class EventStream {
|
|
|
71506
71526
|
observe(owner, callbacks) {
|
|
71507
71527
|
this.observers.set(owner, { owner, callbacks });
|
|
71508
71528
|
}
|
|
71529
|
+
detachObserver(owner) {
|
|
71530
|
+
this.observers.delete(owner);
|
|
71531
|
+
}
|
|
71509
71532
|
/**
|
|
71510
71533
|
* Capture the stream for yourself
|
|
71511
71534
|
*/
|
|
@@ -71598,6 +71621,9 @@ class SelectionStreamProcessorImpl {
|
|
|
71598
71621
|
observe(owner, callbacks) {
|
|
71599
71622
|
this.stream.observe(owner, callbacks);
|
|
71600
71623
|
}
|
|
71624
|
+
detachObserver(owner) {
|
|
71625
|
+
this.stream.detachObserver(owner);
|
|
71626
|
+
}
|
|
71601
71627
|
release(owner) {
|
|
71602
71628
|
if (this.stream.isListening(owner)) {
|
|
71603
71629
|
this.stream.release(owner);
|
|
@@ -75017,6 +75043,6 @@ exports.tokenColors = tokenColors;
|
|
|
75017
75043
|
exports.tokenize = tokenize;
|
|
75018
75044
|
|
|
75019
75045
|
|
|
75020
|
-
__info__.version = "18.1.
|
|
75021
|
-
__info__.date = "2025-01-
|
|
75022
|
-
__info__.hash = "
|
|
75046
|
+
__info__.version = "18.1.5";
|
|
75047
|
+
__info__.date = "2025-01-31T08:00:10.263Z";
|
|
75048
|
+
__info__.hash = "97acb8b";
|
package/dist/o-spreadsheet.d.ts
CHANGED
|
@@ -1186,6 +1186,7 @@ declare class Session extends EventBus<CollaborativeEvent> {
|
|
|
1186
1186
|
private waitingUndoRedoAck;
|
|
1187
1187
|
private isReplayingInitialRevisions;
|
|
1188
1188
|
private processedRevisions;
|
|
1189
|
+
private lastRevisionMessage;
|
|
1189
1190
|
private uuidGenerator;
|
|
1190
1191
|
private lastLocalOperation;
|
|
1191
1192
|
/**
|
|
@@ -1531,6 +1532,7 @@ type StatefulStream<Event, State> = {
|
|
|
1531
1532
|
resetDefaultAnchor: (owner: unknown, state: State) => void;
|
|
1532
1533
|
resetAnchor: (owner: unknown, state: State) => void;
|
|
1533
1534
|
observe: (owner: unknown, callbacks: StreamCallbacks<Event>) => void;
|
|
1535
|
+
detachObserver: (owner: unknown) => void;
|
|
1534
1536
|
release: (owner: unknown) => void;
|
|
1535
1537
|
getBackToDefault(): void;
|
|
1536
1538
|
};
|
|
@@ -3977,6 +3979,10 @@ interface SpreadsheetChildEnv extends NotificationStoreMethods {
|
|
|
3977
3979
|
getStore: Get;
|
|
3978
3980
|
}
|
|
3979
3981
|
|
|
3982
|
+
interface RangeStringOptions {
|
|
3983
|
+
useBoundedReference?: boolean;
|
|
3984
|
+
useFixedReference?: boolean;
|
|
3985
|
+
}
|
|
3980
3986
|
declare class RangeAdapter implements CommandHandler<CoreCommand> {
|
|
3981
3987
|
private getters;
|
|
3982
3988
|
private providers;
|
|
@@ -4024,11 +4030,10 @@ declare class RangeAdapter implements CommandHandler<CoreCommand> {
|
|
|
4024
4030
|
* @param range the range (received from getRangeFromXC or getRangeFromZone)
|
|
4025
4031
|
* @param forSheetId the id of the sheet where the range string is supposed to be used.
|
|
4026
4032
|
* @param options
|
|
4033
|
+
* @param options.useBoundedReference if true, the range will be returned with bounded row and column
|
|
4027
4034
|
* @param options.useFixedReference if true, the range will be returned with fixed row and column
|
|
4028
4035
|
*/
|
|
4029
|
-
getRangeString(range: Range, forSheetId: UID, options?:
|
|
4030
|
-
useFixedReference: boolean;
|
|
4031
|
-
}): string;
|
|
4036
|
+
getRangeString(range: Range, forSheetId: UID, options?: RangeStringOptions): string;
|
|
4032
4037
|
getRangeDataFromXc(sheetId: UID, xc: string): RangeData;
|
|
4033
4038
|
getRangeDataFromZone(sheetId: UID, zone: Zone | UnboundedZone): RangeData;
|
|
4034
4039
|
getRangeFromZone(sheetId: UID, zone: Zone | UnboundedZone): Range;
|
|
@@ -4262,7 +4267,7 @@ declare class CellPlugin extends CorePlugin<CoreState$1> implements CoreState$1
|
|
|
4262
4267
|
* starting an async evaluation even if it has been moved or re-allocated
|
|
4263
4268
|
*/
|
|
4264
4269
|
getCellById(cellId: UID): Cell | undefined;
|
|
4265
|
-
getFormulaString(sheetId: UID, tokens: Token[], dependencies: Range[],
|
|
4270
|
+
getFormulaString(sheetId: UID, tokens: Token[], dependencies: Range[], useBoundedReference?: boolean): string;
|
|
4266
4271
|
getTranslatedCellFormula(sheetId: UID, offsetX: number, offsetY: number, tokens: Token[]): string;
|
|
4267
4272
|
getFormulaMovedInSheet(originSheetId: UID, targetSheetId: UID, tokens: Token[]): string;
|
|
4268
4273
|
getCellStyle(position: CellPosition): Style;
|
|
@@ -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-01-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 18.1.5
|
|
6
|
+
* @date 2025-01-31T08:00:10.263Z
|
|
7
|
+
* @hash 97acb8b
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { useEnv, useSubEnv, onWillUnmount, useComponent, status, Component, useRef, onMounted, useEffect, useState, onPatched, onWillPatch, onWillUpdateProps, useExternalListener, onWillStart, xml, useChildSubEnv, markRaw, toRaw } from '@odoo/owl';
|
|
@@ -3348,11 +3348,11 @@ const getInvaluableSymbolsRegexp = memoize(function getInvaluableSymbolsRegexp(l
|
|
|
3348
3348
|
* number from the point of view of the isNumber function.
|
|
3349
3349
|
*/
|
|
3350
3350
|
function parseNumber(str, locale) {
|
|
3351
|
+
// remove invaluable characters
|
|
3352
|
+
str = str.replace(getInvaluableSymbolsRegexp(locale), "");
|
|
3351
3353
|
if (locale.decimalSeparator !== ".") {
|
|
3352
3354
|
str = str.replace(locale.decimalSeparator, ".");
|
|
3353
3355
|
}
|
|
3354
|
-
// remove invaluable characters
|
|
3355
|
-
str = str.replace(getInvaluableSymbolsRegexp(locale), "");
|
|
3356
3356
|
let n = Number(str);
|
|
3357
3357
|
if (isNaN(n) && str.includes("%")) {
|
|
3358
3358
|
n = Number(str.split("%")[0]);
|
|
@@ -9656,13 +9656,13 @@ function toExcelDataset(getters, ds) {
|
|
|
9656
9656
|
else if (ds.labelCell) {
|
|
9657
9657
|
label = {
|
|
9658
9658
|
reference: getters.getRangeString(ds.labelCell, "forceSheetReference", {
|
|
9659
|
-
|
|
9659
|
+
useBoundedReference: true,
|
|
9660
9660
|
}),
|
|
9661
9661
|
};
|
|
9662
9662
|
}
|
|
9663
9663
|
return {
|
|
9664
9664
|
label,
|
|
9665
|
-
range: getters.getRangeString(dataRange, "forceSheetReference", {
|
|
9665
|
+
range: getters.getRangeString(dataRange, "forceSheetReference", { useBoundedReference: true }),
|
|
9666
9666
|
backgroundColor: ds.backgroundColor,
|
|
9667
9667
|
rightYAxis: ds.rightYAxis,
|
|
9668
9668
|
};
|
|
@@ -9677,7 +9677,7 @@ function toExcelLabelRange(getters, labelRange, shouldRemoveFirstLabel) {
|
|
|
9677
9677
|
zone.top = zone.top + 1;
|
|
9678
9678
|
}
|
|
9679
9679
|
const range = labelRange.clone({ zone });
|
|
9680
|
-
return getters.getRangeString(range, "forceSheetReference", {
|
|
9680
|
+
return getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
|
|
9681
9681
|
}
|
|
9682
9682
|
/**
|
|
9683
9683
|
* Transform a chart definition which supports dataSets (dataSets and LabelRange)
|
|
@@ -40367,6 +40367,12 @@ class Composer extends Component {
|
|
|
40367
40367
|
}
|
|
40368
40368
|
this.contentHelper.updateEl(el);
|
|
40369
40369
|
});
|
|
40370
|
+
this.env.model.selection.observe(this, {
|
|
40371
|
+
handleEvent: () => this.autoCompleteState.hide(),
|
|
40372
|
+
});
|
|
40373
|
+
onWillUnmount(() => {
|
|
40374
|
+
this.env.model.selection.detachObserver(this);
|
|
40375
|
+
});
|
|
40370
40376
|
useEffect(() => {
|
|
40371
40377
|
this.processContent();
|
|
40372
40378
|
if (document.activeElement === this.contentHelper.el &&
|
|
@@ -53311,7 +53317,7 @@ class CellPlugin extends CorePlugin {
|
|
|
53311
53317
|
/*
|
|
53312
53318
|
* Reconstructs the original formula string based on new dependencies
|
|
53313
53319
|
*/
|
|
53314
|
-
getFormulaString(sheetId, tokens, dependencies,
|
|
53320
|
+
getFormulaString(sheetId, tokens, dependencies, useBoundedReference = false) {
|
|
53315
53321
|
if (!dependencies.length) {
|
|
53316
53322
|
return concat(tokens.map((token) => token.value));
|
|
53317
53323
|
}
|
|
@@ -53319,7 +53325,7 @@ class CellPlugin extends CorePlugin {
|
|
|
53319
53325
|
return concat(tokens.map((token) => {
|
|
53320
53326
|
if (token.type === "REFERENCE") {
|
|
53321
53327
|
const range = dependencies[rangeIndex++];
|
|
53322
|
-
return this.getters.getRangeString(range, sheetId, {
|
|
53328
|
+
return this.getters.getRangeString(range, sheetId, { useBoundedReference });
|
|
53323
53329
|
}
|
|
53324
53330
|
return token.value;
|
|
53325
53331
|
}));
|
|
@@ -53599,7 +53605,7 @@ class FormulaCellWithDependencies {
|
|
|
53599
53605
|
if (token.type === "REFERENCE") {
|
|
53600
53606
|
const index = rangeIndex++;
|
|
53601
53607
|
return this.getRangeString(this.compiledFormula.dependencies[index], this.sheetId, {
|
|
53602
|
-
|
|
53608
|
+
useBoundedReference: true,
|
|
53603
53609
|
});
|
|
53604
53610
|
}
|
|
53605
53611
|
return token.value;
|
|
@@ -53936,7 +53942,7 @@ class ConditionalFormatPlugin extends CorePlugin {
|
|
|
53936
53942
|
if (data.sheets) {
|
|
53937
53943
|
for (let sheet of data.sheets) {
|
|
53938
53944
|
if (this.cfRules[sheet.id]) {
|
|
53939
|
-
sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, {
|
|
53945
|
+
sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useBoundedReference: true }));
|
|
53940
53946
|
}
|
|
53941
53947
|
}
|
|
53942
53948
|
}
|
|
@@ -54005,9 +54011,9 @@ class ConditionalFormatPlugin extends CorePlugin {
|
|
|
54005
54011
|
// ---------------------------------------------------------------------------
|
|
54006
54012
|
// Private
|
|
54007
54013
|
// ---------------------------------------------------------------------------
|
|
54008
|
-
mapToConditionalFormat(sheetId, cf, {
|
|
54014
|
+
mapToConditionalFormat(sheetId, cf, { useBoundedReference } = { useBoundedReference: false }) {
|
|
54009
54015
|
const ranges = cf.ranges.map((range) => {
|
|
54010
|
-
return this.getters.getRangeString(range, sheetId, {
|
|
54016
|
+
return this.getters.getRangeString(range, sheetId, { useBoundedReference });
|
|
54011
54017
|
});
|
|
54012
54018
|
if (cf.rule.type !== "DataBarRule") {
|
|
54013
54019
|
return {
|
|
@@ -54022,7 +54028,7 @@ class ConditionalFormatPlugin extends CorePlugin {
|
|
|
54022
54028
|
...cf.rule,
|
|
54023
54029
|
rangeValues: cf.rule.rangeValues &&
|
|
54024
54030
|
this.getters.getRangeString(cf.rule.rangeValues, sheetId, {
|
|
54025
|
-
|
|
54031
|
+
useBoundedReference,
|
|
54026
54032
|
}),
|
|
54027
54033
|
},
|
|
54028
54034
|
ranges,
|
|
@@ -54463,10 +54469,20 @@ class DataValidationPlugin extends CorePlugin {
|
|
|
54463
54469
|
for (const sheet of data.sheets) {
|
|
54464
54470
|
sheet.dataValidationRules = [];
|
|
54465
54471
|
for (const rule of this.rules[sheet.id]) {
|
|
54466
|
-
|
|
54467
|
-
...rule,
|
|
54468
|
-
ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, {
|
|
54469
|
-
}
|
|
54472
|
+
const excelRule = {
|
|
54473
|
+
...deepCopy(rule),
|
|
54474
|
+
ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useBoundedReference: true })),
|
|
54475
|
+
};
|
|
54476
|
+
if (rule.criterion.type === "isValueInRange") {
|
|
54477
|
+
excelRule.criterion.values = rule.criterion.values.map((value) => {
|
|
54478
|
+
const range = this.getters.getRangeFromSheetXC(sheet.id, value);
|
|
54479
|
+
return this.getters.getRangeString(range, sheet.id, {
|
|
54480
|
+
useBoundedReference: true,
|
|
54481
|
+
useFixedReference: true,
|
|
54482
|
+
});
|
|
54483
|
+
});
|
|
54484
|
+
}
|
|
54485
|
+
sheet.dataValidationRules.push(excelRule);
|
|
54470
54486
|
}
|
|
54471
54487
|
}
|
|
54472
54488
|
}
|
|
@@ -55887,9 +55903,10 @@ class RangeAdapter {
|
|
|
55887
55903
|
* @param range the range (received from getRangeFromXC or getRangeFromZone)
|
|
55888
55904
|
* @param forSheetId the id of the sheet where the range string is supposed to be used.
|
|
55889
55905
|
* @param options
|
|
55906
|
+
* @param options.useBoundedReference if true, the range will be returned with bounded row and column
|
|
55890
55907
|
* @param options.useFixedReference if true, the range will be returned with fixed row and column
|
|
55891
55908
|
*/
|
|
55892
|
-
getRangeString(range, forSheetId, options = { useFixedReference: false }) {
|
|
55909
|
+
getRangeString(range, forSheetId, options = { useBoundedReference: false, useFixedReference: false }) {
|
|
55893
55910
|
if (!range) {
|
|
55894
55911
|
return CellErrorType.InvalidReference;
|
|
55895
55912
|
}
|
|
@@ -55992,13 +56009,13 @@ class RangeAdapter {
|
|
|
55992
56009
|
/**
|
|
55993
56010
|
* Get a Xc string that represent a part of a range
|
|
55994
56011
|
*/
|
|
55995
|
-
getRangePartString(range, part, options = { useFixedReference: false }) {
|
|
55996
|
-
const colFixed = range.parts
|
|
56012
|
+
getRangePartString(range, part, options = { useBoundedReference: false, useFixedReference: false }) {
|
|
56013
|
+
const colFixed = range.parts[part]?.colFixed || options.useFixedReference ? "$" : "";
|
|
55997
56014
|
const col = part === 0 ? numberToLetters(range.zone.left) : numberToLetters(range.zone.right);
|
|
55998
|
-
const rowFixed = range.parts
|
|
56015
|
+
const rowFixed = range.parts[part]?.rowFixed || options.useFixedReference ? "$" : "";
|
|
55999
56016
|
const row = part === 0 ? String(range.zone.top + 1) : String(range.zone.bottom + 1);
|
|
56000
56017
|
let str = "";
|
|
56001
|
-
if (range.isFullCol && !options.
|
|
56018
|
+
if (range.isFullCol && !options.useBoundedReference) {
|
|
56002
56019
|
if (part === 0 && range.unboundedZone.hasHeader) {
|
|
56003
56020
|
str = colFixed + col + rowFixed + row;
|
|
56004
56021
|
}
|
|
@@ -56006,7 +56023,7 @@ class RangeAdapter {
|
|
|
56006
56023
|
str = colFixed + col;
|
|
56007
56024
|
}
|
|
56008
56025
|
}
|
|
56009
|
-
else if (range.isFullRow && !options.
|
|
56026
|
+
else if (range.isFullRow && !options.useBoundedReference) {
|
|
56010
56027
|
if (part === 0 && range.unboundedZone.hasHeader) {
|
|
56011
56028
|
str = colFixed + col + rowFixed + row;
|
|
56012
56029
|
}
|
|
@@ -61307,7 +61324,7 @@ function withPivotPresentationLayer (PivotClass) {
|
|
|
61307
61324
|
const symbolIndex = rowDomain.findIndex((row) => row.field === symbolName);
|
|
61308
61325
|
return this.getPivotHeaderValueAndFormat(rowDomain.slice(0, symbolIndex + 1));
|
|
61309
61326
|
}
|
|
61310
|
-
return this.
|
|
61327
|
+
return this.getPivotCellValueAndFormat(symbolName, domain);
|
|
61311
61328
|
};
|
|
61312
61329
|
const result = this.getters.evaluateCompiledFormula(measure.computedBy.sheetId, formula, getSymbolValue);
|
|
61313
61330
|
if (isMatrix(result)) {
|
|
@@ -63185,6 +63202,7 @@ class Session extends EventBus {
|
|
|
63185
63202
|
waitingUndoRedoAck = false;
|
|
63186
63203
|
isReplayingInitialRevisions = false;
|
|
63187
63204
|
processedRevisions = new Set();
|
|
63205
|
+
lastRevisionMessage = undefined;
|
|
63188
63206
|
uuidGenerator = new UuidGenerator();
|
|
63189
63207
|
lastLocalOperation;
|
|
63190
63208
|
/**
|
|
@@ -63285,7 +63303,10 @@ class Session extends EventBus {
|
|
|
63285
63303
|
* Notify the server that the user client left the collaborative session
|
|
63286
63304
|
*/
|
|
63287
63305
|
async leave(data) {
|
|
63288
|
-
if (data &&
|
|
63306
|
+
if (data &&
|
|
63307
|
+
Object.keys(this.clients).length === 1 &&
|
|
63308
|
+
this.lastRevisionMessage &&
|
|
63309
|
+
this.lastRevisionMessage?.type !== "SNAPSHOT_CREATED") {
|
|
63289
63310
|
await this.snapshot(data());
|
|
63290
63311
|
}
|
|
63291
63312
|
delete this.clients[this.clientId];
|
|
@@ -63506,6 +63527,7 @@ class Session extends EventBus {
|
|
|
63506
63527
|
this.pendingMessages = this.pendingMessages.filter((msg) => msg.nextRevisionId !== message.nextRevisionId);
|
|
63507
63528
|
this.serverRevisionId = message.nextRevisionId;
|
|
63508
63529
|
this.processedRevisions.add(message.nextRevisionId);
|
|
63530
|
+
this.lastRevisionMessage = message;
|
|
63509
63531
|
this.sendPendingMessage();
|
|
63510
63532
|
break;
|
|
63511
63533
|
}
|
|
@@ -64473,14 +64495,12 @@ class SheetUIPlugin extends UIPlugin {
|
|
|
64473
64495
|
}
|
|
64474
64496
|
break;
|
|
64475
64497
|
case "AUTORESIZE_ROWS":
|
|
64476
|
-
|
|
64477
|
-
|
|
64478
|
-
|
|
64479
|
-
|
|
64480
|
-
|
|
64481
|
-
|
|
64482
|
-
});
|
|
64483
|
-
}
|
|
64498
|
+
this.dispatch("RESIZE_COLUMNS_ROWS", {
|
|
64499
|
+
elements: cmd.rows,
|
|
64500
|
+
dimension: "ROW",
|
|
64501
|
+
size: null,
|
|
64502
|
+
sheetId: cmd.sheetId,
|
|
64503
|
+
});
|
|
64484
64504
|
break;
|
|
64485
64505
|
}
|
|
64486
64506
|
}
|
|
@@ -71504,6 +71524,9 @@ class EventStream {
|
|
|
71504
71524
|
observe(owner, callbacks) {
|
|
71505
71525
|
this.observers.set(owner, { owner, callbacks });
|
|
71506
71526
|
}
|
|
71527
|
+
detachObserver(owner) {
|
|
71528
|
+
this.observers.delete(owner);
|
|
71529
|
+
}
|
|
71507
71530
|
/**
|
|
71508
71531
|
* Capture the stream for yourself
|
|
71509
71532
|
*/
|
|
@@ -71596,6 +71619,9 @@ class SelectionStreamProcessorImpl {
|
|
|
71596
71619
|
observe(owner, callbacks) {
|
|
71597
71620
|
this.stream.observe(owner, callbacks);
|
|
71598
71621
|
}
|
|
71622
|
+
detachObserver(owner) {
|
|
71623
|
+
this.stream.detachObserver(owner);
|
|
71624
|
+
}
|
|
71599
71625
|
release(owner) {
|
|
71600
71626
|
if (this.stream.isListening(owner)) {
|
|
71601
71627
|
this.stream.release(owner);
|
|
@@ -74971,6 +74997,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
|
|
|
74971
74997
|
export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, CommandResult, CorePlugin, DispatchResult, EvaluationError, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, chartHelpers, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, hooks, invalidateCFEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
|
|
74972
74998
|
|
|
74973
74999
|
|
|
74974
|
-
__info__.version = "18.1.
|
|
74975
|
-
__info__.date = "2025-01-
|
|
74976
|
-
__info__.hash = "
|
|
75000
|
+
__info__.version = "18.1.5";
|
|
75001
|
+
__info__.date = "2025-01-31T08:00:10.263Z";
|
|
75002
|
+
__info__.hash = "97acb8b";
|