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