@odoo/o-spreadsheet 18.0.11 → 18.0.13
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 +137 -58
- package/dist/o-spreadsheet.d.ts +28 -15
- package/dist/o-spreadsheet.esm.js +137 -58
- package/dist/o-spreadsheet.iife.js +137 -58
- 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.13
|
|
6
|
+
* @date 2025-01-31T07:59:17.481Z
|
|
7
|
+
* @hash f505971
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
'use strict';
|
|
@@ -3185,11 +3185,11 @@ const getInvaluableSymbolsRegexp = memoize(function getInvaluableSymbolsRegexp(l
|
|
|
3185
3185
|
* number from the point of view of the isNumber function.
|
|
3186
3186
|
*/
|
|
3187
3187
|
function parseNumber(str, locale) {
|
|
3188
|
+
// remove invaluable characters
|
|
3189
|
+
str = str.replace(getInvaluableSymbolsRegexp(locale), "");
|
|
3188
3190
|
if (locale.decimalSeparator !== ".") {
|
|
3189
3191
|
str = str.replace(locale.decimalSeparator, ".");
|
|
3190
3192
|
}
|
|
3191
|
-
// remove invaluable characters
|
|
3192
|
-
str = str.replace(getInvaluableSymbolsRegexp(locale), "");
|
|
3193
3193
|
let n = Number(str);
|
|
3194
3194
|
if (isNaN(n) && str.includes("%")) {
|
|
3195
3195
|
n = Number(str.split("%")[0]);
|
|
@@ -4284,7 +4284,7 @@ function dichotomicSearch(data, target, mode, sortOrder, rangeLength, getValueIn
|
|
|
4284
4284
|
* @param reverseSearch if true, search in the array starting from the end.
|
|
4285
4285
|
|
|
4286
4286
|
*/
|
|
4287
|
-
function linearSearch(data, target, mode, numberOfValues, getValueInData, reverseSearch = false) {
|
|
4287
|
+
function linearSearch(data, target, mode, numberOfValues, getValueInData, lookupCaches, reverseSearch = false) {
|
|
4288
4288
|
if (target === undefined || target.value === null) {
|
|
4289
4289
|
return -1;
|
|
4290
4290
|
}
|
|
@@ -4293,17 +4293,48 @@ function linearSearch(data, target, mode, numberOfValues, getValueInData, revers
|
|
|
4293
4293
|
}
|
|
4294
4294
|
const _target = normalizeValue(target.value);
|
|
4295
4295
|
const getValue = reverseSearch
|
|
4296
|
-
? (data, i) => getValueInData(data, numberOfValues - i - 1)
|
|
4297
|
-
: getValueInData;
|
|
4296
|
+
? (data, i) => normalizeValue(getValueInData(data, numberOfValues - i - 1))
|
|
4297
|
+
: (data, i) => normalizeValue(getValueInData(data, i));
|
|
4298
|
+
// first check if the target is in the cache
|
|
4299
|
+
const isNotWildcardTarget = mode !== "wildcard" ||
|
|
4300
|
+
typeof _target !== "string" ||
|
|
4301
|
+
!(_target.includes("*") || _target.includes("?"));
|
|
4302
|
+
if (lookupCaches && isNotWildcardTarget) {
|
|
4303
|
+
const searchMode = reverseSearch ? "reverseSearch" : "forwardSearch";
|
|
4304
|
+
let cache = lookupCaches[searchMode].get(data);
|
|
4305
|
+
if (cache === undefined) {
|
|
4306
|
+
// build the cache for all the values
|
|
4307
|
+
cache = new Map();
|
|
4308
|
+
for (let i = 0; i < numberOfValues; i++) {
|
|
4309
|
+
const value = getValue(data, i) ?? null;
|
|
4310
|
+
if (!cache.has(value)) {
|
|
4311
|
+
cache.set(value, i);
|
|
4312
|
+
}
|
|
4313
|
+
}
|
|
4314
|
+
lookupCaches[searchMode].set(data, cache);
|
|
4315
|
+
}
|
|
4316
|
+
if (cache.has(_target)) {
|
|
4317
|
+
const resultIndex = cache.get(_target);
|
|
4318
|
+
return reverseSearch ? numberOfValues - resultIndex - 1 : resultIndex;
|
|
4319
|
+
}
|
|
4320
|
+
if (mode === "strict") {
|
|
4321
|
+
return -1;
|
|
4322
|
+
}
|
|
4323
|
+
}
|
|
4324
|
+
// else perform the linear search
|
|
4325
|
+
const resultIndex = _linearSearch(data, _target, mode, numberOfValues, getValue);
|
|
4326
|
+
return reverseSearch && resultIndex !== -1 ? numberOfValues - resultIndex - 1 : resultIndex;
|
|
4327
|
+
}
|
|
4328
|
+
function _linearSearch(data, _target, mode, numberOfValues, getNormalizeValue) {
|
|
4298
4329
|
let indexMatchTarget = (i) => {
|
|
4299
|
-
return
|
|
4330
|
+
return getNormalizeValue(data, i) === _target;
|
|
4300
4331
|
};
|
|
4301
4332
|
if (mode === "wildcard" &&
|
|
4302
4333
|
typeof _target === "string" &&
|
|
4303
4334
|
(_target.includes("*") || _target.includes("?"))) {
|
|
4304
4335
|
const regExp = wildcardToRegExp(_target);
|
|
4305
4336
|
indexMatchTarget = (i) => {
|
|
4306
|
-
const value =
|
|
4337
|
+
const value = getNormalizeValue(data, i);
|
|
4307
4338
|
if (typeof value === "string") {
|
|
4308
4339
|
return regExp.test(value);
|
|
4309
4340
|
}
|
|
@@ -4314,7 +4345,7 @@ function linearSearch(data, target, mode, numberOfValues, getValueInData, revers
|
|
|
4314
4345
|
let closestMatchIndex = -1;
|
|
4315
4346
|
if (mode === "nextSmaller") {
|
|
4316
4347
|
indexMatchTarget = (i) => {
|
|
4317
|
-
const value =
|
|
4348
|
+
const value = getNormalizeValue(data, i);
|
|
4318
4349
|
if ((!closestMatch && compareCellValues(_target, value) >= 0) ||
|
|
4319
4350
|
(compareCellValues(_target, value) >= 0 && compareCellValues(value, closestMatch) > 0)) {
|
|
4320
4351
|
closestMatch = value;
|
|
@@ -4325,7 +4356,7 @@ function linearSearch(data, target, mode, numberOfValues, getValueInData, revers
|
|
|
4325
4356
|
}
|
|
4326
4357
|
if (mode === "nextGreater") {
|
|
4327
4358
|
indexMatchTarget = (i) => {
|
|
4328
|
-
const value =
|
|
4359
|
+
const value = getNormalizeValue(data, i);
|
|
4329
4360
|
if ((!closestMatch && compareCellValues(_target, value) <= 0) ||
|
|
4330
4361
|
(compareCellValues(_target, value) <= 0 && compareCellValues(value, closestMatch) < 0)) {
|
|
4331
4362
|
closestMatch = value;
|
|
@@ -4336,12 +4367,10 @@ function linearSearch(data, target, mode, numberOfValues, getValueInData, revers
|
|
|
4336
4367
|
}
|
|
4337
4368
|
for (let i = 0; i < numberOfValues; i++) {
|
|
4338
4369
|
if (indexMatchTarget(i)) {
|
|
4339
|
-
return
|
|
4370
|
+
return i;
|
|
4340
4371
|
}
|
|
4341
4372
|
}
|
|
4342
|
-
return
|
|
4343
|
-
? numberOfValues - closestMatchIndex - 1
|
|
4344
|
-
: closestMatchIndex;
|
|
4373
|
+
return closestMatchIndex;
|
|
4345
4374
|
}
|
|
4346
4375
|
/**
|
|
4347
4376
|
* Normalize a value.
|
|
@@ -9457,13 +9486,13 @@ function toExcelDataset(getters, ds) {
|
|
|
9457
9486
|
else if (ds.labelCell) {
|
|
9458
9487
|
label = {
|
|
9459
9488
|
reference: getters.getRangeString(ds.labelCell, "forceSheetReference", {
|
|
9460
|
-
|
|
9489
|
+
useBoundedReference: true,
|
|
9461
9490
|
}),
|
|
9462
9491
|
};
|
|
9463
9492
|
}
|
|
9464
9493
|
return {
|
|
9465
9494
|
label,
|
|
9466
|
-
range: getters.getRangeString(dataRange, "forceSheetReference", {
|
|
9495
|
+
range: getters.getRangeString(dataRange, "forceSheetReference", { useBoundedReference: true }),
|
|
9467
9496
|
backgroundColor: ds.backgroundColor,
|
|
9468
9497
|
rightYAxis: ds.rightYAxis,
|
|
9469
9498
|
};
|
|
@@ -9478,7 +9507,7 @@ function toExcelLabelRange(getters, labelRange, shouldRemoveFirstLabel) {
|
|
|
9478
9507
|
zone.top = zone.top + 1;
|
|
9479
9508
|
}
|
|
9480
9509
|
const range = labelRange.clone({ zone });
|
|
9481
|
-
return getters.getRangeString(range, "forceSheetReference", {
|
|
9510
|
+
return getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
|
|
9482
9511
|
}
|
|
9483
9512
|
/**
|
|
9484
9513
|
* Transform a chart definition which supports dataSets (dataSets and LabelRange)
|
|
@@ -9642,11 +9671,7 @@ function interpolateData(config, values, labels, newLabels) {
|
|
|
9642
9671
|
if (values.length < 2 || labels.length < 2 || newLabels.length === 0) {
|
|
9643
9672
|
return [];
|
|
9644
9673
|
}
|
|
9645
|
-
const
|
|
9646
|
-
const labelMax = Math.max(...labels);
|
|
9647
|
-
const labelRange = labelMax - labelMin;
|
|
9648
|
-
const normalizedLabels = labels.map((v) => (v - labelMin) / labelRange);
|
|
9649
|
-
const normalizedNewLabels = newLabels.map((v) => (v - labelMin) / labelRange);
|
|
9674
|
+
const { normalizedLabels, normalizedNewLabels } = normalizeLabels(labels, newLabels, config);
|
|
9650
9675
|
try {
|
|
9651
9676
|
switch (config.type) {
|
|
9652
9677
|
case "polynomial": {
|
|
@@ -9685,6 +9710,30 @@ function interpolateData(config, values, labels, newLabels) {
|
|
|
9685
9710
|
return Array.from({ length: newLabels.length }, () => NaN);
|
|
9686
9711
|
}
|
|
9687
9712
|
}
|
|
9713
|
+
function normalizeLabels(labels, newLabels, config) {
|
|
9714
|
+
let normalizedLabels = [];
|
|
9715
|
+
let normalizedNewLabels = [];
|
|
9716
|
+
if (config.type === "logarithmic") {
|
|
9717
|
+
// Logarithmic trends in charts are used to visualize proportional growth or
|
|
9718
|
+
// relative changes. Therefore, we change the normalization technique for
|
|
9719
|
+
// logarithmic trend lines for a better fit. The method used here is Max Absolute
|
|
9720
|
+
// Scaling. This Technique is ideal for data spanning several orders of magnitude,
|
|
9721
|
+
// as it balances differences between small and large values by compressing larger
|
|
9722
|
+
// values while preserving proportionality and ensuring all values are scaled relative
|
|
9723
|
+
// to the largest magnitude.
|
|
9724
|
+
const labelMax = Math.max(...labels.map(Math.abs));
|
|
9725
|
+
normalizedLabels = labels.map((l) => l / labelMax);
|
|
9726
|
+
normalizedNewLabels = newLabels.map((l) => l / labelMax);
|
|
9727
|
+
}
|
|
9728
|
+
else {
|
|
9729
|
+
const labelMax = Math.max(...labels);
|
|
9730
|
+
const labelMin = Math.min(...labels);
|
|
9731
|
+
const labelRange = labelMax - labelMin;
|
|
9732
|
+
normalizedLabels = labels.map((l) => (l - labelMax) / labelRange);
|
|
9733
|
+
normalizedNewLabels = newLabels.map((l) => (l - labelMax) / labelRange);
|
|
9734
|
+
}
|
|
9735
|
+
return { normalizedLabels, normalizedNewLabels };
|
|
9736
|
+
}
|
|
9688
9737
|
function formatTickValue(localeFormat) {
|
|
9689
9738
|
return (value) => {
|
|
9690
9739
|
value = Number(value);
|
|
@@ -18346,7 +18395,7 @@ const HLOOKUP = {
|
|
|
18346
18395
|
const _isSorted = toBoolean(isSorted.value);
|
|
18347
18396
|
const colIndex = _isSorted
|
|
18348
18397
|
? dichotomicSearch(range, searchKey, "nextSmaller", "asc", range.length, getValueFromRange)
|
|
18349
|
-
: linearSearch(range, searchKey, "wildcard", range.length, getValueFromRange);
|
|
18398
|
+
: linearSearch(range, searchKey, "wildcard", range.length, getValueFromRange, this.lookupCaches);
|
|
18350
18399
|
const col = range[colIndex];
|
|
18351
18400
|
if (col === undefined) {
|
|
18352
18401
|
return valueNotAvailable(searchKey);
|
|
@@ -18498,7 +18547,7 @@ const MATCH = {
|
|
|
18498
18547
|
index = dichotomicSearch(range, searchKey, "nextSmaller", "asc", rangeLen, getElement);
|
|
18499
18548
|
break;
|
|
18500
18549
|
case 0:
|
|
18501
|
-
index = linearSearch(range, searchKey, "wildcard", rangeLen, getElement);
|
|
18550
|
+
index = linearSearch(range, searchKey, "wildcard", rangeLen, getElement, this.lookupCaches);
|
|
18502
18551
|
break;
|
|
18503
18552
|
case -1:
|
|
18504
18553
|
index = dichotomicSearch(range, searchKey, "nextGreater", "desc", rangeLen, getElement);
|
|
@@ -18565,7 +18614,7 @@ const VLOOKUP = {
|
|
|
18565
18614
|
const _isSorted = toBoolean(isSorted.value);
|
|
18566
18615
|
const rowIndex = _isSorted
|
|
18567
18616
|
? dichotomicSearch(range, searchKey, "nextSmaller", "asc", range[0].length, getValueFromRange)
|
|
18568
|
-
: linearSearch(range, searchKey, "wildcard", range[0].length, getValueFromRange);
|
|
18617
|
+
: linearSearch(range, searchKey, "wildcard", range[0].length, getValueFromRange, this.lookupCaches);
|
|
18569
18618
|
const value = range[_index - 1][rowIndex];
|
|
18570
18619
|
if (value === undefined) {
|
|
18571
18620
|
return valueNotAvailable(searchKey);
|
|
@@ -18619,7 +18668,7 @@ const XLOOKUP = {
|
|
|
18619
18668
|
const reverseSearch = _searchMode === -1;
|
|
18620
18669
|
const index = _searchMode === 2 || _searchMode === -2
|
|
18621
18670
|
? dichotomicSearch(lookupRange, searchKey, mode, _searchMode === 2 ? "asc" : "desc", rangeLen, getElement)
|
|
18622
|
-
: linearSearch(lookupRange, searchKey, mode, rangeLen, getElement, reverseSearch);
|
|
18671
|
+
: linearSearch(lookupRange, searchKey, mode, rangeLen, getElement, this.lookupCaches, reverseSearch);
|
|
18623
18672
|
if (index !== -1) {
|
|
18624
18673
|
return lookupDirection === "col"
|
|
18625
18674
|
? returnRange.map((col) => [col[index]])
|
|
@@ -21059,6 +21108,12 @@ class Composer extends owl.Component {
|
|
|
21059
21108
|
}
|
|
21060
21109
|
this.contentHelper.updateEl(el);
|
|
21061
21110
|
});
|
|
21111
|
+
this.env.model.selection.observe(this, {
|
|
21112
|
+
handleEvent: () => this.autoCompleteState.hide(),
|
|
21113
|
+
});
|
|
21114
|
+
owl.onWillUnmount(() => {
|
|
21115
|
+
this.env.model.selection.detachObserver(this);
|
|
21116
|
+
});
|
|
21062
21117
|
owl.useEffect(() => {
|
|
21063
21118
|
this.processContent();
|
|
21064
21119
|
if (document.activeElement === this.contentHelper.el &&
|
|
@@ -51365,7 +51420,7 @@ class CellPlugin extends CorePlugin {
|
|
|
51365
51420
|
/*
|
|
51366
51421
|
* Reconstructs the original formula string based on new dependencies
|
|
51367
51422
|
*/
|
|
51368
|
-
getFormulaString(sheetId, tokens, dependencies,
|
|
51423
|
+
getFormulaString(sheetId, tokens, dependencies, useBoundedReference = false) {
|
|
51369
51424
|
if (!dependencies.length) {
|
|
51370
51425
|
return concat(tokens.map((token) => token.value));
|
|
51371
51426
|
}
|
|
@@ -51373,7 +51428,7 @@ class CellPlugin extends CorePlugin {
|
|
|
51373
51428
|
return concat(tokens.map((token) => {
|
|
51374
51429
|
if (token.type === "REFERENCE") {
|
|
51375
51430
|
const range = dependencies[rangeIndex++];
|
|
51376
|
-
return this.getters.getRangeString(range, sheetId, {
|
|
51431
|
+
return this.getters.getRangeString(range, sheetId, { useBoundedReference });
|
|
51377
51432
|
}
|
|
51378
51433
|
return token.value;
|
|
51379
51434
|
}));
|
|
@@ -51653,7 +51708,7 @@ class FormulaCellWithDependencies {
|
|
|
51653
51708
|
if (token.type === "REFERENCE") {
|
|
51654
51709
|
const index = rangeIndex++;
|
|
51655
51710
|
return this.getRangeString(this.compiledFormula.dependencies[index], this.sheetId, {
|
|
51656
|
-
|
|
51711
|
+
useBoundedReference: true,
|
|
51657
51712
|
});
|
|
51658
51713
|
}
|
|
51659
51714
|
return token.value;
|
|
@@ -51990,7 +52045,7 @@ class ConditionalFormatPlugin extends CorePlugin {
|
|
|
51990
52045
|
if (data.sheets) {
|
|
51991
52046
|
for (let sheet of data.sheets) {
|
|
51992
52047
|
if (this.cfRules[sheet.id]) {
|
|
51993
|
-
sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, {
|
|
52048
|
+
sheet.conditionalFormats = this.cfRules[sheet.id].map((rule) => this.mapToConditionalFormat(sheet.id, rule, { useBoundedReference: true }));
|
|
51994
52049
|
}
|
|
51995
52050
|
}
|
|
51996
52051
|
}
|
|
@@ -52059,9 +52114,9 @@ class ConditionalFormatPlugin extends CorePlugin {
|
|
|
52059
52114
|
// ---------------------------------------------------------------------------
|
|
52060
52115
|
// Private
|
|
52061
52116
|
// ---------------------------------------------------------------------------
|
|
52062
|
-
mapToConditionalFormat(sheetId, cf, {
|
|
52117
|
+
mapToConditionalFormat(sheetId, cf, { useBoundedReference } = { useBoundedReference: false }) {
|
|
52063
52118
|
const ranges = cf.ranges.map((range) => {
|
|
52064
|
-
return this.getters.getRangeString(range, sheetId, {
|
|
52119
|
+
return this.getters.getRangeString(range, sheetId, { useBoundedReference });
|
|
52065
52120
|
});
|
|
52066
52121
|
if (cf.rule.type !== "DataBarRule") {
|
|
52067
52122
|
return {
|
|
@@ -52076,7 +52131,7 @@ class ConditionalFormatPlugin extends CorePlugin {
|
|
|
52076
52131
|
...cf.rule,
|
|
52077
52132
|
rangeValues: cf.rule.rangeValues &&
|
|
52078
52133
|
this.getters.getRangeString(cf.rule.rangeValues, sheetId, {
|
|
52079
|
-
|
|
52134
|
+
useBoundedReference,
|
|
52080
52135
|
}),
|
|
52081
52136
|
},
|
|
52082
52137
|
ranges,
|
|
@@ -52506,10 +52561,20 @@ class DataValidationPlugin extends CorePlugin {
|
|
|
52506
52561
|
for (const sheet of data.sheets) {
|
|
52507
52562
|
sheet.dataValidationRules = [];
|
|
52508
52563
|
for (const rule of this.rules[sheet.id]) {
|
|
52509
|
-
|
|
52510
|
-
...rule,
|
|
52511
|
-
ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, {
|
|
52512
|
-
}
|
|
52564
|
+
const excelRule = {
|
|
52565
|
+
...deepCopy(rule),
|
|
52566
|
+
ranges: rule.ranges.map((range) => this.getters.getRangeString(range, sheet.id, { useBoundedReference: true })),
|
|
52567
|
+
};
|
|
52568
|
+
if (rule.criterion.type === "isValueInRange") {
|
|
52569
|
+
excelRule.criterion.values = rule.criterion.values.map((value) => {
|
|
52570
|
+
const range = this.getters.getRangeFromSheetXC(sheet.id, value);
|
|
52571
|
+
return this.getters.getRangeString(range, sheet.id, {
|
|
52572
|
+
useBoundedReference: true,
|
|
52573
|
+
useFixedReference: true,
|
|
52574
|
+
});
|
|
52575
|
+
});
|
|
52576
|
+
}
|
|
52577
|
+
sheet.dataValidationRules.push(excelRule);
|
|
52513
52578
|
}
|
|
52514
52579
|
}
|
|
52515
52580
|
}
|
|
@@ -53923,9 +53988,10 @@ class RangeAdapter {
|
|
|
53923
53988
|
* @param range the range (received from getRangeFromXC or getRangeFromZone)
|
|
53924
53989
|
* @param forSheetId the id of the sheet where the range string is supposed to be used.
|
|
53925
53990
|
* @param options
|
|
53991
|
+
* @param options.useBoundedReference if true, the range will be returned with bounded row and column
|
|
53926
53992
|
* @param options.useFixedReference if true, the range will be returned with fixed row and column
|
|
53927
53993
|
*/
|
|
53928
|
-
getRangeString(range, forSheetId, options = { useFixedReference: false }) {
|
|
53994
|
+
getRangeString(range, forSheetId, options = { useBoundedReference: false, useFixedReference: false }) {
|
|
53929
53995
|
if (!range) {
|
|
53930
53996
|
return CellErrorType.InvalidReference;
|
|
53931
53997
|
}
|
|
@@ -54028,13 +54094,13 @@ class RangeAdapter {
|
|
|
54028
54094
|
/**
|
|
54029
54095
|
* Get a Xc string that represent a part of a range
|
|
54030
54096
|
*/
|
|
54031
|
-
getRangePartString(range, part, options = { useFixedReference: false }) {
|
|
54032
|
-
const colFixed = range.parts
|
|
54097
|
+
getRangePartString(range, part, options = { useBoundedReference: false, useFixedReference: false }) {
|
|
54098
|
+
const colFixed = range.parts[part]?.colFixed || options.useFixedReference ? "$" : "";
|
|
54033
54099
|
const col = part === 0 ? numberToLetters(range.zone.left) : numberToLetters(range.zone.right);
|
|
54034
|
-
const rowFixed = range.parts
|
|
54100
|
+
const rowFixed = range.parts[part]?.rowFixed || options.useFixedReference ? "$" : "";
|
|
54035
54101
|
const row = part === 0 ? String(range.zone.top + 1) : String(range.zone.bottom + 1);
|
|
54036
54102
|
let str = "";
|
|
54037
|
-
if (range.isFullCol && !options.
|
|
54103
|
+
if (range.isFullCol && !options.useBoundedReference) {
|
|
54038
54104
|
if (part === 0 && range.unboundedZone.hasHeader) {
|
|
54039
54105
|
str = colFixed + col + rowFixed + row;
|
|
54040
54106
|
}
|
|
@@ -54042,7 +54108,7 @@ class RangeAdapter {
|
|
|
54042
54108
|
str = colFixed + col;
|
|
54043
54109
|
}
|
|
54044
54110
|
}
|
|
54045
|
-
else if (range.isFullRow && !options.
|
|
54111
|
+
else if (range.isFullRow && !options.useBoundedReference) {
|
|
54046
54112
|
if (part === 0 && range.unboundedZone.hasHeader) {
|
|
54047
54113
|
str = colFixed + col + rowFixed + row;
|
|
54048
54114
|
}
|
|
@@ -57529,6 +57595,10 @@ class Evaluator {
|
|
|
57529
57595
|
this.compilationParams = buildCompilationParameters(this.context, this.getters, this.computeAndSave.bind(this));
|
|
57530
57596
|
this.compilationParams.evalContext.updateDependencies = this.updateDependencies.bind(this);
|
|
57531
57597
|
this.compilationParams.evalContext.addDependencies = this.addDependencies.bind(this);
|
|
57598
|
+
this.compilationParams.evalContext.lookupCaches = {
|
|
57599
|
+
forwardSearch: new Map(),
|
|
57600
|
+
reverseSearch: new Map(),
|
|
57601
|
+
};
|
|
57532
57602
|
}
|
|
57533
57603
|
createEmptyPositionSet() {
|
|
57534
57604
|
const sheetSizes = {};
|
|
@@ -59378,7 +59448,7 @@ function withPivotPresentationLayer (PivotClass) {
|
|
|
59378
59448
|
const symbolIndex = rowDomain.findIndex((row) => row.field === symbolName);
|
|
59379
59449
|
return this.getPivotHeaderValueAndFormat(rowDomain.slice(0, symbolIndex + 1));
|
|
59380
59450
|
}
|
|
59381
|
-
return this.
|
|
59451
|
+
return this.getPivotCellValueAndFormat(symbolName, domain);
|
|
59382
59452
|
};
|
|
59383
59453
|
const result = this.getters.evaluateCompiledFormula(measure.computedBy.sheetId, formula, getSymbolValue);
|
|
59384
59454
|
if (isMatrix(result)) {
|
|
@@ -61242,6 +61312,7 @@ class Session extends EventBus {
|
|
|
61242
61312
|
waitingUndoRedoAck = false;
|
|
61243
61313
|
isReplayingInitialRevisions = false;
|
|
61244
61314
|
processedRevisions = new Set();
|
|
61315
|
+
lastRevisionMessage = undefined;
|
|
61245
61316
|
uuidGenerator = new UuidGenerator();
|
|
61246
61317
|
lastLocalOperation;
|
|
61247
61318
|
/**
|
|
@@ -61342,7 +61413,10 @@ class Session extends EventBus {
|
|
|
61342
61413
|
* Notify the server that the user client left the collaborative session
|
|
61343
61414
|
*/
|
|
61344
61415
|
async leave(data) {
|
|
61345
|
-
if (data &&
|
|
61416
|
+
if (data &&
|
|
61417
|
+
Object.keys(this.clients).length === 1 &&
|
|
61418
|
+
this.lastRevisionMessage &&
|
|
61419
|
+
this.lastRevisionMessage?.type !== "SNAPSHOT_CREATED") {
|
|
61346
61420
|
await this.snapshot(data());
|
|
61347
61421
|
}
|
|
61348
61422
|
delete this.clients[this.clientId];
|
|
@@ -61563,6 +61637,7 @@ class Session extends EventBus {
|
|
|
61563
61637
|
this.pendingMessages = this.pendingMessages.filter((msg) => msg.nextRevisionId !== message.nextRevisionId);
|
|
61564
61638
|
this.serverRevisionId = message.nextRevisionId;
|
|
61565
61639
|
this.processedRevisions.add(message.nextRevisionId);
|
|
61640
|
+
this.lastRevisionMessage = message;
|
|
61566
61641
|
this.sendPendingMessage();
|
|
61567
61642
|
break;
|
|
61568
61643
|
}
|
|
@@ -62490,14 +62565,12 @@ class SheetUIPlugin extends UIPlugin {
|
|
|
62490
62565
|
}
|
|
62491
62566
|
break;
|
|
62492
62567
|
case "AUTORESIZE_ROWS":
|
|
62493
|
-
|
|
62494
|
-
|
|
62495
|
-
|
|
62496
|
-
|
|
62497
|
-
|
|
62498
|
-
|
|
62499
|
-
});
|
|
62500
|
-
}
|
|
62568
|
+
this.dispatch("RESIZE_COLUMNS_ROWS", {
|
|
62569
|
+
elements: cmd.rows,
|
|
62570
|
+
dimension: "ROW",
|
|
62571
|
+
size: null,
|
|
62572
|
+
sheetId: cmd.sheetId,
|
|
62573
|
+
});
|
|
62501
62574
|
break;
|
|
62502
62575
|
}
|
|
62503
62576
|
}
|
|
@@ -69604,6 +69677,9 @@ class EventStream {
|
|
|
69604
69677
|
observe(owner, callbacks) {
|
|
69605
69678
|
this.observers.set(owner, { owner, callbacks });
|
|
69606
69679
|
}
|
|
69680
|
+
detachObserver(owner) {
|
|
69681
|
+
this.observers.delete(owner);
|
|
69682
|
+
}
|
|
69607
69683
|
/**
|
|
69608
69684
|
* Capture the stream for yourself
|
|
69609
69685
|
*/
|
|
@@ -69696,6 +69772,9 @@ class SelectionStreamProcessorImpl {
|
|
|
69696
69772
|
observe(owner, callbacks) {
|
|
69697
69773
|
this.stream.observe(owner, callbacks);
|
|
69698
69774
|
}
|
|
69775
|
+
detachObserver(owner) {
|
|
69776
|
+
this.stream.detachObserver(owner);
|
|
69777
|
+
}
|
|
69699
69778
|
release(owner) {
|
|
69700
69779
|
if (this.stream.isListening(owner)) {
|
|
69701
69780
|
this.stream.release(owner);
|
|
@@ -73054,6 +73133,6 @@ exports.tokenColors = tokenColors;
|
|
|
73054
73133
|
exports.tokenize = tokenize;
|
|
73055
73134
|
|
|
73056
73135
|
|
|
73057
|
-
__info__.version = "18.0.
|
|
73058
|
-
__info__.date = "2025-01-
|
|
73059
|
-
__info__.hash = "
|
|
73136
|
+
__info__.version = "18.0.13";
|
|
73137
|
+
__info__.date = "2025-01-31T07:59:17.481Z";
|
|
73138
|
+
__info__.hash = "f505971";
|