@odoo/o-spreadsheet 18.0.11 → 18.0.12
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 +68 -32
- package/dist/o-spreadsheet.d.ts +8 -4
- package/dist/o-spreadsheet.esm.js +68 -32
- package/dist/o-spreadsheet.iife.js +68 -32
- package/dist/o-spreadsheet.iife.min.js +55 -55
- 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.0.
|
|
6
|
-
* @date 2025-01-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 18.0.12
|
|
6
|
+
* @date 2025-01-29T06:24:22.122Z
|
|
7
|
+
* @hash a881cff
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
(function (exports, owl) {
|
|
@@ -9456,13 +9456,13 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
9456
9456
|
else if (ds.labelCell) {
|
|
9457
9457
|
label = {
|
|
9458
9458
|
reference: getters.getRangeString(ds.labelCell, "forceSheetReference", {
|
|
9459
|
-
|
|
9459
|
+
useBoundedReference: true,
|
|
9460
9460
|
}),
|
|
9461
9461
|
};
|
|
9462
9462
|
}
|
|
9463
9463
|
return {
|
|
9464
9464
|
label,
|
|
9465
|
-
range: getters.getRangeString(dataRange, "forceSheetReference", {
|
|
9465
|
+
range: getters.getRangeString(dataRange, "forceSheetReference", { useBoundedReference: true }),
|
|
9466
9466
|
backgroundColor: ds.backgroundColor,
|
|
9467
9467
|
rightYAxis: ds.rightYAxis,
|
|
9468
9468
|
};
|
|
@@ -9477,7 +9477,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
9477
9477
|
zone.top = zone.top + 1;
|
|
9478
9478
|
}
|
|
9479
9479
|
const range = labelRange.clone({ zone });
|
|
9480
|
-
return getters.getRangeString(range, "forceSheetReference", {
|
|
9480
|
+
return getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
|
|
9481
9481
|
}
|
|
9482
9482
|
/**
|
|
9483
9483
|
* Transform a chart definition which supports dataSets (dataSets and LabelRange)
|
|
@@ -9641,11 +9641,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
9641
9641
|
if (values.length < 2 || labels.length < 2 || newLabels.length === 0) {
|
|
9642
9642
|
return [];
|
|
9643
9643
|
}
|
|
9644
|
-
const
|
|
9645
|
-
const labelMax = Math.max(...labels);
|
|
9646
|
-
const labelRange = labelMax - labelMin;
|
|
9647
|
-
const normalizedLabels = labels.map((v) => (v - labelMin) / labelRange);
|
|
9648
|
-
const normalizedNewLabels = newLabels.map((v) => (v - labelMin) / labelRange);
|
|
9644
|
+
const { normalizedLabels, normalizedNewLabels } = normalizeLabels(labels, newLabels, config);
|
|
9649
9645
|
try {
|
|
9650
9646
|
switch (config.type) {
|
|
9651
9647
|
case "polynomial": {
|
|
@@ -9684,6 +9680,30 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
9684
9680
|
return Array.from({ length: newLabels.length }, () => NaN);
|
|
9685
9681
|
}
|
|
9686
9682
|
}
|
|
9683
|
+
function normalizeLabels(labels, newLabels, config) {
|
|
9684
|
+
let normalizedLabels = [];
|
|
9685
|
+
let normalizedNewLabels = [];
|
|
9686
|
+
if (config.type === "logarithmic") {
|
|
9687
|
+
// Logarithmic trends in charts are used to visualize proportional growth or
|
|
9688
|
+
// relative changes. Therefore, we change the normalization technique for
|
|
9689
|
+
// logarithmic trend lines for a better fit. The method used here is Max Absolute
|
|
9690
|
+
// Scaling. This Technique is ideal for data spanning several orders of magnitude,
|
|
9691
|
+
// as it balances differences between small and large values by compressing larger
|
|
9692
|
+
// values while preserving proportionality and ensuring all values are scaled relative
|
|
9693
|
+
// to the largest magnitude.
|
|
9694
|
+
const labelMax = Math.max(...labels.map(Math.abs));
|
|
9695
|
+
normalizedLabels = labels.map((l) => l / labelMax);
|
|
9696
|
+
normalizedNewLabels = newLabels.map((l) => l / labelMax);
|
|
9697
|
+
}
|
|
9698
|
+
else {
|
|
9699
|
+
const labelMax = Math.max(...labels);
|
|
9700
|
+
const labelMin = Math.min(...labels);
|
|
9701
|
+
const labelRange = labelMax - labelMin;
|
|
9702
|
+
normalizedLabels = labels.map((l) => (l - labelMax) / labelRange);
|
|
9703
|
+
normalizedNewLabels = newLabels.map((l) => (l - labelMax) / labelRange);
|
|
9704
|
+
}
|
|
9705
|
+
return { normalizedLabels, normalizedNewLabels };
|
|
9706
|
+
}
|
|
9687
9707
|
function formatTickValue(localeFormat) {
|
|
9688
9708
|
return (value) => {
|
|
9689
9709
|
value = Number(value);
|
|
@@ -51364,7 +51384,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
51364
51384
|
/*
|
|
51365
51385
|
* Reconstructs the original formula string based on new dependencies
|
|
51366
51386
|
*/
|
|
51367
|
-
getFormulaString(sheetId, tokens, dependencies,
|
|
51387
|
+
getFormulaString(sheetId, tokens, dependencies, useBoundedReference = false) {
|
|
51368
51388
|
if (!dependencies.length) {
|
|
51369
51389
|
return concat(tokens.map((token) => token.value));
|
|
51370
51390
|
}
|
|
@@ -51372,7 +51392,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
51372
51392
|
return concat(tokens.map((token) => {
|
|
51373
51393
|
if (token.type === "REFERENCE") {
|
|
51374
51394
|
const range = dependencies[rangeIndex++];
|
|
51375
|
-
return this.getters.getRangeString(range, sheetId, {
|
|
51395
|
+
return this.getters.getRangeString(range, sheetId, { useBoundedReference });
|
|
51376
51396
|
}
|
|
51377
51397
|
return token.value;
|
|
51378
51398
|
}));
|
|
@@ -51652,7 +51672,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
51652
51672
|
if (token.type === "REFERENCE") {
|
|
51653
51673
|
const index = rangeIndex++;
|
|
51654
51674
|
return this.getRangeString(this.compiledFormula.dependencies[index], this.sheetId, {
|
|
51655
|
-
|
|
51675
|
+
useBoundedReference: true,
|
|
51656
51676
|
});
|
|
51657
51677
|
}
|
|
51658
51678
|
return token.value;
|
|
@@ -51989,7 +52009,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
51989
52009
|
if (data.sheets) {
|
|
51990
52010
|
for (let sheet of data.sheets) {
|
|
51991
52011
|
if (this.cfRules[sheet.id]) {
|
|
51992
|
-
sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, {
|
|
52012
|
+
sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useBoundedReference: true }));
|
|
51993
52013
|
}
|
|
51994
52014
|
}
|
|
51995
52015
|
}
|
|
@@ -52058,9 +52078,9 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
52058
52078
|
// ---------------------------------------------------------------------------
|
|
52059
52079
|
// Private
|
|
52060
52080
|
// ---------------------------------------------------------------------------
|
|
52061
|
-
mapToConditionalFormat(sheetId, cf, {
|
|
52081
|
+
mapToConditionalFormat(sheetId, cf, { useBoundedReference } = { useBoundedReference: false }) {
|
|
52062
52082
|
const ranges = cf.ranges.map((range) => {
|
|
52063
|
-
return this.getters.getRangeString(range, sheetId, {
|
|
52083
|
+
return this.getters.getRangeString(range, sheetId, { useBoundedReference });
|
|
52064
52084
|
});
|
|
52065
52085
|
if (cf.rule.type !== "DataBarRule") {
|
|
52066
52086
|
return {
|
|
@@ -52075,7 +52095,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
52075
52095
|
...cf.rule,
|
|
52076
52096
|
rangeValues: cf.rule.rangeValues &&
|
|
52077
52097
|
this.getters.getRangeString(cf.rule.rangeValues, sheetId, {
|
|
52078
|
-
|
|
52098
|
+
useBoundedReference,
|
|
52079
52099
|
}),
|
|
52080
52100
|
},
|
|
52081
52101
|
ranges,
|
|
@@ -52505,10 +52525,20 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
52505
52525
|
for (const sheet of data.sheets) {
|
|
52506
52526
|
sheet.dataValidationRules = [];
|
|
52507
52527
|
for (const rule of this.rules[sheet.id]) {
|
|
52508
|
-
|
|
52509
|
-
...rule,
|
|
52510
|
-
ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, {
|
|
52511
|
-
}
|
|
52528
|
+
const excelRule = {
|
|
52529
|
+
...deepCopy(rule),
|
|
52530
|
+
ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useBoundedReference: true })),
|
|
52531
|
+
};
|
|
52532
|
+
if (rule.criterion.type === "isValueInRange") {
|
|
52533
|
+
excelRule.criterion.values = rule.criterion.values.map((value) => {
|
|
52534
|
+
const range = this.getters.getRangeFromSheetXC(sheet.id, value);
|
|
52535
|
+
return this.getters.getRangeString(range, sheet.id, {
|
|
52536
|
+
useBoundedReference: true,
|
|
52537
|
+
useFixedReference: true,
|
|
52538
|
+
});
|
|
52539
|
+
});
|
|
52540
|
+
}
|
|
52541
|
+
sheet.dataValidationRules.push(excelRule);
|
|
52512
52542
|
}
|
|
52513
52543
|
}
|
|
52514
52544
|
}
|
|
@@ -53922,9 +53952,10 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
53922
53952
|
* @param range the range (received from getRangeFromXC or getRangeFromZone)
|
|
53923
53953
|
* @param forSheetId the id of the sheet where the range string is supposed to be used.
|
|
53924
53954
|
* @param options
|
|
53955
|
+
* @param options.useBoundedReference if true, the range will be returned with bounded row and column
|
|
53925
53956
|
* @param options.useFixedReference if true, the range will be returned with fixed row and column
|
|
53926
53957
|
*/
|
|
53927
|
-
getRangeString(range, forSheetId, options = { useFixedReference: false }) {
|
|
53958
|
+
getRangeString(range, forSheetId, options = { useBoundedReference: false, useFixedReference: false }) {
|
|
53928
53959
|
if (!range) {
|
|
53929
53960
|
return CellErrorType.InvalidReference;
|
|
53930
53961
|
}
|
|
@@ -54027,13 +54058,13 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
54027
54058
|
/**
|
|
54028
54059
|
* Get a Xc string that represent a part of a range
|
|
54029
54060
|
*/
|
|
54030
|
-
getRangePartString(range, part, options = { useFixedReference: false }) {
|
|
54031
|
-
const colFixed = range.parts
|
|
54061
|
+
getRangePartString(range, part, options = { useBoundedReference: false, useFixedReference: false }) {
|
|
54062
|
+
const colFixed = range.parts[part]?.colFixed || options.useFixedReference ? "$" : "";
|
|
54032
54063
|
const col = part === 0 ? numberToLetters(range.zone.left) : numberToLetters(range.zone.right);
|
|
54033
|
-
const rowFixed = range.parts
|
|
54064
|
+
const rowFixed = range.parts[part]?.rowFixed || options.useFixedReference ? "$" : "";
|
|
54034
54065
|
const row = part === 0 ? String(range.zone.top + 1) : String(range.zone.bottom + 1);
|
|
54035
54066
|
let str = "";
|
|
54036
|
-
if (range.isFullCol && !options.
|
|
54067
|
+
if (range.isFullCol && !options.useBoundedReference) {
|
|
54037
54068
|
if (part === 0 && range.unboundedZone.hasHeader) {
|
|
54038
54069
|
str = colFixed + col + rowFixed + row;
|
|
54039
54070
|
}
|
|
@@ -54041,7 +54072,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
54041
54072
|
str = colFixed + col;
|
|
54042
54073
|
}
|
|
54043
54074
|
}
|
|
54044
|
-
else if (range.isFullRow && !options.
|
|
54075
|
+
else if (range.isFullRow && !options.useBoundedReference) {
|
|
54045
54076
|
if (part === 0 && range.unboundedZone.hasHeader) {
|
|
54046
54077
|
str = colFixed + col + rowFixed + row;
|
|
54047
54078
|
}
|
|
@@ -61241,6 +61272,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
61241
61272
|
waitingUndoRedoAck = false;
|
|
61242
61273
|
isReplayingInitialRevisions = false;
|
|
61243
61274
|
processedRevisions = new Set();
|
|
61275
|
+
lastRevisionMessage = undefined;
|
|
61244
61276
|
uuidGenerator = new UuidGenerator();
|
|
61245
61277
|
lastLocalOperation;
|
|
61246
61278
|
/**
|
|
@@ -61341,7 +61373,10 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
61341
61373
|
* Notify the server that the user client left the collaborative session
|
|
61342
61374
|
*/
|
|
61343
61375
|
async leave(data) {
|
|
61344
|
-
if (data &&
|
|
61376
|
+
if (data &&
|
|
61377
|
+
Object.keys(this.clients).length === 1 &&
|
|
61378
|
+
this.lastRevisionMessage &&
|
|
61379
|
+
this.lastRevisionMessage?.type !== "SNAPSHOT_CREATED") {
|
|
61345
61380
|
await this.snapshot(data());
|
|
61346
61381
|
}
|
|
61347
61382
|
delete this.clients[this.clientId];
|
|
@@ -61562,6 +61597,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
61562
61597
|
this.pendingMessages = this.pendingMessages.filter((msg) => msg.nextRevisionId !== message.nextRevisionId);
|
|
61563
61598
|
this.serverRevisionId = message.nextRevisionId;
|
|
61564
61599
|
this.processedRevisions.add(message.nextRevisionId);
|
|
61600
|
+
this.lastRevisionMessage = message;
|
|
61565
61601
|
this.sendPendingMessage();
|
|
61566
61602
|
break;
|
|
61567
61603
|
}
|
|
@@ -73053,9 +73089,9 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
73053
73089
|
exports.tokenize = tokenize;
|
|
73054
73090
|
|
|
73055
73091
|
|
|
73056
|
-
__info__.version = "18.0.
|
|
73057
|
-
__info__.date = "2025-01-
|
|
73058
|
-
__info__.hash = "
|
|
73092
|
+
__info__.version = "18.0.12";
|
|
73093
|
+
__info__.date = "2025-01-29T06:24:22.122Z";
|
|
73094
|
+
__info__.hash = "a881cff";
|
|
73059
73095
|
|
|
73060
73096
|
|
|
73061
73097
|
})(this.o_spreadsheet = this.o_spreadsheet || {}, owl);
|