@odoo/o-spreadsheet 16.0.45 → 16.0.47
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 +209 -157
- package/dist/o-spreadsheet.d.ts +4 -0
- package/dist/o-spreadsheet.esm.js +209 -157
- package/dist/o-spreadsheet.iife.js +209 -157
- package/dist/o-spreadsheet.iife.min.js +26 -26
- package/dist/o_spreadsheet.xml +3 -3
- package/package.json +1 -1
|
@@ -8251,15 +8251,6 @@ function createLineChartRuntime(chart, getters) {
|
|
|
8251
8251
|
}
|
|
8252
8252
|
const colors = new ChartColors();
|
|
8253
8253
|
for (let [index, { label, data }] of dataSetsValues.entries()) {
|
|
8254
|
-
if (["linear", "time"].includes(axisType)) {
|
|
8255
|
-
// Replace empty string labels by undefined to make sure chartJS doesn't decide that "" is the same as 0
|
|
8256
|
-
data = data.map((y, index) => ({ x: labels[index] || undefined, y }));
|
|
8257
|
-
}
|
|
8258
|
-
const color = colors.next();
|
|
8259
|
-
let backgroundRGBA = colorToRGBA(color);
|
|
8260
|
-
if (chart.stacked) {
|
|
8261
|
-
backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
|
|
8262
|
-
}
|
|
8263
8254
|
if (chart.cumulative) {
|
|
8264
8255
|
let accumulator = 0;
|
|
8265
8256
|
data = data.map((value) => {
|
|
@@ -8270,6 +8261,15 @@ function createLineChartRuntime(chart, getters) {
|
|
|
8270
8261
|
return value;
|
|
8271
8262
|
});
|
|
8272
8263
|
}
|
|
8264
|
+
if (["linear", "time"].includes(axisType)) {
|
|
8265
|
+
// Replace empty string labels by undefined to make sure chartJS doesn't decide that "" is the same as 0
|
|
8266
|
+
data = data.map((y, index) => ({ x: labels[index] || undefined, y }));
|
|
8267
|
+
}
|
|
8268
|
+
const color = colors.next();
|
|
8269
|
+
let backgroundRGBA = colorToRGBA(color);
|
|
8270
|
+
if (chart.stacked) {
|
|
8271
|
+
backgroundRGBA.a = LINE_FILL_TRANSPARENCY;
|
|
8272
|
+
}
|
|
8273
8273
|
const backgroundColor = rgbaToHex(backgroundRGBA);
|
|
8274
8274
|
const dataset = {
|
|
8275
8275
|
label,
|
|
@@ -11391,6 +11391,9 @@ function getPredicate(descr, isQuery) {
|
|
|
11391
11391
|
return result;
|
|
11392
11392
|
}
|
|
11393
11393
|
function operandToRegExp(operand) {
|
|
11394
|
+
if (operand === "*") {
|
|
11395
|
+
return /.+/;
|
|
11396
|
+
}
|
|
11394
11397
|
let exp = "";
|
|
11395
11398
|
let predecessor = "";
|
|
11396
11399
|
for (let char of operand) {
|
|
@@ -11414,9 +11417,9 @@ function operandToRegExp(operand) {
|
|
|
11414
11417
|
}
|
|
11415
11418
|
return new RegExp("^" + exp + "$", "i");
|
|
11416
11419
|
}
|
|
11417
|
-
function evaluatePredicate(value, criterion) {
|
|
11420
|
+
function evaluatePredicate(value = "", criterion) {
|
|
11418
11421
|
const { operator, operand } = criterion;
|
|
11419
|
-
if (
|
|
11422
|
+
if (operand === undefined) {
|
|
11420
11423
|
return false;
|
|
11421
11424
|
}
|
|
11422
11425
|
if (typeof operand === "number" && operator === "=") {
|
|
@@ -18405,6 +18408,147 @@ function tokenizeInvalidRange(chars) {
|
|
|
18405
18408
|
return null;
|
|
18406
18409
|
}
|
|
18407
18410
|
|
|
18411
|
+
var State;
|
|
18412
|
+
(function (State) {
|
|
18413
|
+
/**
|
|
18414
|
+
* Initial state.
|
|
18415
|
+
* Expecting any reference for the left part of a range
|
|
18416
|
+
* e.g. "A1", "1", "A", "Sheet1!A1", "Sheet1!A"
|
|
18417
|
+
*/
|
|
18418
|
+
State[State["LeftRef"] = 0] = "LeftRef";
|
|
18419
|
+
/**
|
|
18420
|
+
* Expecting any reference for the right part of a range
|
|
18421
|
+
* e.g. "A1", "1", "A", "Sheet1!A1", "Sheet1!A"
|
|
18422
|
+
*/
|
|
18423
|
+
State[State["RightRef"] = 1] = "RightRef";
|
|
18424
|
+
/**
|
|
18425
|
+
* Expecting the separator without any constraint on the right part
|
|
18426
|
+
*/
|
|
18427
|
+
State[State["Separator"] = 2] = "Separator";
|
|
18428
|
+
/**
|
|
18429
|
+
* Expecting the separator for a full column range
|
|
18430
|
+
*/
|
|
18431
|
+
State[State["FullColumnSeparator"] = 3] = "FullColumnSeparator";
|
|
18432
|
+
/**
|
|
18433
|
+
* Expecting the separator for a full row range
|
|
18434
|
+
*/
|
|
18435
|
+
State[State["FullRowSeparator"] = 4] = "FullRowSeparator";
|
|
18436
|
+
/**
|
|
18437
|
+
* Expecting the right part of a full column range
|
|
18438
|
+
* e.g. "1", "A1"
|
|
18439
|
+
*/
|
|
18440
|
+
State[State["RightColumnRef"] = 5] = "RightColumnRef";
|
|
18441
|
+
/**
|
|
18442
|
+
* Expecting the right part of a full row range
|
|
18443
|
+
* e.g. "A", "A1"
|
|
18444
|
+
*/
|
|
18445
|
+
State[State["RightRowRef"] = 6] = "RightRowRef";
|
|
18446
|
+
/**
|
|
18447
|
+
* Final state. A range has been matched
|
|
18448
|
+
*/
|
|
18449
|
+
State[State["Found"] = 7] = "Found";
|
|
18450
|
+
})(State || (State = {}));
|
|
18451
|
+
const goTo = (state, guard = () => true) => [
|
|
18452
|
+
{
|
|
18453
|
+
goTo: state,
|
|
18454
|
+
guard,
|
|
18455
|
+
},
|
|
18456
|
+
];
|
|
18457
|
+
const goToMulti = (state, guard = () => true) => ({
|
|
18458
|
+
goTo: state,
|
|
18459
|
+
guard,
|
|
18460
|
+
});
|
|
18461
|
+
const machine = {
|
|
18462
|
+
[State.LeftRef]: {
|
|
18463
|
+
REFERENCE: goTo(State.Separator),
|
|
18464
|
+
NUMBER: goTo(State.FullRowSeparator),
|
|
18465
|
+
SYMBOL: [
|
|
18466
|
+
goToMulti(State.FullColumnSeparator, (token) => isColReference(token.value)),
|
|
18467
|
+
goToMulti(State.FullRowSeparator, (token) => isRowReference(token.value)),
|
|
18468
|
+
],
|
|
18469
|
+
},
|
|
18470
|
+
[State.FullColumnSeparator]: {
|
|
18471
|
+
SPACE: goTo(State.FullColumnSeparator),
|
|
18472
|
+
OPERATOR: goTo(State.RightColumnRef, (token) => token.value === ":"),
|
|
18473
|
+
},
|
|
18474
|
+
[State.FullRowSeparator]: {
|
|
18475
|
+
SPACE: goTo(State.FullRowSeparator),
|
|
18476
|
+
OPERATOR: goTo(State.RightRowRef, (token) => token.value === ":"),
|
|
18477
|
+
},
|
|
18478
|
+
[State.Separator]: {
|
|
18479
|
+
SPACE: goTo(State.Separator),
|
|
18480
|
+
OPERATOR: goTo(State.RightRef, (token) => token.value === ":"),
|
|
18481
|
+
},
|
|
18482
|
+
[State.RightRef]: {
|
|
18483
|
+
SPACE: goTo(State.RightRef),
|
|
18484
|
+
NUMBER: goTo(State.Found),
|
|
18485
|
+
REFERENCE: goTo(State.Found, (token) => isSingleCellReference(token.value)),
|
|
18486
|
+
SYMBOL: goTo(State.Found, (token) => isColHeader(token.value) || isRowHeader(token.value)),
|
|
18487
|
+
},
|
|
18488
|
+
[State.RightColumnRef]: {
|
|
18489
|
+
SPACE: goTo(State.RightColumnRef),
|
|
18490
|
+
SYMBOL: goTo(State.Found, (token) => isColHeader(token.value)),
|
|
18491
|
+
REFERENCE: goTo(State.Found, (token) => isSingleCellReference(token.value)),
|
|
18492
|
+
},
|
|
18493
|
+
[State.RightRowRef]: {
|
|
18494
|
+
SPACE: goTo(State.RightRowRef),
|
|
18495
|
+
NUMBER: goTo(State.Found),
|
|
18496
|
+
REFERENCE: goTo(State.Found, (token) => isSingleCellReference(token.value)),
|
|
18497
|
+
SYMBOL: goTo(State.Found, (token) => isRowHeader(token.value)),
|
|
18498
|
+
},
|
|
18499
|
+
[State.Found]: {},
|
|
18500
|
+
};
|
|
18501
|
+
/**
|
|
18502
|
+
* Check if the list of tokens starts with a sequence of tokens representing
|
|
18503
|
+
* a range.
|
|
18504
|
+
* If a range is found, the sequence is removed from the list and is returned
|
|
18505
|
+
* as a single token.
|
|
18506
|
+
*/
|
|
18507
|
+
function matchReference(tokens) {
|
|
18508
|
+
var _a;
|
|
18509
|
+
let head = 0;
|
|
18510
|
+
let transitions = machine[State.LeftRef];
|
|
18511
|
+
let matchedTokens = "";
|
|
18512
|
+
while (transitions !== undefined) {
|
|
18513
|
+
const token = tokens[head++];
|
|
18514
|
+
if (!token) {
|
|
18515
|
+
return null;
|
|
18516
|
+
}
|
|
18517
|
+
const transition = (_a = transitions[token.type]) === null || _a === void 0 ? void 0 : _a.find((transition) => transition.guard(token));
|
|
18518
|
+
const nextState = transition ? transition.goTo : undefined;
|
|
18519
|
+
switch (nextState) {
|
|
18520
|
+
case undefined:
|
|
18521
|
+
return null;
|
|
18522
|
+
case State.Found:
|
|
18523
|
+
matchedTokens += token.value;
|
|
18524
|
+
tokens.splice(0, head);
|
|
18525
|
+
return {
|
|
18526
|
+
type: "REFERENCE",
|
|
18527
|
+
value: matchedTokens,
|
|
18528
|
+
};
|
|
18529
|
+
default:
|
|
18530
|
+
transitions = machine[nextState];
|
|
18531
|
+
matchedTokens += token.value;
|
|
18532
|
+
break;
|
|
18533
|
+
}
|
|
18534
|
+
}
|
|
18535
|
+
return null;
|
|
18536
|
+
}
|
|
18537
|
+
/**
|
|
18538
|
+
* Take the result of the tokenizer and transform it to be usable in the
|
|
18539
|
+
* manipulations of range
|
|
18540
|
+
*
|
|
18541
|
+
* @param formula
|
|
18542
|
+
*/
|
|
18543
|
+
function rangeTokenize(formula) {
|
|
18544
|
+
const tokens = tokenize(formula);
|
|
18545
|
+
const result = [];
|
|
18546
|
+
while (tokens.length) {
|
|
18547
|
+
result.push(matchReference(tokens) || tokens.shift());
|
|
18548
|
+
}
|
|
18549
|
+
return result;
|
|
18550
|
+
}
|
|
18551
|
+
|
|
18408
18552
|
const functionRegex = /[a-zA-Z0-9\_]+(\.[a-zA-Z0-9\_]+)*/;
|
|
18409
18553
|
const UNARY_OPERATORS_PREFIX = ["-", "+"];
|
|
18410
18554
|
const UNARY_OPERATORS_POSTFIX = ["%"];
|
|
@@ -18571,7 +18715,7 @@ function parseExpression(tokens, bp) {
|
|
|
18571
18715
|
* Parse an expression (as a string) into an AST.
|
|
18572
18716
|
*/
|
|
18573
18717
|
function parse(str) {
|
|
18574
|
-
return parseTokens(
|
|
18718
|
+
return parseTokens(rangeTokenize(str));
|
|
18575
18719
|
}
|
|
18576
18720
|
function parseTokens(tokens) {
|
|
18577
18721
|
tokens = tokens.filter((x) => x.type !== "SPACE");
|
|
@@ -18683,147 +18827,6 @@ function rightOperandToFormula(operationAST) {
|
|
|
18683
18827
|
return needParenthesis ? `(${astToFormula(rightOperation)})` : astToFormula(rightOperation);
|
|
18684
18828
|
}
|
|
18685
18829
|
|
|
18686
|
-
var State;
|
|
18687
|
-
(function (State) {
|
|
18688
|
-
/**
|
|
18689
|
-
* Initial state.
|
|
18690
|
-
* Expecting any reference for the left part of a range
|
|
18691
|
-
* e.g. "A1", "1", "A", "Sheet1!A1", "Sheet1!A"
|
|
18692
|
-
*/
|
|
18693
|
-
State[State["LeftRef"] = 0] = "LeftRef";
|
|
18694
|
-
/**
|
|
18695
|
-
* Expecting any reference for the right part of a range
|
|
18696
|
-
* e.g. "A1", "1", "A", "Sheet1!A1", "Sheet1!A"
|
|
18697
|
-
*/
|
|
18698
|
-
State[State["RightRef"] = 1] = "RightRef";
|
|
18699
|
-
/**
|
|
18700
|
-
* Expecting the separator without any constraint on the right part
|
|
18701
|
-
*/
|
|
18702
|
-
State[State["Separator"] = 2] = "Separator";
|
|
18703
|
-
/**
|
|
18704
|
-
* Expecting the separator for a full column range
|
|
18705
|
-
*/
|
|
18706
|
-
State[State["FullColumnSeparator"] = 3] = "FullColumnSeparator";
|
|
18707
|
-
/**
|
|
18708
|
-
* Expecting the separator for a full row range
|
|
18709
|
-
*/
|
|
18710
|
-
State[State["FullRowSeparator"] = 4] = "FullRowSeparator";
|
|
18711
|
-
/**
|
|
18712
|
-
* Expecting the right part of a full column range
|
|
18713
|
-
* e.g. "1", "A1"
|
|
18714
|
-
*/
|
|
18715
|
-
State[State["RightColumnRef"] = 5] = "RightColumnRef";
|
|
18716
|
-
/**
|
|
18717
|
-
* Expecting the right part of a full row range
|
|
18718
|
-
* e.g. "A", "A1"
|
|
18719
|
-
*/
|
|
18720
|
-
State[State["RightRowRef"] = 6] = "RightRowRef";
|
|
18721
|
-
/**
|
|
18722
|
-
* Final state. A range has been matched
|
|
18723
|
-
*/
|
|
18724
|
-
State[State["Found"] = 7] = "Found";
|
|
18725
|
-
})(State || (State = {}));
|
|
18726
|
-
const goTo = (state, guard = () => true) => [
|
|
18727
|
-
{
|
|
18728
|
-
goTo: state,
|
|
18729
|
-
guard,
|
|
18730
|
-
},
|
|
18731
|
-
];
|
|
18732
|
-
const goToMulti = (state, guard = () => true) => ({
|
|
18733
|
-
goTo: state,
|
|
18734
|
-
guard,
|
|
18735
|
-
});
|
|
18736
|
-
const machine = {
|
|
18737
|
-
[State.LeftRef]: {
|
|
18738
|
-
REFERENCE: goTo(State.Separator),
|
|
18739
|
-
NUMBER: goTo(State.FullRowSeparator),
|
|
18740
|
-
SYMBOL: [
|
|
18741
|
-
goToMulti(State.FullColumnSeparator, (token) => isColReference(token.value)),
|
|
18742
|
-
goToMulti(State.FullRowSeparator, (token) => isRowReference(token.value)),
|
|
18743
|
-
],
|
|
18744
|
-
},
|
|
18745
|
-
[State.FullColumnSeparator]: {
|
|
18746
|
-
SPACE: goTo(State.FullColumnSeparator),
|
|
18747
|
-
OPERATOR: goTo(State.RightColumnRef, (token) => token.value === ":"),
|
|
18748
|
-
},
|
|
18749
|
-
[State.FullRowSeparator]: {
|
|
18750
|
-
SPACE: goTo(State.FullRowSeparator),
|
|
18751
|
-
OPERATOR: goTo(State.RightRowRef, (token) => token.value === ":"),
|
|
18752
|
-
},
|
|
18753
|
-
[State.Separator]: {
|
|
18754
|
-
SPACE: goTo(State.Separator),
|
|
18755
|
-
OPERATOR: goTo(State.RightRef, (token) => token.value === ":"),
|
|
18756
|
-
},
|
|
18757
|
-
[State.RightRef]: {
|
|
18758
|
-
SPACE: goTo(State.RightRef),
|
|
18759
|
-
NUMBER: goTo(State.Found),
|
|
18760
|
-
REFERENCE: goTo(State.Found, (token) => isSingleCellReference(token.value)),
|
|
18761
|
-
SYMBOL: goTo(State.Found, (token) => isColHeader(token.value) || isRowHeader(token.value)),
|
|
18762
|
-
},
|
|
18763
|
-
[State.RightColumnRef]: {
|
|
18764
|
-
SPACE: goTo(State.RightColumnRef),
|
|
18765
|
-
SYMBOL: goTo(State.Found, (token) => isColHeader(token.value)),
|
|
18766
|
-
REFERENCE: goTo(State.Found, (token) => isSingleCellReference(token.value)),
|
|
18767
|
-
},
|
|
18768
|
-
[State.RightRowRef]: {
|
|
18769
|
-
SPACE: goTo(State.RightRowRef),
|
|
18770
|
-
NUMBER: goTo(State.Found),
|
|
18771
|
-
REFERENCE: goTo(State.Found, (token) => isSingleCellReference(token.value)),
|
|
18772
|
-
SYMBOL: goTo(State.Found, (token) => isRowHeader(token.value)),
|
|
18773
|
-
},
|
|
18774
|
-
[State.Found]: {},
|
|
18775
|
-
};
|
|
18776
|
-
/**
|
|
18777
|
-
* Check if the list of tokens starts with a sequence of tokens representing
|
|
18778
|
-
* a range.
|
|
18779
|
-
* If a range is found, the sequence is removed from the list and is returned
|
|
18780
|
-
* as a single token.
|
|
18781
|
-
*/
|
|
18782
|
-
function matchReference(tokens) {
|
|
18783
|
-
var _a;
|
|
18784
|
-
let head = 0;
|
|
18785
|
-
let transitions = machine[State.LeftRef];
|
|
18786
|
-
let matchedTokens = "";
|
|
18787
|
-
while (transitions !== undefined) {
|
|
18788
|
-
const token = tokens[head++];
|
|
18789
|
-
if (!token) {
|
|
18790
|
-
return null;
|
|
18791
|
-
}
|
|
18792
|
-
const transition = (_a = transitions[token.type]) === null || _a === void 0 ? void 0 : _a.find((transition) => transition.guard(token));
|
|
18793
|
-
const nextState = transition ? transition.goTo : undefined;
|
|
18794
|
-
switch (nextState) {
|
|
18795
|
-
case undefined:
|
|
18796
|
-
return null;
|
|
18797
|
-
case State.Found:
|
|
18798
|
-
matchedTokens += token.value;
|
|
18799
|
-
tokens.splice(0, head);
|
|
18800
|
-
return {
|
|
18801
|
-
type: "REFERENCE",
|
|
18802
|
-
value: matchedTokens,
|
|
18803
|
-
};
|
|
18804
|
-
default:
|
|
18805
|
-
transitions = machine[nextState];
|
|
18806
|
-
matchedTokens += token.value;
|
|
18807
|
-
break;
|
|
18808
|
-
}
|
|
18809
|
-
}
|
|
18810
|
-
return null;
|
|
18811
|
-
}
|
|
18812
|
-
/**
|
|
18813
|
-
* Take the result of the tokenizer and transform it to be usable in the
|
|
18814
|
-
* manipulations of range
|
|
18815
|
-
*
|
|
18816
|
-
* @param formula
|
|
18817
|
-
*/
|
|
18818
|
-
function rangeTokenize(formula) {
|
|
18819
|
-
const tokens = tokenize(formula);
|
|
18820
|
-
const result = [];
|
|
18821
|
-
while (tokens.length) {
|
|
18822
|
-
result.push(matchReference(tokens) || tokens.shift());
|
|
18823
|
-
}
|
|
18824
|
-
return result;
|
|
18825
|
-
}
|
|
18826
|
-
|
|
18827
18830
|
const functions$2 = functionRegistry.content;
|
|
18828
18831
|
const OPERATOR_MAP = {
|
|
18829
18832
|
"=": "EQ",
|
|
@@ -23685,6 +23688,8 @@ const NON_RETROCOMPATIBLE_FUNCTIONS = [
|
|
|
23685
23688
|
"BITOR",
|
|
23686
23689
|
"BITRSHIFT",
|
|
23687
23690
|
"BITXOR",
|
|
23691
|
+
"BYCOL",
|
|
23692
|
+
"BYROW",
|
|
23688
23693
|
"CEILING.MATH",
|
|
23689
23694
|
"CEILING.PRECISE",
|
|
23690
23695
|
"CHISQ.DIST",
|
|
@@ -23692,6 +23697,8 @@ const NON_RETROCOMPATIBLE_FUNCTIONS = [
|
|
|
23692
23697
|
"CHISQ.INV",
|
|
23693
23698
|
"CHISQ.INV.RT",
|
|
23694
23699
|
"CHISQ.TEST",
|
|
23700
|
+
"CHOOSECOLS",
|
|
23701
|
+
"CHOOSEROWS",
|
|
23695
23702
|
"COMBINA",
|
|
23696
23703
|
"CONCAT",
|
|
23697
23704
|
"CONFIDENCE.NORM",
|
|
@@ -23704,14 +23711,17 @@ const NON_RETROCOMPATIBLE_FUNCTIONS = [
|
|
|
23704
23711
|
"CSCH",
|
|
23705
23712
|
"DAYS",
|
|
23706
23713
|
"DECIMAL",
|
|
23714
|
+
"DROP",
|
|
23707
23715
|
"ERF.PRECISE",
|
|
23708
23716
|
"ERFC.PRECISE",
|
|
23717
|
+
"EXPAND",
|
|
23709
23718
|
"EXPON.DIST",
|
|
23710
23719
|
"F.DIST",
|
|
23711
23720
|
"F.DIST.RT",
|
|
23712
23721
|
"F.INV",
|
|
23713
23722
|
"F.INV.RT",
|
|
23714
23723
|
"F.TEST",
|
|
23724
|
+
"FIELDVALUE",
|
|
23715
23725
|
"FILTERXML",
|
|
23716
23726
|
"FLOOR.MATH",
|
|
23717
23727
|
"FLOOR.PRECISE",
|
|
@@ -23726,6 +23736,7 @@ const NON_RETROCOMPATIBLE_FUNCTIONS = [
|
|
|
23726
23736
|
"GAMMA.INV",
|
|
23727
23737
|
"GAMMALN.PRECISE",
|
|
23728
23738
|
"GAUSS",
|
|
23739
|
+
"HSTACK",
|
|
23729
23740
|
"HYPGEOM.DIST",
|
|
23730
23741
|
"IFNA",
|
|
23731
23742
|
"IFS",
|
|
@@ -23738,9 +23749,14 @@ const NON_RETROCOMPATIBLE_FUNCTIONS = [
|
|
|
23738
23749
|
"IMSINH",
|
|
23739
23750
|
"IMTAN",
|
|
23740
23751
|
"ISFORMULA",
|
|
23752
|
+
"ISOMITTED",
|
|
23741
23753
|
"ISOWEEKNUM",
|
|
23754
|
+
"LAMBDA",
|
|
23755
|
+
"LET",
|
|
23742
23756
|
"LOGNORM.DIST",
|
|
23743
23757
|
"LOGNORM.INV",
|
|
23758
|
+
"MAKEARRAY",
|
|
23759
|
+
"MAP",
|
|
23744
23760
|
"MAXIFS",
|
|
23745
23761
|
"MINIFS",
|
|
23746
23762
|
"MODE.MULT",
|
|
@@ -23760,17 +23776,26 @@ const NON_RETROCOMPATIBLE_FUNCTIONS = [
|
|
|
23760
23776
|
"PERMUTATIONA",
|
|
23761
23777
|
"PHI",
|
|
23762
23778
|
"POISSON.DIST",
|
|
23779
|
+
"PQSOURCE",
|
|
23780
|
+
"PYTHON_STR",
|
|
23781
|
+
"PYTHON_TYPE",
|
|
23782
|
+
"PYTHON_TYPENAME",
|
|
23763
23783
|
"QUARTILE.EXC",
|
|
23764
23784
|
"QUARTILE.INC",
|
|
23765
23785
|
"QUERYSTRING",
|
|
23786
|
+
"RANDARRAY",
|
|
23766
23787
|
"RANK.AVG",
|
|
23767
23788
|
"RANK.EQ",
|
|
23789
|
+
"REDUCE",
|
|
23768
23790
|
"RRI",
|
|
23791
|
+
"SCAN",
|
|
23769
23792
|
"SEC",
|
|
23770
23793
|
"SECH",
|
|
23794
|
+
"SEQUENCE",
|
|
23771
23795
|
"SHEET",
|
|
23772
23796
|
"SHEETS",
|
|
23773
23797
|
"SKEW.P",
|
|
23798
|
+
"SORTBY",
|
|
23774
23799
|
"STDEV.P",
|
|
23775
23800
|
"STDEV.S",
|
|
23776
23801
|
"SWITCH",
|
|
@@ -23780,13 +23805,24 @@ const NON_RETROCOMPATIBLE_FUNCTIONS = [
|
|
|
23780
23805
|
"T.INV",
|
|
23781
23806
|
"T.INV.2T",
|
|
23782
23807
|
"T.TEST",
|
|
23808
|
+
"TAKE",
|
|
23809
|
+
"TEXTAFTER",
|
|
23810
|
+
"TEXTBEFORE",
|
|
23783
23811
|
"TEXTJOIN",
|
|
23812
|
+
"TEXTSPLIT",
|
|
23813
|
+
"TOCOL",
|
|
23814
|
+
"TOROW",
|
|
23784
23815
|
"UNICHAR",
|
|
23785
23816
|
"UNICODE",
|
|
23817
|
+
"UNIQUE",
|
|
23786
23818
|
"VAR.P",
|
|
23787
23819
|
"VAR.S",
|
|
23820
|
+
"VSTACK",
|
|
23788
23821
|
"WEBSERVICE",
|
|
23789
23822
|
"WEIBULL.DIST",
|
|
23823
|
+
"WRAPCOLS",
|
|
23824
|
+
"WRAPROWS",
|
|
23825
|
+
"XLOOKUP",
|
|
23790
23826
|
"XOR",
|
|
23791
23827
|
"Z.TEST",
|
|
23792
23828
|
];
|
|
@@ -27573,6 +27609,22 @@ class BordersPlugin extends CorePlugin {
|
|
|
27573
27609
|
return [];
|
|
27574
27610
|
return Object.keys(sheetBorders).map((index) => parseInt(index, 10));
|
|
27575
27611
|
}
|
|
27612
|
+
/**
|
|
27613
|
+
* Get all the rows which contains at least a border
|
|
27614
|
+
*/
|
|
27615
|
+
getRowsWithBorders(sheetId) {
|
|
27616
|
+
var _a;
|
|
27617
|
+
const sheetBorders = (_a = this.borders[sheetId]) === null || _a === void 0 ? void 0 : _a.filter(isDefined$1);
|
|
27618
|
+
if (!sheetBorders)
|
|
27619
|
+
return [];
|
|
27620
|
+
const rowsWithBorders = new Set();
|
|
27621
|
+
for (const rowBorders of sheetBorders) {
|
|
27622
|
+
for (const rowBorder in rowBorders) {
|
|
27623
|
+
rowsWithBorders.add(parseInt(rowBorder, 10));
|
|
27624
|
+
}
|
|
27625
|
+
}
|
|
27626
|
+
return Array.from(rowsWithBorders);
|
|
27627
|
+
}
|
|
27576
27628
|
/**
|
|
27577
27629
|
* Get the range of all the rows in the sheet
|
|
27578
27630
|
*/
|
|
@@ -27622,7 +27674,7 @@ class BordersPlugin extends CorePlugin {
|
|
|
27622
27674
|
destructive: false,
|
|
27623
27675
|
});
|
|
27624
27676
|
}
|
|
27625
|
-
this.
|
|
27677
|
+
this.getRowsWithBorders(sheetId)
|
|
27626
27678
|
.filter((row) => row >= start)
|
|
27627
27679
|
.sort((a, b) => (delta < 0 ? a - b : b - a)) // start by the end when moving up
|
|
27628
27680
|
.forEach((row) => {
|
|
@@ -43384,6 +43436,6 @@ exports.setTranslationMethod = setTranslationMethod;
|
|
|
43384
43436
|
exports.tokenize = tokenize;
|
|
43385
43437
|
|
|
43386
43438
|
|
|
43387
|
-
__info__.version = '16.0.
|
|
43388
|
-
__info__.date = '2024-
|
|
43389
|
-
__info__.hash = '
|
|
43439
|
+
__info__.version = '16.0.47';
|
|
43440
|
+
__info__.date = '2024-07-08T05:37:37.541Z';
|
|
43441
|
+
__info__.hash = 'f52ca6f';
|
package/dist/o-spreadsheet.d.ts
CHANGED
|
@@ -3025,6 +3025,10 @@ declare class BordersPlugin extends CorePlugin<BordersPluginState> implements Bo
|
|
|
3025
3025
|
* Get all the columns which contains at least a border
|
|
3026
3026
|
*/
|
|
3027
3027
|
private getColumnsWithBorders;
|
|
3028
|
+
/**
|
|
3029
|
+
* Get all the rows which contains at least a border
|
|
3030
|
+
*/
|
|
3031
|
+
private getRowsWithBorders;
|
|
3028
3032
|
/**
|
|
3029
3033
|
* Get the range of all the rows in the sheet
|
|
3030
3034
|
*/
|