@odoo/o-spreadsheet 19.2.23 → 19.2.25
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.css +3 -3
- package/dist/o_spreadsheet.esm.js +105 -27
- package/dist/o_spreadsheet.iife.js +105 -27
- package/dist/o_spreadsheet.iife.min.js +238 -238
- package/dist/o_spreadsheet.xml +3 -3
- package/package.json +1 -1
package/dist/o_spreadsheet.css
CHANGED
|
@@ -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 19.2.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 19.2.25
|
|
6
|
+
* @date 2026-08-12T09:16:52.703Z
|
|
7
|
+
* @hash 685ffda
|
|
8
8
|
*/
|
|
9
9
|
:root {
|
|
10
10
|
--os-gray-100: light-dark(#f9fafb, #1b1d26);
|
|
@@ -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 19.2.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 19.2.25
|
|
6
|
+
* @date 2026-08-12T09:16:51.116Z
|
|
7
|
+
* @hash 685ffda
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { App, Component, blockDom, markRaw, onMounted, onPatched, onWillPatch, onWillStart, onWillUnmount, onWillUpdateProps, status, toRaw, useChildSubEnv, useComponent, useEffect, useEnv, useExternalListener, useRef, useState, useSubEnv, whenReady, xml } from "@odoo/owl";
|
|
@@ -3940,19 +3940,58 @@ function applyVectorization(formula, args, acceptToVectorize = void 0) {
|
|
|
3940
3940
|
}
|
|
3941
3941
|
}
|
|
3942
3942
|
if (countVectorizedCol === 1 && countVectorizedRow === 1) return formula(...args);
|
|
3943
|
-
const
|
|
3944
|
-
|
|
3945
|
-
|
|
3946
|
-
|
|
3947
|
-
|
|
3948
|
-
|
|
3943
|
+
const argsBuffer = new Array(args.length);
|
|
3944
|
+
const argGetters = [];
|
|
3945
|
+
const vectorizedIndices = [];
|
|
3946
|
+
for (let k = 0; k < args.length; k++) {
|
|
3947
|
+
const arg = args[k];
|
|
3948
|
+
switch (vectorArgsType?.[k]) {
|
|
3949
|
+
case "matrix":
|
|
3950
|
+
argGetters.push((i, j) => arg[i][j]);
|
|
3951
|
+
vectorizedIndices.push(k);
|
|
3952
|
+
break;
|
|
3953
|
+
case "horizontal":
|
|
3954
|
+
argGetters.push((i) => arg[i][0]);
|
|
3955
|
+
vectorizedIndices.push(k);
|
|
3956
|
+
break;
|
|
3957
|
+
case "vertical":
|
|
3958
|
+
argGetters.push((_i, j) => arg[0][j]);
|
|
3959
|
+
vectorizedIndices.push(k);
|
|
3960
|
+
break;
|
|
3961
|
+
case void 0:
|
|
3962
|
+
argsBuffer[k] = arg;
|
|
3963
|
+
break;
|
|
3949
3964
|
}
|
|
3950
|
-
}
|
|
3951
|
-
|
|
3952
|
-
|
|
3953
|
-
|
|
3954
|
-
|
|
3955
|
-
|
|
3965
|
+
}
|
|
3966
|
+
const nbVectorized = vectorizedIndices.length;
|
|
3967
|
+
let callFormula;
|
|
3968
|
+
switch (argsBuffer.length) {
|
|
3969
|
+
case 1:
|
|
3970
|
+
callFormula = () => formula(argsBuffer[0]);
|
|
3971
|
+
break;
|
|
3972
|
+
case 2:
|
|
3973
|
+
callFormula = () => formula(argsBuffer[0], argsBuffer[1]);
|
|
3974
|
+
break;
|
|
3975
|
+
case 3:
|
|
3976
|
+
callFormula = () => formula(argsBuffer[0], argsBuffer[1], argsBuffer[2]);
|
|
3977
|
+
break;
|
|
3978
|
+
default: callFormula = () => formula(...argsBuffer);
|
|
3979
|
+
}
|
|
3980
|
+
const result = new Array(countVectorizedCol);
|
|
3981
|
+
for (let col = 0; col < countVectorizedCol; col++) {
|
|
3982
|
+
const column = new Array(countVectorizedRow);
|
|
3983
|
+
result[col] = column;
|
|
3984
|
+
for (let row = 0; row < countVectorizedRow; row++) {
|
|
3985
|
+
if (col > vectorizedColLimit - 1 || row > vectorizedRowLimit - 1) {
|
|
3986
|
+
column[row] = new NotAvailableError(_t("Array arguments to [[FUNCTION_NAME]] are of different size."));
|
|
3987
|
+
continue;
|
|
3988
|
+
}
|
|
3989
|
+
for (let k = 0; k < nbVectorized; k++) argsBuffer[vectorizedIndices[k]] = argGetters[k](col, row);
|
|
3990
|
+
const singleCellComputeResult = callFormula();
|
|
3991
|
+
column[row] = isMatrix(singleCellComputeResult) ? singleCellComputeResult[0][0] : singleCellComputeResult;
|
|
3992
|
+
}
|
|
3993
|
+
}
|
|
3994
|
+
return result;
|
|
3956
3995
|
}
|
|
3957
3996
|
/**
|
|
3958
3997
|
* This function allows to visit arguments and stop the visit if necessary.
|
|
@@ -17389,7 +17428,7 @@ var FigureComponent = class extends Component {
|
|
|
17389
17428
|
case "ArrowLeft":
|
|
17390
17429
|
case "ArrowRight":
|
|
17391
17430
|
case "ArrowUp":
|
|
17392
|
-
const { col, row, offset } = this.postionInBoundary(this.props.figureUI, ev.key);
|
|
17431
|
+
const { col, row, offset } = this.postionInBoundary(this.env.model.getters.getActiveSheetId(), this.props.figureUI, ev.key);
|
|
17393
17432
|
this.env.model.dispatch("UPDATE_FIGURE", {
|
|
17394
17433
|
sheetId: this.env.model.getters.getActiveSheetId(),
|
|
17395
17434
|
figureId: this.props.figureUI.id,
|
|
@@ -17413,34 +17452,52 @@ var FigureComponent = class extends Component {
|
|
|
17413
17452
|
break;
|
|
17414
17453
|
}
|
|
17415
17454
|
}
|
|
17416
|
-
postionInBoundary(
|
|
17417
|
-
|
|
17418
|
-
let { col, row, offset } = position;
|
|
17455
|
+
postionInBoundary(sheetId, figure, key) {
|
|
17456
|
+
let { col, row, offset } = figure;
|
|
17419
17457
|
offset = { ...offset };
|
|
17458
|
+
const maxAnchor = this.env.model.getters.getMaxAnchorOffset(sheetId, figure.height, figure.width);
|
|
17420
17459
|
switch (key) {
|
|
17421
17460
|
case "ArrowUp":
|
|
17422
17461
|
if (offset.y === 0) {
|
|
17423
17462
|
row--;
|
|
17463
|
+
while (row > 0 && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row--;
|
|
17424
17464
|
offset.y = this.env.model.getters.getRowSize(sheetId, row) - 1;
|
|
17425
17465
|
} else offset.y--;
|
|
17426
17466
|
break;
|
|
17427
17467
|
case "ArrowLeft":
|
|
17428
17468
|
if (offset.x === 0) {
|
|
17429
17469
|
col--;
|
|
17470
|
+
while (col > 0 && this.env.model.getters.isColHiddenByUser(sheetId, col)) col--;
|
|
17430
17471
|
offset.x = this.env.model.getters.getColSize(sheetId, col) - 1;
|
|
17431
17472
|
} else offset.x--;
|
|
17432
17473
|
break;
|
|
17433
17474
|
case "ArrowDown":
|
|
17434
17475
|
if (offset.y === this.env.model.getters.getRowSize(sheetId, row)) {
|
|
17435
17476
|
row++;
|
|
17477
|
+
while (row <= maxAnchor.row && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row++;
|
|
17436
17478
|
offset.y = 0;
|
|
17437
17479
|
} else offset.y++;
|
|
17438
17480
|
break;
|
|
17439
17481
|
case "ArrowRight": if (offset.x === this.env.model.getters.getColSize(sheetId, row)) {
|
|
17440
17482
|
col++;
|
|
17483
|
+
while (col <= maxAnchor.col && this.env.model.getters.isColHiddenByUser(sheetId, col)) col++;
|
|
17441
17484
|
offset.x = 0;
|
|
17442
17485
|
} else offset.x++;
|
|
17443
17486
|
}
|
|
17487
|
+
if (col < 0) {
|
|
17488
|
+
col = 0;
|
|
17489
|
+
offset.x = 0;
|
|
17490
|
+
} else if (col > maxAnchor.col || col === maxAnchor.col && offset.x > maxAnchor.offset.x) {
|
|
17491
|
+
col = maxAnchor.col;
|
|
17492
|
+
offset.x = maxAnchor.offset.x;
|
|
17493
|
+
}
|
|
17494
|
+
if (row < 0) {
|
|
17495
|
+
row = 0;
|
|
17496
|
+
offset.y = 0;
|
|
17497
|
+
} else if (row > maxAnchor.row || row === maxAnchor.row && offset.y > maxAnchor.offset.y) {
|
|
17498
|
+
row = maxAnchor.row;
|
|
17499
|
+
offset.y = maxAnchor.offset.y;
|
|
17500
|
+
}
|
|
17444
17501
|
return {
|
|
17445
17502
|
col,
|
|
17446
17503
|
row,
|
|
@@ -17711,12 +17768,15 @@ function validateArguments(descr) {
|
|
|
17711
17768
|
//#endregion
|
|
17712
17769
|
//#region src/functions/create_compute_function.ts
|
|
17713
17770
|
function createComputeFunction(descr) {
|
|
17771
|
+
let currentArgDefinitions = [];
|
|
17714
17772
|
function vectorizedCompute(...args) {
|
|
17715
17773
|
const acceptToVectorize = [];
|
|
17774
|
+
currentArgDefinitions = new Array(args.length);
|
|
17716
17775
|
const getArgToFocus = argTargeting(descr, args.length);
|
|
17717
17776
|
for (let i = 0; i < args.length; i++) {
|
|
17718
17777
|
const argIndex = getArgToFocus(i).index ?? -1;
|
|
17719
17778
|
const argDefinition = descr.args[argIndex];
|
|
17779
|
+
currentArgDefinitions[i] = argDefinition;
|
|
17720
17780
|
const arg = args[i];
|
|
17721
17781
|
if (!isMatrix(arg) && argDefinition.acceptMatrixOnly) throw new BadExpressionError(_t("Function %s expects the parameter '%s' to be reference to a cell or range.", descr.name, (i + 1).toString()));
|
|
17722
17782
|
acceptToVectorize.push(!argDefinition.acceptMatrix);
|
|
@@ -17731,8 +17791,7 @@ function createComputeFunction(descr) {
|
|
|
17731
17791
|
function errorHandlingCompute(...args) {
|
|
17732
17792
|
for (let i = 0; i < args.length; i++) {
|
|
17733
17793
|
const arg = args[i];
|
|
17734
|
-
|
|
17735
|
-
if (!descr.args[getArgToFocus(i).index ?? i].acceptErrors && !isMatrix(arg) && isEvaluationError(arg?.value)) return arg;
|
|
17794
|
+
if (!currentArgDefinitions[i].acceptErrors && !isMatrix(arg) && isEvaluationError(arg?.value)) return arg;
|
|
17736
17795
|
}
|
|
17737
17796
|
try {
|
|
17738
17797
|
return computeFunctionToObject.apply(this, args);
|
|
@@ -25782,6 +25841,9 @@ for (const category of categories) {
|
|
|
25782
25841
|
});
|
|
25783
25842
|
}
|
|
25784
25843
|
}
|
|
25844
|
+
/** Formulas using one of these functions are never squished: they are always exported
|
|
25845
|
+
* as a full formula string, and they don't become the base formula of the next cells. */
|
|
25846
|
+
const NonSquishableFunctionRegistry = new Registry();
|
|
25785
25847
|
|
|
25786
25848
|
//#endregion
|
|
25787
25849
|
//#region src/types/xlsx.ts
|
|
@@ -50757,7 +50819,13 @@ var CellComposerStore = class extends AbstractComposerStore {
|
|
|
50757
50819
|
const cell = this.getters.getEvaluatedCell(position);
|
|
50758
50820
|
if (cell.link && !isFormula(content)) content = markdownLink(content, cell.link.url);
|
|
50759
50821
|
const currentFormat = this.getters.getCell(position)?.format;
|
|
50760
|
-
const
|
|
50822
|
+
const isCurrentFormatDate = currentFormat && isDateTimeFormat(currentFormat);
|
|
50823
|
+
const contentDateFormat = detectDateFormat(content, this.getters.getLocale());
|
|
50824
|
+
let afterFormat;
|
|
50825
|
+
if (currentFormat !== "@") {
|
|
50826
|
+
if (contentDateFormat && !isCurrentFormatDate) afterFormat = contentDateFormat;
|
|
50827
|
+
else if (isCurrentFormatDate && isNumber(content, this.getters.getLocale())) afterFormat = "";
|
|
50828
|
+
}
|
|
50761
50829
|
this.addHeadersForSpreadingFormula(content);
|
|
50762
50830
|
result = this.model.dispatch("UPDATE_CELL", {
|
|
50763
50831
|
...this.currentEditedCell,
|
|
@@ -55834,7 +55902,8 @@ var Squisher = class {
|
|
|
55834
55902
|
* The result of this method is:
|
|
55835
55903
|
* - if the cell is not a formula, returns the content as is and resets the base formula
|
|
55836
55904
|
* - if the cell is a formula:
|
|
55837
|
-
* - if there is no previous formula, or the normalized formula is different from the previous one
|
|
55905
|
+
* - if there is no previous formula, or the normalized formula is different from the previous one or it contains blacklisted functions (see NonSquishableFunctionRegistry),
|
|
55906
|
+
* resets the base formula to this one and returns the full formula string
|
|
55838
55907
|
* - else, compares the literal values and range dependencies to the previous formula, and for each parameter:
|
|
55839
55908
|
* - for numbers: returns a relative change (+N or -N) if possible, else the full number or "=" if unchanged
|
|
55840
55909
|
* - for strings: returns the full string if changed, else "="
|
|
@@ -55845,6 +55914,10 @@ var Squisher = class {
|
|
|
55845
55914
|
this.resetBase();
|
|
55846
55915
|
return cell.content;
|
|
55847
55916
|
}
|
|
55917
|
+
if (NonSquishableFunctionRegistry.getAll().some((functionName) => cell.compiledFormula.usesSymbol(functionName))) {
|
|
55918
|
+
this.resetBase();
|
|
55919
|
+
return cell.compiledFormula.toFormulaString(this.getters, this.rangeToStringOptions);
|
|
55920
|
+
}
|
|
55848
55921
|
let numbers = [];
|
|
55849
55922
|
let strings = [];
|
|
55850
55923
|
let references = [];
|
|
@@ -71430,6 +71503,10 @@ function inverseCreateFigure(cmd) {
|
|
|
71430
71503
|
}
|
|
71431
71504
|
function inverseCreateChart(cmd) {
|
|
71432
71505
|
return [{
|
|
71506
|
+
type: "DELETE_CHART",
|
|
71507
|
+
chartId: cmd.chartId,
|
|
71508
|
+
sheetId: cmd.sheetId
|
|
71509
|
+
}, {
|
|
71433
71510
|
type: "DELETE_FIGURE",
|
|
71434
71511
|
figureId: cmd.figureId,
|
|
71435
71512
|
sheetId: cmd.sheetId
|
|
@@ -81541,7 +81618,8 @@ const registries = {
|
|
|
81541
81618
|
supportedPivotPositionalFormulaRegistry,
|
|
81542
81619
|
pivotToFunctionValueRegistry,
|
|
81543
81620
|
migrationStepRegistry,
|
|
81544
|
-
chartJsExtensionRegistry
|
|
81621
|
+
chartJsExtensionRegistry,
|
|
81622
|
+
NonSquishableFunctionRegistry
|
|
81545
81623
|
};
|
|
81546
81624
|
const helpers = {
|
|
81547
81625
|
arg,
|
|
@@ -81733,6 +81811,6 @@ const chartHelpers = {
|
|
|
81733
81811
|
//#endregion
|
|
81734
81812
|
export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, ClientDisconnectedError, CommandResult, CompiledFormula, CorePlugin, CoreViewPlugin, DEFAULT_LOCALE, DEFAULT_LOCALES, DispatchResult, EvaluationError, LocalTransportService, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, canExecuteInReadonly, categories, chartHelpers, components, constants, convertAstNodes, coreTypes, createAutocompleteArgumentsProvider, findCellInNewZone, functionCache, getCaretDownSvg, getCaretUpSvg, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, isCoreCommand, isSheetDependent, iterateAstNodes, links, load, lockedSheetAllowedCommands, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
|
|
81735
81813
|
|
|
81736
|
-
__info__.version = "19.2.
|
|
81737
|
-
__info__.date = "2026-
|
|
81738
|
-
__info__.hash = "
|
|
81814
|
+
__info__.version = "19.2.25";
|
|
81815
|
+
__info__.date = "2026-08-12T09:16:51.116Z";
|
|
81816
|
+
__info__.hash = "685ffda";
|
|
@@ -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 19.2.
|
|
6
|
-
* @date 2026-
|
|
7
|
-
* @hash
|
|
5
|
+
* @version 19.2.25
|
|
6
|
+
* @date 2026-08-12T09:16:51.116Z
|
|
7
|
+
* @hash 685ffda
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
(function(exports, _odoo_owl) {
|
|
@@ -3942,19 +3942,58 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
3942
3942
|
}
|
|
3943
3943
|
}
|
|
3944
3944
|
if (countVectorizedCol === 1 && countVectorizedRow === 1) return formula(...args);
|
|
3945
|
-
const
|
|
3946
|
-
|
|
3947
|
-
|
|
3948
|
-
|
|
3949
|
-
|
|
3950
|
-
|
|
3945
|
+
const argsBuffer = new Array(args.length);
|
|
3946
|
+
const argGetters = [];
|
|
3947
|
+
const vectorizedIndices = [];
|
|
3948
|
+
for (let k = 0; k < args.length; k++) {
|
|
3949
|
+
const arg = args[k];
|
|
3950
|
+
switch (vectorArgsType?.[k]) {
|
|
3951
|
+
case "matrix":
|
|
3952
|
+
argGetters.push((i, j) => arg[i][j]);
|
|
3953
|
+
vectorizedIndices.push(k);
|
|
3954
|
+
break;
|
|
3955
|
+
case "horizontal":
|
|
3956
|
+
argGetters.push((i) => arg[i][0]);
|
|
3957
|
+
vectorizedIndices.push(k);
|
|
3958
|
+
break;
|
|
3959
|
+
case "vertical":
|
|
3960
|
+
argGetters.push((_i, j) => arg[0][j]);
|
|
3961
|
+
vectorizedIndices.push(k);
|
|
3962
|
+
break;
|
|
3963
|
+
case void 0:
|
|
3964
|
+
argsBuffer[k] = arg;
|
|
3965
|
+
break;
|
|
3951
3966
|
}
|
|
3952
|
-
}
|
|
3953
|
-
|
|
3954
|
-
|
|
3955
|
-
|
|
3956
|
-
|
|
3957
|
-
|
|
3967
|
+
}
|
|
3968
|
+
const nbVectorized = vectorizedIndices.length;
|
|
3969
|
+
let callFormula;
|
|
3970
|
+
switch (argsBuffer.length) {
|
|
3971
|
+
case 1:
|
|
3972
|
+
callFormula = () => formula(argsBuffer[0]);
|
|
3973
|
+
break;
|
|
3974
|
+
case 2:
|
|
3975
|
+
callFormula = () => formula(argsBuffer[0], argsBuffer[1]);
|
|
3976
|
+
break;
|
|
3977
|
+
case 3:
|
|
3978
|
+
callFormula = () => formula(argsBuffer[0], argsBuffer[1], argsBuffer[2]);
|
|
3979
|
+
break;
|
|
3980
|
+
default: callFormula = () => formula(...argsBuffer);
|
|
3981
|
+
}
|
|
3982
|
+
const result = new Array(countVectorizedCol);
|
|
3983
|
+
for (let col = 0; col < countVectorizedCol; col++) {
|
|
3984
|
+
const column = new Array(countVectorizedRow);
|
|
3985
|
+
result[col] = column;
|
|
3986
|
+
for (let row = 0; row < countVectorizedRow; row++) {
|
|
3987
|
+
if (col > vectorizedColLimit - 1 || row > vectorizedRowLimit - 1) {
|
|
3988
|
+
column[row] = new NotAvailableError(_t("Array arguments to [[FUNCTION_NAME]] are of different size."));
|
|
3989
|
+
continue;
|
|
3990
|
+
}
|
|
3991
|
+
for (let k = 0; k < nbVectorized; k++) argsBuffer[vectorizedIndices[k]] = argGetters[k](col, row);
|
|
3992
|
+
const singleCellComputeResult = callFormula();
|
|
3993
|
+
column[row] = isMatrix(singleCellComputeResult) ? singleCellComputeResult[0][0] : singleCellComputeResult;
|
|
3994
|
+
}
|
|
3995
|
+
}
|
|
3996
|
+
return result;
|
|
3958
3997
|
}
|
|
3959
3998
|
/**
|
|
3960
3999
|
* This function allows to visit arguments and stop the visit if necessary.
|
|
@@ -17391,7 +17430,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
17391
17430
|
case "ArrowLeft":
|
|
17392
17431
|
case "ArrowRight":
|
|
17393
17432
|
case "ArrowUp":
|
|
17394
|
-
const { col, row, offset } = this.postionInBoundary(this.props.figureUI, ev.key);
|
|
17433
|
+
const { col, row, offset } = this.postionInBoundary(this.env.model.getters.getActiveSheetId(), this.props.figureUI, ev.key);
|
|
17395
17434
|
this.env.model.dispatch("UPDATE_FIGURE", {
|
|
17396
17435
|
sheetId: this.env.model.getters.getActiveSheetId(),
|
|
17397
17436
|
figureId: this.props.figureUI.id,
|
|
@@ -17415,34 +17454,52 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
17415
17454
|
break;
|
|
17416
17455
|
}
|
|
17417
17456
|
}
|
|
17418
|
-
postionInBoundary(
|
|
17419
|
-
|
|
17420
|
-
let { col, row, offset } = position;
|
|
17457
|
+
postionInBoundary(sheetId, figure, key) {
|
|
17458
|
+
let { col, row, offset } = figure;
|
|
17421
17459
|
offset = { ...offset };
|
|
17460
|
+
const maxAnchor = this.env.model.getters.getMaxAnchorOffset(sheetId, figure.height, figure.width);
|
|
17422
17461
|
switch (key) {
|
|
17423
17462
|
case "ArrowUp":
|
|
17424
17463
|
if (offset.y === 0) {
|
|
17425
17464
|
row--;
|
|
17465
|
+
while (row > 0 && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row--;
|
|
17426
17466
|
offset.y = this.env.model.getters.getRowSize(sheetId, row) - 1;
|
|
17427
17467
|
} else offset.y--;
|
|
17428
17468
|
break;
|
|
17429
17469
|
case "ArrowLeft":
|
|
17430
17470
|
if (offset.x === 0) {
|
|
17431
17471
|
col--;
|
|
17472
|
+
while (col > 0 && this.env.model.getters.isColHiddenByUser(sheetId, col)) col--;
|
|
17432
17473
|
offset.x = this.env.model.getters.getColSize(sheetId, col) - 1;
|
|
17433
17474
|
} else offset.x--;
|
|
17434
17475
|
break;
|
|
17435
17476
|
case "ArrowDown":
|
|
17436
17477
|
if (offset.y === this.env.model.getters.getRowSize(sheetId, row)) {
|
|
17437
17478
|
row++;
|
|
17479
|
+
while (row <= maxAnchor.row && this.env.model.getters.isRowHiddenByUser(sheetId, row)) row++;
|
|
17438
17480
|
offset.y = 0;
|
|
17439
17481
|
} else offset.y++;
|
|
17440
17482
|
break;
|
|
17441
17483
|
case "ArrowRight": if (offset.x === this.env.model.getters.getColSize(sheetId, row)) {
|
|
17442
17484
|
col++;
|
|
17485
|
+
while (col <= maxAnchor.col && this.env.model.getters.isColHiddenByUser(sheetId, col)) col++;
|
|
17443
17486
|
offset.x = 0;
|
|
17444
17487
|
} else offset.x++;
|
|
17445
17488
|
}
|
|
17489
|
+
if (col < 0) {
|
|
17490
|
+
col = 0;
|
|
17491
|
+
offset.x = 0;
|
|
17492
|
+
} else if (col > maxAnchor.col || col === maxAnchor.col && offset.x > maxAnchor.offset.x) {
|
|
17493
|
+
col = maxAnchor.col;
|
|
17494
|
+
offset.x = maxAnchor.offset.x;
|
|
17495
|
+
}
|
|
17496
|
+
if (row < 0) {
|
|
17497
|
+
row = 0;
|
|
17498
|
+
offset.y = 0;
|
|
17499
|
+
} else if (row > maxAnchor.row || row === maxAnchor.row && offset.y > maxAnchor.offset.y) {
|
|
17500
|
+
row = maxAnchor.row;
|
|
17501
|
+
offset.y = maxAnchor.offset.y;
|
|
17502
|
+
}
|
|
17446
17503
|
return {
|
|
17447
17504
|
col,
|
|
17448
17505
|
row,
|
|
@@ -17713,12 +17770,15 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
17713
17770
|
//#endregion
|
|
17714
17771
|
//#region src/functions/create_compute_function.ts
|
|
17715
17772
|
function createComputeFunction(descr) {
|
|
17773
|
+
let currentArgDefinitions = [];
|
|
17716
17774
|
function vectorizedCompute(...args) {
|
|
17717
17775
|
const acceptToVectorize = [];
|
|
17776
|
+
currentArgDefinitions = new Array(args.length);
|
|
17718
17777
|
const getArgToFocus = argTargeting(descr, args.length);
|
|
17719
17778
|
for (let i = 0; i < args.length; i++) {
|
|
17720
17779
|
const argIndex = getArgToFocus(i).index ?? -1;
|
|
17721
17780
|
const argDefinition = descr.args[argIndex];
|
|
17781
|
+
currentArgDefinitions[i] = argDefinition;
|
|
17722
17782
|
const arg = args[i];
|
|
17723
17783
|
if (!isMatrix(arg) && argDefinition.acceptMatrixOnly) throw new BadExpressionError(_t("Function %s expects the parameter '%s' to be reference to a cell or range.", descr.name, (i + 1).toString()));
|
|
17724
17784
|
acceptToVectorize.push(!argDefinition.acceptMatrix);
|
|
@@ -17733,8 +17793,7 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
17733
17793
|
function errorHandlingCompute(...args) {
|
|
17734
17794
|
for (let i = 0; i < args.length; i++) {
|
|
17735
17795
|
const arg = args[i];
|
|
17736
|
-
|
|
17737
|
-
if (!descr.args[getArgToFocus(i).index ?? i].acceptErrors && !isMatrix(arg) && isEvaluationError(arg?.value)) return arg;
|
|
17796
|
+
if (!currentArgDefinitions[i].acceptErrors && !isMatrix(arg) && isEvaluationError(arg?.value)) return arg;
|
|
17738
17797
|
}
|
|
17739
17798
|
try {
|
|
17740
17799
|
return computeFunctionToObject.apply(this, args);
|
|
@@ -25784,6 +25843,9 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
25784
25843
|
});
|
|
25785
25844
|
}
|
|
25786
25845
|
}
|
|
25846
|
+
/** Formulas using one of these functions are never squished: they are always exported
|
|
25847
|
+
* as a full formula string, and they don't become the base formula of the next cells. */
|
|
25848
|
+
const NonSquishableFunctionRegistry = new Registry();
|
|
25787
25849
|
|
|
25788
25850
|
//#endregion
|
|
25789
25851
|
//#region src/types/xlsx.ts
|
|
@@ -50759,7 +50821,13 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
50759
50821
|
const cell = this.getters.getEvaluatedCell(position);
|
|
50760
50822
|
if (cell.link && !isFormula(content)) content = markdownLink(content, cell.link.url);
|
|
50761
50823
|
const currentFormat = this.getters.getCell(position)?.format;
|
|
50762
|
-
const
|
|
50824
|
+
const isCurrentFormatDate = currentFormat && isDateTimeFormat(currentFormat);
|
|
50825
|
+
const contentDateFormat = detectDateFormat(content, this.getters.getLocale());
|
|
50826
|
+
let afterFormat;
|
|
50827
|
+
if (currentFormat !== "@") {
|
|
50828
|
+
if (contentDateFormat && !isCurrentFormatDate) afterFormat = contentDateFormat;
|
|
50829
|
+
else if (isCurrentFormatDate && isNumber(content, this.getters.getLocale())) afterFormat = "";
|
|
50830
|
+
}
|
|
50763
50831
|
this.addHeadersForSpreadingFormula(content);
|
|
50764
50832
|
result = this.model.dispatch("UPDATE_CELL", {
|
|
50765
50833
|
...this.currentEditedCell,
|
|
@@ -55836,7 +55904,8 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
55836
55904
|
* The result of this method is:
|
|
55837
55905
|
* - if the cell is not a formula, returns the content as is and resets the base formula
|
|
55838
55906
|
* - if the cell is a formula:
|
|
55839
|
-
* - if there is no previous formula, or the normalized formula is different from the previous one
|
|
55907
|
+
* - if there is no previous formula, or the normalized formula is different from the previous one or it contains blacklisted functions (see NonSquishableFunctionRegistry),
|
|
55908
|
+
* resets the base formula to this one and returns the full formula string
|
|
55840
55909
|
* - else, compares the literal values and range dependencies to the previous formula, and for each parameter:
|
|
55841
55910
|
* - for numbers: returns a relative change (+N or -N) if possible, else the full number or "=" if unchanged
|
|
55842
55911
|
* - for strings: returns the full string if changed, else "="
|
|
@@ -55847,6 +55916,10 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
55847
55916
|
this.resetBase();
|
|
55848
55917
|
return cell.content;
|
|
55849
55918
|
}
|
|
55919
|
+
if (NonSquishableFunctionRegistry.getAll().some((functionName) => cell.compiledFormula.usesSymbol(functionName))) {
|
|
55920
|
+
this.resetBase();
|
|
55921
|
+
return cell.compiledFormula.toFormulaString(this.getters, this.rangeToStringOptions);
|
|
55922
|
+
}
|
|
55850
55923
|
let numbers = [];
|
|
55851
55924
|
let strings = [];
|
|
55852
55925
|
let references = [];
|
|
@@ -71432,6 +71505,10 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
71432
71505
|
}
|
|
71433
71506
|
function inverseCreateChart(cmd) {
|
|
71434
71507
|
return [{
|
|
71508
|
+
type: "DELETE_CHART",
|
|
71509
|
+
chartId: cmd.chartId,
|
|
71510
|
+
sheetId: cmd.sheetId
|
|
71511
|
+
}, {
|
|
71435
71512
|
type: "DELETE_FIGURE",
|
|
71436
71513
|
figureId: cmd.figureId,
|
|
71437
71514
|
sheetId: cmd.sheetId
|
|
@@ -81543,7 +81620,8 @@ stores.inject(MyMetaStore, storeInstance);
|
|
|
81543
81620
|
supportedPivotPositionalFormulaRegistry,
|
|
81544
81621
|
pivotToFunctionValueRegistry,
|
|
81545
81622
|
migrationStepRegistry,
|
|
81546
|
-
chartJsExtensionRegistry
|
|
81623
|
+
chartJsExtensionRegistry,
|
|
81624
|
+
NonSquishableFunctionRegistry
|
|
81547
81625
|
};
|
|
81548
81626
|
const helpers = {
|
|
81549
81627
|
arg,
|
|
@@ -81793,8 +81871,8 @@ exports.stores = stores;
|
|
|
81793
81871
|
exports.tokenColors = tokenColors;
|
|
81794
81872
|
exports.tokenize = tokenize;
|
|
81795
81873
|
|
|
81796
|
-
__info__.version = "19.2.
|
|
81797
|
-
__info__.date = "2026-
|
|
81798
|
-
__info__.hash = "
|
|
81874
|
+
__info__.version = "19.2.25";
|
|
81875
|
+
__info__.date = "2026-08-12T09:16:51.116Z";
|
|
81876
|
+
__info__.hash = "685ffda";
|
|
81799
81877
|
|
|
81800
81878
|
})(this.o_spreadsheet = this.o_spreadsheet || {}, owl);
|